题面
在Animal类和其子类Dog类中均定义了一个名为age的整形变量,
则按照多态原理, 下列程序中访问的是Dog类中的age变量. 1
2Animal a=new Dog();
System.out.println(a.age);
解析
属性的继承
Java方法重写是子类重写父类同名的方法, 子类方法覆盖了父类的方法. 而对于属性, 子类不会覆盖父类同名的属性.
如果子类没有定义属性, 子类会继承最近父类的属性.
如果创建子类对象后, 父类和子类对象都会保存一份自己的属性, 子类对象引用向上转型为父类对象引用, 父类对象引用调用的是子类重写的方法, 调用的属性仍然是父类的属性.
构造方法的继承
Java的规定: 子类继承父类, 子类的构造方法必须调用super()父类的构造方法, 而且必须放在构造方法的第一行.
如果父类"只"有无参构造方法, 且不打算重写子类的构造方法, 为节省代码量, 子类构造方法可以不写, 但是实际上是已经写了, 系统默认调用父类无参构造方法super(), 即默认会在子类的构造方法中的第一行加上父类的无参构造方法.
代码
观察下列样例代码的输出就可以看出端倪.
1 | class Animal{ |
总结
对于属性的继承, 如果子类与父类重复, 向上转型之后优先使用父类属性, 如果是父类不存在的, 向上转型后无法访问.
对于构造方法的继承, 首先调用父类的构造方法, 再执行方法体.