(1)同一个事物在不同时刻表现出现的多种状态。
(2)前提A:有继承或者实现关系
B:有方法重写,因为抽象类中的抽象方法以及接口中的方法都必须被子类重写,调用才有意义。
C:有父类或者父接口引用指向子类对象
(3)多态中的成员访问特点Animao a = new dog(); //编译看左边,运行看左边
A:成员变量 B:成员方法 C:静态方法
(4)好处和弊端A:好处:维护性和扩展性好
B:弊端:不能访问子类特有功能,如 Animao a = new dog(); 创建的对象a只能看到Animao类中的变量方法以及静态方法,是看不到dog类中的 变量和方法的。
(5)如何访问子类特有功能
A:创建子类对象 如: dog d = new dog();
B:向下转型:Animao a = new dog(); (dog) a 实现向下转型
(6)多态中的转型
A:向上转型:子到父
B:向下转型:父到子(加强制转换)
2:抽象类
(1)抽象类的特点:
A:抽象类或者抽象方法必须用abstract修饰
B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
C:抽象类不能实例化,可以按照多态的方式实例化。
D:抽象类的子类
a:要么是抽象类
b:要么重写抽象类中的所有抽象方法
(2)抽象类的成员特点:
A:成员变量
可以是变量,也可以是常量
B:可以有构造方法
不能实例化,有构造方法意义:用于子类访问父类数据的初始化。
C:成员方法
可以是抽象的,也可以是非抽象的
(3)两个小问题
A:如果你看到一个抽象类中居然没有抽象方法,这个抽象类的意义何在? 不让别人创建
B:abstract不能和哪些关键字共存?
a:private 冲突 b:final 冲突 c:static 无意义
3:接口
(1)通常使用接口来扩展功能。
(2)接口的特点:
A:定义接口用关键字interface
格式是:interface 接口名 {}
B:类实现接口用关键字implements
格式是:class 类名 implements 接口名 {}
C:接口不能实例化
D:接口的子类
a:要么是抽象类
b:要么重写接口中的所有方法
(3)接口的成员特点
A:成员变量
只能是常量。
默认修饰符:public static final
B:成员方法
只能是抽象方法。
默认修饰符:public abstract
(4)类与接口的关系
A:类与类
继承关系,只能单继承,可以多层继承。
B:类与接口
实现关系,可以单实现,也可以多实现。
还可以在继承一个类的同时实现多个接口。
C:接口与接口
继承关系,可以单继承,也可以多继承。
(5)抽象类和接口的区别?
A:成员区别
抽象类:
成员变量:可以是变量,也可以是常量
构造方法:有
成员方法:可以是抽象的,也可以是非抽象的
接口:
成员变量:只能是常量。默认修饰符:public static final
成员方法:只能是抽象的. 默认修饰符:public abstract
B:关系区别
类与类:继承关系,只能单继承。可以多层继承。
类与接口:实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口。
接口与接口:继承关系,可以单继承,也可以多继承。
C:设计理念区别
抽象类:被继承体现的是:”is a”的关系。在抽象类中定义的一般是共性功能
接口:被实现体现的是:”like a”的关系。在接口中定义的一般是扩展功能
接口是常量值和方法定义的集合。接口是一种特殊的抽象类。
java类是单继承的。classB Extends classA
java接口可以多继承。Interface3 Extends Interface0, Interface1, interface……
不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢?
但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。
注意:
1)一个类如果实现了一个接口,则要实现该接口的所有方法。
2)方法的名字、返回类型、参数必须与接口中完全一致。如果方法的返回类型不是void,则方法体必须至少有一条return语句。
3)因为接口的方法默认是public类型的,所以在实现的时候一定要用public来修饰(否则默认为protected类型,缩小了方法的使用范围)。