Day6:面向对象------多态
1、多态
多态: 某一事物的多种体现形态。 重点是对象的多态性。 class 动物 {} class 猫 extends 动物 {} //猫 x = new 猫(); 动物 x = new 猫();多态。 多态在程序中的体现:父类或者接口的引用指向了自己的子类对象。 多态的好处:提高了代码的扩展性,后期出现的功能,可以被之前的程序所执行。 多态的弊端:虽然可以使用后期出现的代码,但是不能使用子类特有的功能。只能使用覆盖了父类的功能。 多态的前提:必须要有关系(继承,实现),通常会有覆盖操作。
向下转型前,必须对具体对象进行类型的判断。判断的关键字的 instanceof为了避免运行时出现ClassCastException
(向下转型。什么时候用?当需要使用子类型的特有方法时。)
多态的调用方式在子父类中的特殊体现。
1,成员变量。
多态调用的时,编译和运行都参考引用型变量所属的类中的成员变量。
编译和运行看等号的左边。
2,成员函数。
多态调用时,编译参考的是引用型变量所属的类,运行时参考的是对象所属类。
编译看左边,运行看右边。因为函数有一个覆盖的特性。
3,静态函数。
多态调用时,编译和运行都参考引用型变量所属的类中的静态函数。
编译和运行看等号的左边。
成员变量和静态函数,看左边。
只有非静态函数,编译看左边,运行看右边;
2、内部类
内部类:定义在类中的类,称为内部类。 好处是可以直接访问外部类中的成员。 外部类要访问内部类需要创建内部类的对象。 内部类直接访问外部类的原理:因为内部类持有了外部类的引用。外部类名.this
/*内部类可以定义在局部*/ void method() { final int x = 5;//内部类在局部时,只能访问被final修饰的局部常量。非final的不行,因为生命周期不同 class Inner extends Demo { void show() { System.out.println("x="+x); System.out.println(num); } } d = new Inner(); }
匿名内部类:就是内部类的简化格式。 内部类必须继承一个类或者实现接口,这种情况下的内部类可以简化成匿名内部类 格式:new 父类或者接口(){定义子类的内容} 其实匿名内部类就是一个子类对象。