黑马程序员——java复习总结——多态和内部类

------- android培训java培训、期待与您交流! ----------

一、多态

 

1.1      多态的定义

 

对于多态,可以理解为某一类事物的多种表现形态。

 

1.2      多态的体现

父类的引用,指向了自己的子类对象,这就是多态的代码体现形式。

多态的代码体现:

1.3      多态的前提

必须是类与类之间有关系,要么继承,要么实现,通常还有一个前提,存在覆盖。


1.4      多态的好处
 

多态的出现大大的提高了程序的扩展性

 

1.5      多态的弊端

提高了扩展性,但是只能使用父类的引用访问父类中的成员。

 

1.6      多态的应用

在多态中,

Animal a = new Car();

 

其实有着隐式的类型提升,即向上转型。如果想要使用子类的特有方法时,可以将父类的引用,强制转换成子类类型。即向下转型。如下:

Cat c = (Cat) a;

 

但是不能将父类转成子类,只能转换父类引用指向子类对象时,才可以转换。其实,多态自始至终都是子类对象在做变化。

 

多态中子父类成员的特点:

如下代码:

问题1:


其中,因为父类中没有method_3方法,所以会编译失败。

而对于另外两个方法:

f.method_1():是运行的子类方法。

f.method_2():是运行的父类的方法。

结论:

在编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败。

在运行时期,参阅对象所属的类中是否有调用的方法。

简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

 

问题2:


运行结果:


结论:

在多态中成员变量的特点:

无论编译和运行时都参考左边(引用型变量所属的类)。

 

问题3:


运行结果:


结论:

在多态中,静态成员函数的特点,无论编译和运行,都参考左边。

 

二、Object类

 

2.1 Object的定义

Object是所有继承体系直接或间接的父类。该类中定义了所有对象都具备的功能。

 

2.2 Object的方法

 

equals():它的比较是比较两对象的地址值。如果子类对象想定义自己的比较方式,直接复写这个equals方法即可。

 

toString():返回该对象的字符串表示。

Object的toString方法其实是调用的getClass().getName()+”@”+hashCode()方法得到的。

当然,如果想要子类自己的toString方法,覆盖父类的方法即可。

 

三、内部类

 

3.1  内部类的定义:

将一个类定义在另外一个类的里面,对于里面那个类就称为内部类。内部类可以直接访问外部类中的成员,包括私有成员,而外部类要访问内部类中的成员必须建立内部类的对象。

 

如下,就是一个内部类的例子:

 

一个类中可以定义多个内部类。

 

直接访问内部类的成员方法:

Outer.Inner in = new Outer().new Inner();

必须写内部类的全名称,但是因为内部类写在成员位置上,所以可以被私有修饰,一般不能被外部类建立对象。

 

3.2  内部类的访问规则

1、内部类可以自己访问外部类的成员,包括私有,之所以可以自己访问外部类的成员,是因为内部类中持有了一个外部类的引用,格式:外部类名.this。

 

2、外部类要访问内部类,必须建立内部类的对象。

 

访问格式:

 

1、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。

格式:

外部类名.内部类名变量名 = 外部类对象.内部类对象。

Outer.Inner in = new Outer().new Inner();

 

2、当内部类在成员位置上,就可以被成员修饰符所修饰,比如:

private,将内部类在外部类中进行封装。

static,内部类就具备了静态的特性。当内部类被静态修饰后,就不能引用非静态成员,只能访问外部类中的静态成员,出现了访问局限。

 

在外部其他内访问静态内部类。

new Outer.Inner().function();

这是应为内部类是静态的,所以可以直接通过类名Outer调用,然而成员函数function是非静态的,所以还是需要new一个内部类对象,来调用成员函数。

如果函数也是静态的,那么少可以这样调用:

Outer.Inner.function();

 

注意:当内部类中定义了静态成员时,该内部类必须静态。

当外部类的静态方法访问内部类时,内部类也必须是静态的。

 

3.3内部类的使用原则

当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物使用外部事物的内容,并且可以通过private封装,并且提供访问方式。

 

3.4 局部内部类

定义在方法中的内部类,是局部内部类。

1、不可以被成员修饰符修饰。

2、局部内部类可以直接访问外部类中的成员变量,但是不能直接访问局部中的变量,如果要访问局部的变量,该变量必须要被final修饰。

 

3.5  匿名内部类

 

1、  匿名内部类其实就是内部类的简写格式

2、  定义匿名内部类的前提,就是内部类必须继承一个类或者接口。

3、  匿名内部类的格式:new 父类或者接口(){定义子类的内容}

4、  其实匿名内部类就是一个匿名的子类对象而且这个对象有点胖,可以理解为带内容的对象。

5、  匿名内部类的方法最好不超过三个。

 

 

匿名内部类的小练习:

interface Inter

{

void method();

}

 

class Test

{

 

}

 

class InnerClassTest

{

         Test.function().method();

}

 

思路:

通过Test.funtion();可以看出,通过类名Test调用了function方法,由此可知function是静态方法,而它后面跟了一个Inter对象的方法,可知这个方法返回的是一个Inter对象。代码如下:

 

补全代码后运行结果如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值