继承是 Java 面向对象编程技术的一块基石,是面向对象的三大特征之一,也是实现软件复用的重要手段,继承可以理解为一个对象从另一个对象获取属性的过程。
一、继承的概念
1.概念:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
2.生活中体现出继承的示例:
兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
3.IS-A 关系
IS-A 就是说:一个对象是另一个对象的一个分类。
二、继承的使用
1.在Java之中,如果要实现继承的关系,可以使用如下的语法:
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类 {
}
class 子类 extends 父类 {
}
2.示例:
父类:Animal类
public class Animal{
private String name;
private int health;
private int love;
public Animal() {
}
public Animal(String name, int health, int love) {
this.name = name;
this.health = health;
this.love = love;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
void print() {
System.out.println("宠物信息:昵称:" + this.name + ",健康值:" + this.health
+ ",亲密度:" + this.love);
}
}
子类:Dog类
public class Dog extends Animal{
// 品种
private String strain;
public Dog() {
}
public Dog(String name, int health, int love, String strain) {
super(name, health, love);
this.strain = strain;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public void print(){
// System.out.println("宠物信息:昵称:" + this.getName() + ",健康值:" + this.getHealth()
// + ",亲密度:" + this.getLove()+",品种:"+this.strain);
super.print();
System.out.println("品种:"+this.strain);
}
}
三、继承的必要性
1.提高了代码的复用性
继承是Java中实现代码重用的重要手段之一。子类继承父类后可以使用父类的方法,因此可以大大节省代码量。
2.提高了代码的可维护性
由上面的代码可知Animal类就可以作为一个父类,然后Dog类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码)。
四、继承的局限性
1.Java中只支持单根继承,即一个类只能有一个直接父类;Java之中只允许多层继承,不允许多重继承,Java存在单继承局限。
2.在一个子类继承的时候,实际上会继承父类之中的所有操作(属性、方法),但是需要注意的是,对于所有的非私有(no private )操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)。
3.在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化,即:默认情况下,子类会找到父类之中的无参构造方法。