- 多态:同一个对象在不同时刻体现出来的不同状态。
· (1) 实现多态:有继承或者实现关系;有方法重写;有父类或者父接口引用指向子类对象。
(2)多态的分类:
a:具体类多态
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
b:抽象类多态
abstract class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
c:接口多态
interface Fu {}
class Zi implements Fu {}
Fu f = new Zi();
(3)多态中的成员访问特点
A:成员变量
编译看左边,运行看左边
B:构造方法
子类的构造都会默认访问父类构造,对父类的数据进行初始化
C:成员方法
编译看左边,运行看右边;因为成员方法有重写,所以看右边
D:静态方法
编译看左边,运行看左边,静态和类相关,算不上重写,所以还是看父类
成员变量是外部特征所以在堆内存中访问super,成员方法是内部功能,所以访问堆内存的this
(4)多态中的转型
A:向上转型
Fu f=new Zi();
从子到父
B:向下转型(把父类的引用强制转换为子类的引用 Zi z=(Zi) f)
从父到子
容易出现的一个错误叫ClassCaseException类转换异常
- final:修饰局部变量是普通变量是是就相当于一个常量,无法在重新赋值改变,重新赋值就会报错,也就是只能赋值一次;
当修饰局部变量引用类型时,其地址值不能变,也就是栈内存地址,但对象堆内存的值可以改变
final修饰的类不能被调用,修饰的方法不能被重写
- 抽象类
(1)把多个共性的东西提取到一个类中,这是继承的做法。
但是呢,这多个共性的东西,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样。
所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体。
而一个没有具体的方法体的方法是抽象的方法。
在一个类中如果有抽象方法,该类必须定义为抽象类。
(2)抽象类的特点
A:抽象类和抽象方法必须用关键字abstract修饰
B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
C:抽象类不能实例化,也就是不能创建对象,因为它不是具体的;可以通过多态的方式进行子类实例化
D:抽象类的子类
a:是一个抽象类。
b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
(3)抽象类的成员特点:
A:成员变量
有变量,有常量
B:构造方法
有构造方法。作用是用于子类访问父类数据的初始化
C:成员方法
有抽象:强制要求子类做的事,也就是要重写
有非抽象:子类继承的事
(4)abstract
与final 冲突
与private 冲突
与static 无意义
- 接口
(1)就比如电脑的usb接口,是在usb接口中插入额外的东西,表示额外的功能。
(2)接口表现形式
interface 接口名 {}
a:类实现接口用implements修饰
class 类名 implements 接口名 {}
b:接口不能实例化
c::接口的实现类 (实现类一最好是接口名+Impl)
a:是一个抽象类。
b:是一个具体类,这个类必须重写接口中的所有抽象方法。
(3)接口的成员特点:
A:成员变量
只能是常量,变量也被默认为常量
默认修饰符:public static final
B:构造方法
没有构造方法
C:成员方法
只能是抽象的即不能带主体
默认修饰符:public abstrac
- 抽象类和接口的区别
A:成员区别
抽象类:变量、常量,构造方法,抽象成员方法,非抽象成员方法
接口:只可以是常量,只可以是抽象方法
B:关系区别:
a:类与类:继承关系,只能单继承,可以多层继承
b:类与接口:实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时,实现多个接口
c:接口与接口: 继承关系,可以单继承,也可以多继承
C:设计理念不同
抽象类:is a,抽象类中定义的是该继承体系的共性功能。
接口:like a,接口中定义的是扩展功能