这是JavaTest类
package testing.test;
public class JavaTest
{
int i=2;
}
这是JavaTest2类,它扩展了JavaTest
package testing.test;
class JavaTest2 extends JavaTest
{
public static void main(String[] args) {
new JavaTest2().add(5);
}
void add(int i)
{
System.out.println(5+i);
}
}
现在输出到10,实际问题是获取要添加的父类的i值。
答案 0 :(得分:7)
这里的事物是您的add
方法阴影类的i
属性,其中i
变量声明为参数。因此,在i
方法中使用add
时,您使用的是i
参数,而不是i
属性。
要注意区别,请将add
方法更改为:
void add(int i) {
System.out.println(5+i);
System.out.println(5+this.i); //this will do the work for you
}
在类构造函数上使用阴影的一个很好的例子:
public class SomeClass {
int x;
public SomeClass(int x) {
//this.x refers to the x attribute
//plain x refers to x parameter
this.x = x;
}
}
评论跟进:
得到了它,但是如果我在JavaTest2中拥有与i相同的成员会发生什么......并且做同样的事情.i
这称为隐藏,在Oracle的Java教程中有很好的解释:Hiding Fields
示例:
class JavaTest2 extends JavaTest {
int i = 10;
void add(int i) {
System.out.println(5+i);
System.out.println(5+this.i); //this will add 5 to i attribute in JavaTest2
System.out.println(5+super.i); //this will add 5 to i attribute in JavaTest
}
}
答案 1 :(得分:1)
您指的是您收到的i
作为参数。试试this.i
。
void add(int i)
{
System.out.println(i + this.i);
}
这将在上面的示例中打印7
。
答案 2 :(得分:0)
您正在向add
方法传递5。为此添加了5个并打印
System.out.println(5+i);
这里没什么好吃的。
i
中初始化的JavaTest
被方法声明中的i
遮蔽。根据定义使用最多的局部变量。如果您希望该方法使用字段i
,您可以更改您的方法:
void add(int j) {
System.out.println(5+i);
}
答案 3 :(得分:0)
在add
方法中,超类中的i
变量不可见。您将使用您也称为i
的参数覆盖它。
尝试使用以下方法替换add()
方法:
void add(int x)
{
System.out.println(5+i);
}
输出将变为7.您现在正在做的事情是打印5+x
。
答案 4 :(得分:0)
i
内的add
是来自父类的未继承i
参数的<{1}}
void add(int i) <----------------+
{ |
System.out.println(5 + i); --+
System.out.println(5 + this.i); --> member i
}
因此add(5)
之后,它会打印5+5
- &gt; 10
。
要表示继承的i
,请尝试改为使用this.i
。
答案 5 :(得分:0)
add()函数中的参数与class属性具有相同的名称。
重命名参数,它应该有效:
void add(int someNumber)
{
System.out.println(5+i); // result 7
System.out.println(5+someNumber); // result 10
}
答案 6 :(得分:0)
如果你在范围内有一个局部变量(可以从你引用它的地方访问它),它将采用本地变量。由于在超类(JavaTest)中有一个实例变量,在add方法中有一个参数,因此它将采用后者。
除非另有要求,否则通常建议将所有实例变量设为私有。最重要的是,对局部变量和实例变量使用相同的名称是非常糟糕的做法(它认为这称为阴影)。
答案 7 :(得分:0)
inheritance
。 超类的methods
和instance variables
继承到基类。
i
是JavaTest类的实例变量,由其基类继承。
void add(int i){
System.out.println(5+i); // i is already 5, so 5 + 5 = 10
}