4.9 多态
- 定义:某一类事物的多种存在形态。
-
概念:多态的概念 父类引用指向子类对象 而实际调用的方法为子类的方法。
-
例:动物中猫,狗。
- 猫这个对象对应的类型是猫类型
猫 x = new 猫(); - 同时猫也是动物中的一种,也可以把猫称为动物。
动物 y = new 猫();
动物是猫和狗具体事物中抽取出来的父类型。
父类型引用指向了子类对象。
体现:父类或者接口的引用指向或者接收自己的子类对象。
作用:多态的存在提高了程序的扩展性和后期可维护性
前提:
1.要有继承或者实现。
2.要有覆盖(重写)操作
多态的好处:
提高了代码的扩展性,前期定义的代码可以使用后期的内容(子类重写了父类的方法,调用子类的内容)。
多态的弊端:
前期定义的内容不能使用(调用)后期子类的特有内容(子类后来新添加的特性而父类原来没有的)。
4.9.1多态的特点
对于成员函数:
编译时:参考引用型变量所在的类中是否有调用的函数,有 编译通过, 没有 编译失败
运行时:参考对象所在的类中是否有调用的函数,有 运行成功,没有 运行失败
口诀:编译看左边,运行看右边
对于成员变量:
编译时:参考引用型变量所在的类中是否有调用的成员变量,有 编译通过, 没有 编译失败
运行时:参考引用型变量所在的类中是否有调用的成员变量,有 编译通过, 没有 编译失败
口诀:编译运行都看左边
5内部类
定义:一个类定义在另一个类的里面,在里面的类称为内部类(内置类,嵌套类)。
访问特点:
内部类可以直接访问外部类中的成员,包括私有成员。
而外部类要访问内部类中的成员必须要建立内部类的对象。
5.0.1内部类的位置:
内部类定义在成员位置上
可以被private static成员修饰符修饰。
被static修饰的内部类只能访问外部类中的静态成员。
内部类定义在局部位置上
也可以直接访问外部类中的成员。
同时可以访问所在局部中的局部变量,但必须是被final修饰的(jdk8的新特性已经解决,jdk7以下还是需要final修饰)
tip:因为(包含内部类的)方法出栈时,里面的成员变量会被释放,而此时有引用指向方法中的内部类对象时,对象还是存在堆中,但是要访问的变量会找不到,会出现错误,总得来说就是方法和对象的生命周期不同。
5.1匿名内部类
就是内部类的简化写法。
前提:
内部类可以继承或实现一个外部类或者接口。
格式为:
new 外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)}
//new 外部类名(){ 重写类的代码和自定义代码 };
abstract class Fu{
abstract void show();
}
class OutClass{
void method(){
new Fu(){
void show(){
System.out.println("匿名内部类");
}
};
}
}
简单理解:
就是建立一个建立一个带内容的外部类或者接口的子类匿名对象