为什么我不继承超类变量?

时间:2016-04-09 18:01:25

标签: java oop inheritance superclass

我正在输出

SubClass subClass = new SubClass(4);
System.out.println(subClass.getVal());

有了这两个类:

public class SuperClass {
    public int x = 99;

    public int superClassMethod() {
        return -1;
    }
}


public class SubClass extends SuperClass {
    public int x;

    public SubClass(int value) {
        x = value;
    }

    public int getVal() {
        return x;
    }
}

按预期输出4。但是,假设我在x = value构造函数中注释掉了SubClass行。为什么输出0(我假设未启动变量的默认值)而不是99,从超类继承?

如果我将return x更改为return superClassMethod();,则似乎正确地从超类中提取-1。那么为什么方法而不是变量?

7 个答案:

答案 0 :(得分:6)

当变量具有来自不同范围的冲突名称时,它总是使用最近范围内的变量,即使它尚未设置为任何范围。

要区分其他范围内的变量,请在变量前添加thissuper

public class SuperClass {
    protected int x;
}
public class SubClass extends SuperClass {
    private int x;
    public SubClass(int x) {
        x = 2; // sets the parameter variable
        this.x = 2; // sets the instance variable
        super.x = 2; // sets the super class' instance variable
    }
}

答案 1 :(得分:3)

public int x;表示名为x的变量的新定义。因此,您将在类中有两个名为x的变量 - SuperClass中的变量和SubClass中的另一个变量。它们具有不同的位置,因此可以包含不同的值。由于您未在SubClass内初始化该值,因此其默认值为0

如果您完全删除SubClass中的声明,则xSubClass的任何访问都将从父类访问变量x

答案 2 :(得分:1)

你继承了,但是你女儿班的{'Command':'OpenWithExplorer','ClickScript':'CoreInvoke\\u0028\\u0027NavigateHttpFolder\\u0027,\\u0027http:\\\\u002f\\\\u002fuk.sharepoint.mydomain.local\\\\u002fsites\\\\u002fmycompany\\\\u002fmyteam\\\\u002fShared Documents\\u0027, \\u0027_blank\\u0027\\u0029;','HiddenScript':'!\\u0028SupportsNavigateHttpFolder\\u0028\\u0029\\u0029','LabelText':'Open with Windows Explorer','Description':'Drag and drop files into this library.'} 的明确重新声明会覆盖你女儿班级的x

x中省略public int x;,你应该没事。

答案 3 :(得分:0)

问题是您的Subclass还有一个名为x的int。然后它将打印该默认值而不是超类的默认值。

尝试删除该int,它应该可以工作!

答案 4 :(得分:0)

这一切都是因为这段代码。

public SubClass(int value) { //what ever You pass you will get the result.
        x = value;
    }

此处x是一个实例变量所以,在继承中,只允许Methodsoverride而不是Instance Variable因此,x将通过使用0new SubClass()。  或者x value如果new SubClass(int value)已使用。

你正在打电话

SubClass subClass = new SubClass(4);  //initialize your local x with 4
System.out.println(subClass.getVal());    // Result you will get is 4

答案 5 :(得分:0)

因为x内的SubClassshadowing variable。就是它隐藏了SuperClass变量x。所以你无法从SuperClass获得价值。当您对x = value;int成员的返回默认值进行评论时,即0

答案 6 :(得分:0)

public class SubClass extends SuperClass {
    public int x;   // this line hides the x defined in the super class.
    ...

    public int getVal() {
        return x;
    }
}

因为SubClass中的x隐藏了SuperClass中定义的x,并且因为没有为

指定范围
return x;

javac将其翻译为

return this.x;