前言:
长江后浪推前浪,一代更比一代强。在生活中,继承在很多地方都有所体现,像家族继承,公司,事业继承
and so on ..........
在 Java 里面的继承实际上也是类似,哪一个公司来说,父亲建立了一个公司,到 60 退休啦,把公司所
有的事务都交给了儿子(include money and beautful girls),儿子接手后,比它父亲干的还好,包括
在原来的基础上进行了新的改革,这就是一个生活中的例子。
从这个例子中我们可以 GET 到几个点:
1、儿子比父亲强(子类比父类更加强大)
2、儿子得到了父亲的公司和财产,但是是一切吗?
(显然不是的,父亲的私房钱儿子能得到吗?(嘻嘻,还得留给媳妇儿))
从这里可以看出,子类只能继承父类中非私有的属性和方法,并且子类无法继承父类中的构造方法。
为什么要用继承?
在这里,用一个小案例进行解释: Dog 有 4 个属性: name,love,health,strain.
Cat 有 4 个属性: name,love,health,sex.
生成的代码就是这样的:
Dog.java:
package pat;
public class Dog {
private String name;
private int love;
private int health;
private String Strain;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public String getStrain() {
return Strain;
}
public void setStrain(String strain) {
Strain = strain;
}
public void print() {
System.out.println(this.name + " " + this.love + " " + this.health + " " + this.Strain);
}
}
Cat.java:
package pat;
public class Cat {
private String name;
private int love;
private int health;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void print() {
System.out.println(this.name + " " + this.love + " " + this.health + " " + this.sex);
}
}
洞察力清晰的你一定发现了在两个类中有很多冗余重复的代码, name,love,health,包括各自的
setter(),getter()方法。想一下,如果我们有 100 个呢?是不是代码会重复的更多。
这时候怎么做呢?
既然你们两个都有重复的代码,那我把重复的代码放到同一个地方,然后这两个去调用不就行了,不同的地方我再自己写不就OK了。
是的,这就是继承的核心,当你理解这句话的时候再向上滑动滚轮,看一下前面所介绍的实际生活例子。
继承的代码是这样的:
Pet.java – 两个类中相同的地方
package pat;
public class Pet {
private String name;
private int love;
private int health;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
}
Dog.java – 继承 Pet.java
package pat;
public class Dog extends Pet{
private String Strain;
public String getStrain() {
return Strain;
}
public void setStrain(String strain) {
Strain = strain;
}
public void print() {
// 由于属性在 父类中是私有的(私房钱),是拿不到的,但是可以通过 getXxx()方法拿到
// 因为 getXxx() 和 setXxx() 方法都是 Public 的
System.out.println(getName() + " " + getLove() + " " + getHealth() + " " + this.Strain);
}
}
总结:
是不是通过继承后代码就少很多了呢,现在有两个类中有重复的,可能体现的不是太深刻,但是如果有
100 个呢,成千上万个呢,效果立马体现出来,实际上这就是大佬们常说的 重用,
当你不自觉的用上重用时,就里合格的程序员更近啦。
总的来说,继承有以下几个好处:
减少冗余(重复)
如果很多类的属性、方法、重复出现, 就可以用继承来减少冗余,提高效率。
严格继承: 是否能读通
.. 是一个 ..
子类是一个父类:
dog 是一个 Pet
张三 是一个 人
house 是一个 Pet(读不通)
另外:只有完全相同的属性和方法才可以提取到父类.
子类会继承父类中非私有的属性和方法,但是 privite 的属性和方法,包括构造方法子类是无法继承的。
但是父类中的构造方法可以通过 super(); 关键字进行调用父类中的构造方法.
关于 super() 和 this() 关键字,请移步到下篇文章。