(1)多态
(2)抽象类
(3)接口
(4)内部类
1.多态(重中之重)
1.1 基本概念
多态主要指同一种事物表现出来的多种形态。
1.2 语法格式
父类类型 引用变量名 = new 子类类型();
如:
Shape s1 = new Rect();
s1.show();
1.3 多态的效果
(1)父类的引用指向子类的对象时,父类的引用可以直接访问父类的成员方法;
(2)父类的引用指向子类的对象时,父类的引用不可以直接访问子类的成员方法;
(3)对于父子类都有的非静态方法来说,编译阶段调用父类的,运行阶段调用子类的;
(4)对于父子类都有的静态方法来说,编译和运行都调用父类的版本;
1.4 引用数据类型之间的转换
(1)引用数据类型之间的转换分为两种:自动类型转换 和 强制类型转换。
其中自动类型转换主要指从小到大的转换,也就是子类到父类的转换;
其中强制类型转换主要指从大到小的转换,也就是父类到子类的转换;
(2)引用数据类型之间的转换必须发生在父子类之间,否则编译报错;
(3)当目标类型并不是该引用真正指向的数据类型时,则编译通过运行阶段发生类型转换异常
(4)为了避免上述错误的发生,每次强转之前应该使用instanceof进行判断,具体如下:
if(引用变量名 instanceof 目标类型){}
- 若引用变量名指向的对象是目标类型则返回true,否则返回false。
1.5 多态的实际意义
多态的实际意义在于可以屏蔽不同子类的差异性实现通用的编程带来不同的效果。
2.抽象类(重点)
2.1 抽象方法的概念
抽象方法就是指不能具体实现的方法,体现为该方法没有方法体并使用abstract关键字修饰
语法格式如下:
访问控制符 abstract 返回值类型 方法名称(形参列表);
如:
public abstract void cry();
2.2 抽象类的概念
抽象类就是指不能实例化对象的类,并使用abstract关键字修饰。
2.3 注意事项
(1)抽象类中可以有成员变量、成员方法以及构造方法。
(2)抽象类中可以有也可以没有抽象方法。
(3)拥有抽象方法的类必须是抽象类,因此严格来说具有抽象方法并且使用abstract
关键字修饰的类才算真正意义上的抽象类。
2.4 实际意义
抽象类的实际意义不在于创建对象而在于被继承,当一个类继承抽象类之后必须重写抽象方法,否则该类也得变成抽象类。
因此抽象类对子类具有强制性和规范性,通常叫做模板设计模式。
经验分享:
在以后的开发中推荐使用多态的语法格式,因为父类引用直接调用的所有方法一定是父类拥有的方法,当需要更换子类时只需要将new关键字后面的子类类型更换而其它位置不用改变就立刻生效,从而提高了代码的可维护性。
该方式的缺点:父类引用若访问子类独有的方法,则需要强制类型转换。
3.接口(重点)
3.1 基本概念
接口本质上就是一种比抽象类还抽象的类,因此不能实例化对象。
定义类的关键字是class,而定义接口的关键字是interface。
如:
货币接口 金属接口 黄金类
3.2 类和接口之间的关系
类和类之间采用继承关系 使用extends关键字 支持单继承
类和接口之间采用实现关系 使用implements关键字 支持多实现
接口和接口之间采用继承关系 使用extends关键字 支持多继承
3.3 接口和抽象类之间的区别
(1)定义抽象类的关键字是abstract和class,而定义接口使用interface;
(2)继承抽象类采用extends关键字,而实现接口采用implements关键字;
(3)继承抽象类只能单继承,而实现接口可以多实现;
(4)抽象类中可以有构造方法,而接口中不可以有;
(5)抽象类中可以有成员变量,而接口中只可以有常量;
(6)抽象类中可以有成员方法,而接口中只可以有抽象方法;
(7)抽象类中增加方法可以不影响子类,而接口中增加方法会影响子类;
(8)从jdk1.8开始允许接口中有非抽象方法,但需要使用default关键字修饰;
4.内部类(了解)
4.1 基本概念
当一个类的定义出现在另外一个类的类体中时,那么这个类就叫做内部类,而这个类所在的类叫做外部类。
类体中的内容:成员变量、成员方法、构造方法、静态成员、构造块和静态代码块、内部类
4.2 语法格式
class 外部类的类名{
class 内部类的类名{
内部类的类体;
}
}
4.3 基本作用
当一个类存在的价值仅仅是为某一个类单独服务时,那么就可以将这个类定义为所服务类的内部类,此时内部类可以直接访问所在类的私有成员而不再需要公有的get和set方法。
4.4 基本分类
普通内部类 - 将一个类的定义直接放在另外一个类的类体中。
静态内部类 - 使用static关键字修饰的内部类。
- 只有内部类才可以使用static关键字修饰。
局部内部类 - 将一个类的定义直接放在一个方法体的内部。
- 该类的有效范围是从定义开始一直到方法体结束。
匿名内部类 - 主要指没有名字的内部类。
4.5 匿名内部类(重点、难点)
(1)语法格式
接口/父类类型 引用变量名 = new 接口/父类类型(){ 方法的重写 };
(2)经验分享
当接口类型的引用作为方法的形参时,实参的传递方式有两种:
a.自定义类实现接口并重写抽象方法,然后创建实现类的对象作为实参传递;
b.使用匿名内部类的语法格式得到接口的引用作为实参传递;