1

我有一个子类和一个超类。在子类中,当我想检索超类的值时super.isuper.one显示为零 - 为什么?

另外,当我扩展超类时,是否需要使用super关键字调用超类方法?

public class Inherit {
    public static void main(String args[]) {
        System.out.println("Hello Inheritance!");
        Date now = new Date();
        System.out.println(now);
        Box hello = new Box(2, 3, 4);
        BoxWeight hello_weight = new BoxWeight(2, 5, 4, 5);
        hello.volume();
        hello_weight.volume();
        Box hello_old = hello;
        hello = hello_weight;
        //hello.showValues();
        hello.show();
        hello_old.show();
        hello = hello_old;
        hello.show();
        hello.setValues(7, 8);
        hello_weight.setValues(70, 80);
        hello.showValues();
        hello_weight.showValues();
    }
}

class Box {
    int width, height, depth, i, one;
    static int as = 0;

    Box(int w, int h, int d) {
        ++as;
        width = w;
        height = h;
        depth = d;
    }

    void setValues(int a, int k) {
        i = k;
        one = a;
        System.out.println("The values inside super are : " + i + " " + one + " " + as);
    }

    void showValues() {
        System.out.println("The values of BoxWeight : " + i + " " + one);
        //System.out.println("The superclass values : "+ super.i + " " + super.one);
    }

    void volume() {
        System.out.println("Volume : " + width * height * depth);
    }

    void show() {
        System.out.println("The height : " + height);
    }
}

class BoxWeight extends Box {
    int weight, i, one;

    void volume() {
        System.out.println("Volume and weight : " + width * height * depth + " " + weight);
    }

    void setValues(int a, int k) {
        i = k;
        one = a;
    }

    void showValues() {
        System.out.println("The values of BoxWeight : " + i + " " + one);
        System.out.println("The superclass values : " + super.i + " " + super.one);
    }

    BoxWeight(int w, int h, int d, int we) {
        super(w, h, d);
        weight = we;
    }
}
4

3 回答 3

1

因为你还没有初始化一个,所以默认情况下它的值为零。

hello_weight 

是 Box_Weight 类的对象,当您调用该类的 setValues 时,该类中的一个被初始化,超类一个被遮蔽。所以超一级还是零。

并且一个没有在构造函数中初始化。

于 2013-10-26T06:44:05.200 回答
0

变量的默认范围是包私有。如果要访问父类变量,请将它们制作protected或将子类和父类放在同一个包中。

在您的情况下,int width, height, depth, i, one;变量是包私有的。因此,如果您的子类与超类不在同一个包中,则它无法访问它们。因此将它们声明为protected

于 2013-10-26T06:58:10.717 回答
0

您不需要super关键字来访问父类的成员。但是,您需要的是具有适当的范围/可见性。

如果您的父类具有protected与 相对的字段private,则只有子类的成员才能看到它们。

于 2013-10-26T06:44:57.537 回答