------- 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对象。代码如下:
补全代码后运行结果如下: