标签:无法 cat 特点 代码 变量 xtend eth dem new
1.抽象abstract类的特点:
a.抽象类或抽象方法必须用abstract关键字修饰
b.抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
c.抽象类不能被实例化,因为它不是具体的,抽象类有构造方法,但是不能实例化,抽象类的构造方法是提供给抽象类的子类访问父类数据初始化
2.抽象类的子类:
a.若子类是抽象类,与上一致
b.若子类不是抽象类,是具体类,就要(强制)重写父类中的抽象方法,即抽象类的实例化是依靠具体的子类来实现的
3.抽象类的成员特点:
a.成员变量:可以是变量,也可以是常量
b.构造方法:有,带不带参的构造方法都可以有
c.成员方法:既可以是抽象方法,也可以是非抽象的
抽象类的成员方法如果是抽象方法,则不允许该抽象方法有方法体,表示需要子类来继承,强制子类来做的事
抽象类的成员方法如果是非抽象方法,则表示子类继承的事情,提高代码的复用性
4.关于abstract的几个非法修饰符:
final/private+abstract:很明显abstract类是需要被继承来实现功能的,private修饰子类继承不到,final修饰无法被继承
static+abstract:无意义,用abstract修饰的方法没有方法体,用static修饰的静态方法可以通过类名.的方式直接调用,而调用一个没有方法体的方法没有意义
5.代码演示:
abstract class Animal{ public int num=10; public final double PI=3.14; public Animal(){ System.out.println("抽象父类的构造方法"); } public Animal(int num){this.num=num;} public abstract void show(); public int getNum(){ return num; } public void setNum(int num){ this.num=num; } public void method(){ System.out.println("我是抽象类中的普通方法,可以有方法体"); } } class Dog extends Animal{ int num=20; public Dog(){ System.out.println("dog子类的构造方法"); } public void show(){ System.out.println("我是普通类,继承了抽象类,所以一定要重写抽象父类的抽象方法,因为抽象父类中的抽象方法表示要强制子类做的事"); } public void bark(){ System.out.println("我是动物,也是狗,我可以看门,会吠"); } public void method(){ System.out.println("可以重写抽象父类中的方法"); } } abstract class Cat extends Animal{ public void show(){ System.out.println("我们一起喵喵喵"); } } class AbstractDemo { public static void main(String[] args) { //Animal a=new Cat();报错,因为Cat类也是抽象类,也是不允许这样实例化的 Animal a=new Dog(); a.method(); a.show(); //a.bark();多态的弊端,可以通过向下转型 Dog d= (Dog) a; d.bark(); //Cat c= (Cat) a; //c.method(); //c.show(); } }
标签:无法 cat 特点 代码 变量 xtend eth dem new
原文地址:https://www.cnblogs.com/sumilemei/p/13359890.html