先说答案为B 5 的情况:
类B是类A的直接子类,且这两个类同时都定义了成员变量 int x = ?,也就是这句话在两个类中写了两边,在创建实例对象的时候,这两个对象的成员变量x会存在不同的内存空间,一个是a.x 一个是b.x,所以当你答应a.x的时候得到的是5,实际上输出的结果应该是:
B
5
输出B是方法的Override体现的多态性,这个是方法的覆盖的概念,这里不多说。
以上的情况举一个例子:
“假设父类叫father,son是father的直接子类, 两个类里面都有一个叫age的成员变量。创建实例对象后,这两个age其实是在不同的内存空间里的,是分别独立的。比如在father中可以对age赋值50,在son中可以对age赋值25。那么在son类中,这样的语句 int a = age, 那么这个a是25,如果写 int a = father.age 或者 int a = super.age, 那么a是50.”
后一个直接输出6的情况:
同样的类B是类A的直接子类,但是和上面不同的是成员变量x只是在父类A中做了定义,类B中只是在构造方法中做了引用,所以类B构造方法中的x实际上继承的父类A的x,所以在new B()的时候根据子类的构造顺序,先调用父类A的构造方法赋值给x=5,然后再调用子类的B的构造方法赋值给x=6,所以打印的结果是6.
这个例子有两个重点,一个是成员变量只在父类定义了一次,一个改变成员变量的位置在构造方法中,主要考察子类在实例化的时候构造方法的调用顺序。
|