目录
基本代码
public class Main {
public static void main(String[] args) {
Animal cat = new Cat() ;
}
}
class Animal {
private int age;
private String name;
public Animal() {
}
public Animal(int age, String name) {
this.age = age;
this.name = name;
}
}
class Cat extends Animal {
}
代码执行
new的执行
之前我们有提到过,new执行时先要在堆中为对象开辟一块内存空间,随后执行以下步骤:
- 设置this
- 为对象属性赋默认值
- 为对象赋初值(按编程者的意愿)
- 返回this
但是现在咱们有一个问题,开辟内存空间前,我们需要知道该对象需要多少的内存空间,可我们现在new出的是一个Cat对象,如你所见,Cat类里啥也没有,那我们如何去确定其所占的内存空间呢?
extends关键字
我们注意到,在Cat类名后出现了extends关键字,我们用extends关键字来表示继承关系,例如代码中的Cat和Animal就是继承关系,即Animal是Cat的父类。Cat类里啥也没有,但Cat的父类里写有两个属性,我们想想内存空间的确定会不会和其父类Animal有关系。
继承的英文单词是Inherit而不是Extends,那为什么Java的开发者们要用extends关键字呢?其实,在子类中,我们常常重写父类的方法,使之实现更加具体合理,或是添加父类没有的方法,让子类具有更多功能,你会发现,这就是一种子类对父类的拓展(extends),这也体现了Java开发者的才思。
构造方法
注意到,代码中有一类方法很有特点:
//无参构造
public Animal() {
}
//有参构造
public Animal(int age, String name) {
this.age = age;
this.name = name;
}
它们没有返回值类型,这样的方法被称为构造方法(Construction method)构造方法为对象中的属性变量赋初值,在你创建一个类却没有写构造方法时,Java将默认赠送一个无参构造,但要注意的是,一旦写了有参构造,默认的无参构造将不复存在,而一些秘密,就藏在构造方法里。
super()方法
虽然没写出,但其实在每个无参构造方法中,都有一个super()方法,该方法会调用直接父类的构造方法,使得子类能够继承父类的特性,对于该方法需要注意的是:
- 在构造子类对象时,首先构造父类的特征,也就是说,如果要在构造方法中写出super()方法(当然,一般不这么做)super()方法必须写在第一句
- 除Object类(超级父类)外,所有的类都应当具有super()方法
- 如果不存在无参构造(即上述写了有参构造却不补无参构造的情况)则构造时的super()方法不存在,这会引发意想不到的后果。例如子类无法被构造。
内存的分配
到这儿,开始的问题已经可以基本说清,子类Cat通过无参构造中的super()方法,调用了父类Animal的构造方法,从而隐式继承了Animal的两个属性,有了这两个属性,对象cat所需的内存空间也能被确定下来。
?private属性的继承
可是这里有一个问题,我们说,在父类中,private的方法不能被子类所继承,难道private的属性就可以么?翻阅一些参考书,许多人认为是不能的,但我认为它就是一种隐式继承,只不过我们说,父类中public的方法被子类继承叫做“拿来就用”,但子类对父类private属性的继承可以理解为继承其特性,例如我继承了父母的双眼皮,这不是把父母的双眼皮“直接拿来用”,而是继承了这一特性罢了。
新人创作,水平有限,如有错误,敬请指出!