作为面向对象的最重要的概念,封装、继承和多态一直是面试Java时的热门话题,准确理解三大特征是非常重要的,这篇文章对该三大特性有较为详细的介绍。
封装
封装性在Java当中的体现:
- 方法就是一种封装
- 关键字 private 是一种封装
封装就是将一些细节信息隐藏起来,对于外界不可见。
继承
继承是多态的前提,如果没有继承,就没有多态。
继承关系当中的特点:
- 子类可以拥有父类的“内容”
- 子类还可以拥有自己专有的内容。
在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
- 通过子类对象访间成员变量:
等号【左边】是谁,就优先用谁,没有则向上找。 - 间接通过成员方法访间成员变量:
该方法【属于谁】,就优先用谁,没有则向上找。
区分子类方法中重名的三大变量:
局部变量(定义在方法中的变量):直接写成员变量名
本类的成员变量:this
.成员变量名
父类的成员变量:super
.成员变量名
在父子类的继承关系当中,创建子类对象,访问成员方法的规则:
创建的对象是谁,就优先用谁,如果没有则向上找。
注意事项:
无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类。
继承关系中,父子类构造方法的访问特点:
-
子类构造方法当中有一个默认隐含的
super()
调用,所以一定是先调用的父类构造,后执行的子类构造。 -
子类构造可以通过
super
关键字来调用父类重载构造。 -
super
的父类构造调用,必须是子类构造方法的第一个语句。不能一个子类构造调用多次super
构造。 -
只有子类构造方法才能调用父类的构造方法。
总结:
子类必须调用父类构造方法,不写则赠送 super()
;写了则用写的指定的 super
调用, super
只能有一个,还必须是第一个。
- Java语言是单继承的,一个类的直接父类只能有唯一一个。
原因:多个父类的同名方法会产生歧义 - Java语言可以多级继承。
- 一个类的直接父类是唯一的,但是一个父类可以拥有很多个子类。
多态
一个对象拥有多种形态,这就是对象的多态性。
代码当中体现多态性,其实就是一句话:父类引用指向子类对象。
格式:
父类名称 对象名 = new 子类名称();
// 或者:
接口名称 对象名 = new 实现类名称();
多态中成员变量的使用特点:
访问成员变量的两种方式:
- 直接通过对象名称访问成员变量:看等号【左边】是谁,优先用谁,没有则向上找。
- 间接通过成员方法访问成员变量:看该方法【属于谁】优先用谁,没有则向上找。
口诀: 编译看左边,运行看左边。
多态中成员方法的使用特点:
在多态的代码中,成员方法的访问规则是:
看new的是谁,就优先用谁,没有则向上找。
口诀: 编译看左边,运行看右边。
public class Demo() {
// 父类
public class Fu {
public void method() {
System.out.println("父类方法");
}
public void methodFu() {
System.out.println("父类特有方法");
}
}
// 子类
public class Zi extends Fu {
public void method() {
System.out.println("子类方法");
}
public void methodZi() {
System.out.println("子类特有方法");
}
}
public static void main(String[] args){
Fu obj = new Zi(); // 多态
obj.method(); // 父子都有,优先用子,输出子类方法
obj.methodFu(); // 子类无,父类有,向上找父类,输出父类特有方法
// obj.methodZi(); // 编译出错,因为编译的时候看左边,左边是父类,而父类中没有methodZi方法
}
}
使用多态的好处:
无论右边new的时候换成哪个子类对象,左边调用的格式都不会变化。