我正在输出
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
。那么为什么方法而不是变量?
答案 0 :(得分:6)
当变量具有来自不同范围的冲突名称时,它总是使用最近范围内的变量,即使它尚未设置为任何范围。
要区分其他范围内的变量,请在变量前添加this
或super
:
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
中的声明,则x
对SubClass
的任何访问都将从父类访问变量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
是一个实例变量所以,在继承中,只允许Methods
为override
而不是Instance Variable
因此,x
将通过使用0
时new 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
内的SubClass
是shadowing 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;