总结了一些继承相关的知识,没啥新知识点,供复习用。
先上关键字:extends
Java面向对象四大特性:封装/继承/多态/抽象,继承是其中之一。
简单来说,继承就是以已有的类为基础建立新的类,在新的类中可以增加新的属性或新的方法,这使代码的复用变得十分简单。
单继承
Java中的继承与C++相似,它们最大的区别在于C++中允许多继承,而Java中只允许单继承(但可以实现多个接口)。
多继承
不常用,并且会
使整个对象体系结构变得复杂,产生歧义,甚至影响多态的灵活性(
比如一个相同的方法同时存在于两个父类中)。
Java中去掉这一特性,降低了复杂性和混乱程度。
但这并不代表Java中无法达到多继承的效果,我们可以通过实现接口(implements)/内部类(inner class)等方式实现“多继承”。
访问修饰符
此外,Java中的访问修饰符的使用也与C++不尽相同。
以下是根据访问权限大小画的表格:
|
当前类
|
当前包
|
子类
|
外部包
|
public
|
✓
|
✓
|
✓
|
✓
|
protected
|
✓
|
✓
|
✓
|
☐
|
default (不写)
|
✓
|
✓
|
☐
|
☐
|
private
|
✓
|
☐
|
☐
|
☐
|
相关关键字
final
- 用来修饰属性:值不能被改变
- 用来修饰方法:不能被重写(可以被继承)
super
- 在子类构造函数中super();表示调用父类的构造方法(必须写在构造函数第一行)
- 使用super.method();可调用父类中被子类重写的方法
this
- 表示当前类
强制类型转换
继承中经常会用到强制类型转换,在进行强转时,由于我们不是所有时候都清楚一个父类的引用实际上是哪一个子类的实例化,所以此时使用以下方法可避免转换失败:
// 若p1是学生类,可进入if语句正常转换
Person p1 = new Student();
// 若p1是老师类,不能进入if语句
//Person p1 = new Teacher();//p1
if (p1 instanceof Student) {
Student s1 = (Student) p1;
}
在内存中的位置
栈(容量小/速度快)
存放对象的声明
|
堆(容量大/速度慢)
存放对象的实例化
|
Student s
Teacher t
|
new Student()
new Teacher()
|
函数参数的传递
- 值传递:
基础数据类型 (boolean, char, byte, short, int, long, float, double)
- 引用传递:
复杂数据类型 (引用型数据类型):各种封装类
Tips: 基础数据类型分别有其对应的封装类