类成员vs子类的对象变量

时间:2015-04-14 12:23:33

标签: java

以下是代码段及其输出 -

class Box{
        int height = 1;
        int length = 1;
        int width = 1;

        Box(int h, int l, int w){
                this.height = h;
                this.length = l;
                this.width = w;
        }

        int volume(){
                return this.height * this.length * this.width;
        }

}

class BoxWeight extends Box{
        int height = 99;
        int length = 99;
        int width = 99;
        int mass;

        BoxWeight(int h, int l, int w, int m) {
                super(h, l, w);
                this.mass = m;
        }

        int volume(){
                return this.height * this.length * this.width;
        }
}
public class BoxDemo {
        public static void main(String[] args) {
                Box b = new Box(10, 20, 30);
                BoxWeight bw = new BoxWeight(40, 50, 60, 10);
                System.out.println(bw.height);
                System.out.println(bw.length);
                System.out.println(bw.width);
                //b = bw;
                //System.out.println(b.volume());

        }

}

输出

99
99
99

这里我无法理解为什么对象bw打印初始化为类成员的值。为什么对象bw没有保存通过构造函数赋值的值?

3 个答案:

答案 0 :(得分:4)

BoxWeight的成员隐藏Box的成员,因此您无法看到传递给Box构造函数的值。

只需从BoxWeight

中删除此成员即可
        int height = 99;
        int length = 99;
        int width = 99;

在两个类中都有完全相同的volume()实现也没有意义。

答案 1 :(得分:1)

由于BoxWeight定义了自己的lengthwidthheight,因此隐藏了Box中的相应字段。您可以从BoxWeight中移除字段,也可以转换为Box,如下所示:

public static void main(String[] args) {
    Box b = new Box(10, 20, 30);
    BoxWeight bw = new BoxWeight(40, 50, 60, 10);
    System.out.println(((Box) bw).height);
    System.out.println(((Box) bw).length);
    System.out.println(((Box) bw).width);
}

打印:

40
50
60

答案 2 :(得分:0)

这就是继承的工作方式。最后@Override计数。在这种情况下,它是BoxWeight