OOP(面向对象)语言的 三大特性为:封装、继承、多态。
此文章将介绍关于继承的内容。
创建三个类
从上述三个类中的红色圈出部分发现,代码的重复性比较高*
在实际写代码的过程中,代码的可重用性比较低,接下来就介入了继承的操作
extends 继承
public class Animal {
public String name;
public void eat(){
System.out.println(this.name + "吃饭!");
}
}
public class Dog extends Animal {
public String name;
public void eat(){
System.out.println(this.name + "吃饭!");
}
}
上述代码块中,Dog 为子类,也叫做派生类,Animal为父类,也叫做基类或者超类,extends 代表继承关系,Dog 继承了 Animal
作用:为了代码的可重用性(重复使用)
示例:当把Dog类里面的部分代码屏蔽掉以后↓
main方法中可以正常书写 Dog 被屏蔽掉以后的代码↓
并且可以正常运行↓
因为 Dog 继承了Animal ,所以 eat() 和 name 都被继承过来
这样就可以吧一些公共的属性或者方法放在父类当中
注意事项
- 当Bird 想要继承 Animal 和 Dog两个类的时候↓
注意:错误代码↓
- 当用private 修饰 name 以后, Bird 当中的 name 就不能被访问↓
public class Animal {
private String name;
public void eat(){
System.out.println(this.name + "吃饭!");
}
当用private 修饰 name 以后, Bird 当中的 name 就不能被访问↑
- 当添加了Anmial 的构造方法以后
public class Animal {
public String name;
public void eat(){
System.out.println(this.name + "吃饭!");
}
public Animal(String name) { //写了 Animal 的构造方法
this.name = name;
}
}
上述两个图片展示,此时,Dog 和 Bird 立刻报错
注意事项:
1、Java 当中只能继承一个类,不能同时继承多个类,只支持单继承。
2、父类的私有属性和方法不能在子类当中进行访问,也就是对于父类的 private 的字段方法子类中无法访问。
3、子类继承了父类除构造方法外的所有东西。
4、子类继承了父类,子类当中会包含父类的属性。
super关键字
子类如果要实例化,那么首先需要实例化父类,子类要构造,那么你需要先构造父类。
子类当中如何构造父类?
答:构造对象只有一种方法,调用父类的构造方法来构造对象。借助super 关键字。
super关键字:代表父类对象的引用。
1、super() ; 代表调用父类的构造方法,只能放在第一行。
2、super.data; 代表调用父类的属性。
3、super.func(); 代表调用父类的成员方法。
public class Bird extends Animal{
public int age;
public Bird(String name,int age){
super(name); //子类并没有继承父类的构造方法,只是在子类当中
//进行了显示调用,通过super关键字
this.age = age;
}
public void fly(){
System.out.println(this.name + "正在飞!");
}
}
注意:super();只能调用一次。
protected 关键字
图中 变量a 拥有的访问权限是默认的权限
四种访问修饰限定符
添加一个 protected 修饰的 sex ↓
建立两个不同的包 ↓
Test 继承了 Animal 用 super 后可以访问 name
删除 entends 关键字以后 super 也不能访问↓
更复杂的继承关系
// Animal.java
public Animal {
...
}
// Cat.java
public Cat extends Animal {
...
}
// ChineseGardenCat.java
public ChineseGardenCat extends Cat {
...
}
// OrangeCat.java
public Orange extends ChineseGardenCat {
...
}
......
在上述代码中,这种继承方式成为多层继承,即子类还可以派生出新的子类↑
注意:
一般我们不希望出现三层以上的继承关系,如果继承层数太多就要考虑重构。
final 关键字
如果一个类不想被继承,在类前面加一个final 修饰
final int SIZE = 10; SIZE:常量 → 不能被修改
final 修饰的类:密封类 → 当前类不能被继承
final 也可以修饰方法 叫做密封方法
继承 → is…a… 的关系 → …是一个…
组合 →has…a… 或者 a part of…
下图就构成了一个组合关系↓