JavaSE笔记(四)

七 多态

 

定义:某一类事物的多种存在形式。它是面向对象程序设计(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();

 

应用场景:当函数参数是接口类型时,而且接口中的方法不超过三个,可以使用匿名内部类作为实际参数传递。

 

注意匿名内部类的多态。如果匿名内部类中定义的是特有内容,父类引用不能调用(联系多态规则)。

转载于:https://my.oschina.net/ByIjNn/blog/700647

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值