钾肥喵的窝

我在 CODING 部署的 Hexo 博客

0%

Java中属性的继承|一道判断题引发的思考

题面

在Animal类和其子类Dog类中均定义了一个名为age的整形变量, 则按照多态原理, 下列程序中访问的是Dog类中的age变量.

1
2
Animal a=new Dog();
System.out.println(a.age);

解析

属性的继承

Java方法重写是子类重写父类同名的方法, 子类方法覆盖了父类的方法. 而对于属性, 子类不会覆盖父类同名的属性.

如果子类没有定义属性, 子类会继承最近父类的属性.

如果创建子类对象后, 父类和子类对象都会保存一份自己的属性, 子类对象引用向上转型为父类对象引用, 父类对象引用调用的是子类重写的方法, 调用的属性仍然是父类的属性.

构造方法的继承

Java的规定: 子类继承父类, 子类的构造方法必须调用super()父类的构造方法, 而且必须放在构造方法的第一行.

如果父类"只"有无参构造方法, 且不打算重写子类的构造方法, 为节省代码量, 子类构造方法可以不写, 但是实际上是已经写了, 系统默认调用父类无参构造方法super(), 即默认会在子类的构造方法中的第一行加上父类的无参构造方法.

代码

观察下列样例代码的输出就可以看出端倪.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Animal{
int age;
Animal(){
age = 10085;
System.out.println("Animal");
}
}
class Dog extends Animal{
int age;
double weight;
Dog(){
age = 10086;
System.out.println("Dog");
}
}
public class Test {
public static void main(String[] args) {
Animal cat = new Dog();
System.out.println(cat.age);
System.out.println(cat.weight);
}
}
/*
output:
Animal
Dog
10085
*/

总结

对于属性的继承, 如果子类与父类重复, 向上转型之后优先使用父类属性, 如果是父类不存在的, 向上转型后无法访问.

对于构造方法的继承, 首先调用父类的构造方法, 再执行方法体.

参考资料

Java属性的继承

关于子类构造方法中调用父类构造方法之 super()