/*概念
* abstract:关键字,用于修饰方法和类
* 抽象方法:不同类的方法是相似,但是具体内容又不太一样,所以我们只能抽取他的声明,没有具体的方法体,没有具体方法体的方法就是抽象方法
* 抽象类:有抽象方法的类必须是抽象类
*
* 注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类
*/
* 抽象类的特点:
*抽象方法只能在抽象类里面
* 抽象类和抽象方法必须被abstract修饰
* 抽象类不能创建对象(不能实例化)
* 抽象类中可以有非抽象的方法
* 抽象类和类的关系也是继承
* 一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类
* 抽象类的成员特点:
* 成员变量
* 可以有成员变量
* 可以有常量
* 成员方法
* 可以有抽象方法
* 可以有非抽象方法
* 构造方法
* 可以有构造方法的,需要对抽象类的成员变量进行初始化
*
* final:修饰类、成员变量、成员方法
*/
public class AbstractDemo { public static void main(String[] args) { //抽象类不能创建对象(不能实例化) // Animal a = new Animal(); Cat c = new Cat(); c.eat(); } } abstract class Animal { //方法使用抽象方法后,类需要改为抽象类 //猫吃鱼,狗吃草。都有eat方法,但是吃的东西不一样,这时需要使用抽象方法 abstract public void eat(); // public void eat() { // System.out.println("吃。。。"); // }; } class Cat extends Animal { //继承了抽象类后方法和父类不同会报错,方法必须重新 // public void eat(String name) { // System.out.println("猫吃鱼"); // } @Override public void eat() { System.out.println("猫吃鱼"); } } abstract class Dog extends Animal{ //要么重新方法,要么类需要改为抽象类 public void eat(String name) { System.out.println("狗吃草"); } }
输出
package day2_抽象类; /* * 抽象类的成员特点: * 成员变量 * 可以有成员变量 * 可以有常量 * 成员方法 * 可以有抽象方法 * 可以有非抽象方法 * 构造方法 * 可以有构造方法的,需要对抽象类的成员变量进行初始化 * * final:修饰类、成员变量、成员方法 */ public class AbstractDmoe2 { public static void main(String[] args) { Dog2 d = new Dog2(); d.brking(); d.eat(); } } abstract class Animal2 { String name = "哮天犬"; final int num = 10; //final 修饰的变量是固定值,不可改变。 public Animal2() { //抽象类可以有构造方法,因为需要对成员变量初始化。 System.out.println("抽象类的无参构造"); } public Animal2(String name) { System.out.println("抽象类有参构造"); } public abstract void eat(); } class Dog2 extends Animal2 { @Override public void eat() { } public void brking() {//叫 System.out.println(name + "," + num); } }
输出
思考:能否在brking方法第一行加super或this?
不能,super或this是在构造方法中调用的