七 多态
定义:某一类事物的多种存在形式。它是面向对象程序设计(OOP)的一个重要特征。在面向对象语言中,接口的多种不同的实现方式即为多态。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。允许将子类类型的指针赋值给父类类型的指针。
例子:动物中的猫、狗。
猫 x= new 猫();猫对应猫类型,但同时猫也是动物中的一员。可描述为
动物 y= new猫();动物是猫、狗是具体事物抽象出来的父类型,那么父类型的引用可以执行子类对象。
多态的好处:提高了代码的扩展性。
多态的短处:多态只能在调用在父类中定义的共同的内容时使用,不能调用子类的特有内容时使用,因为子类的特有内容,父类引用不到。
使用多态的条件:1 必须具有关系,继承或实现。 2 要有覆盖
在实现多态的过程中子类自动提升为父类类型,向上转型。正因如此限制了父类引用对子类特有内容的访问,提高了扩展性。若想访问子类特有内容,将父类引用强转为子类即可(向下转型)。
注意:强转的规律,转换的类型之间必须具有某一特定联系。强制之前可以通过“instance of”(实例化)来进行判断是否可以强制转换 语法 x instance of Y
X为类型的引用,Y为类。通常在向下转型时使用,加强代码健壮性。
多态时的成员特点:
成员变量:用谁的引用就访问谁!多态时,父类引用指向子类引用,如果子类有和父类相同的成员变量,引用时还是引用用父类成员变量。因为子类已经向上转型为父类。
成员函数:如果子类覆盖了父类的方法,那么在多态时,父类引用调用该函数时是指向子类函数的。如果不是覆盖的函数则报错(父类引用不能访问子类特有)
静态函数:父类静态函数即使被子类覆盖了,多态引用时是用父类的静态函数。
因为静态优先与类存在,不在依赖与对象,故用谁的引用就访问谁!并且静态函数一般不用多态,直接用类名调用。
八 内部类
定义:将一个类定义在另一个类里,里面的类就叫内部类。
内部类一般用于类的设计;分析事物时发现事物中还有事物,而且这个事物还在访问被描述事物的内容。
为何要内部类?
a、内部类提供了某种进入外围类的窗户。
b、也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外围类是否已经继承了某个接口。 因此,内部类使多重继承的解决方案变得更加完整。
访问特点:内部类可以直接访问外部类中的所有成员,不需任何特殊条件。外部类要访问内部类则需要创建内部类对象。
内部类编译时生成的class文件名 Xxx$Yyy.class Xxx为外部类Yyy为内部类 $表示所属关系。
通过外部类创建内部类对象的格式: Outer.Inner iner = new Outer(). new Inner();
如果内部类为静态的,那么不需要在new Outer() 。
this在内部类和外部类中的区分:若在内部类中引用外部类的同名属性,Outer.this.xxx 内部类中this.xxx指向内部类成员。
内部类可以在存放在局部中,即在方法中创建。方法内创建的类,不能加访问修饰符。并且如果内部类中访问了局部变量,那么该变量需声明为final
匿名内部类:参考前面提到的匿名对象,匿名内部类也是内部类的简写格式。
前提:内部类必须继承或实现一个外部类或接口。匿名内部类其实就是匿名子类对象。匿名内部类是子类对象!匿名内部类是子类对象!匿名内部类是子类对象!
格式: new 父类(){
复写父类方法;子类内容...
}.xxx();
应用场景:当函数参数是接口类型时,而且接口中的方法不超过三个,可以使用匿名内部类作为实际参数传递。
注意匿名内部类的多态。如果匿名内部类中定义的是特有内容,父类引用不能调用(联系多态规则)。