简单的继承,但令人困惑的
这是类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,实际的问题是得到家长的我值类添加..
回答:
该东西这里是你的add
方法阴影i
变量声明为参数的类的属性。因此,在add
方法中使用i
时,使用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
这就是所谓的躲在和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
}
}
回答:
您指的是i
你收到的参数。尝试this.i
。
void add(int i) {
System.out.println(i + this.i);
}
这将在您的示例中打印7
。
回答:
您正在将5传递给add
方法。到这5是5添加和打印
System.out.println(5+i);
所以这里没有什么让人惊讶的。
在JavaTest
中初始化的i
被方法声明中的i
遮蔽。定义使用最本地的变量。如果你想使用的方法领域i
你可以改变你的方法是这样的:
void add(int j) { System.out.println(5+i);
}
回答:
您add
方法中,从超一流的i
变量是不可见的。你用一个你也称为i
的参数覆盖它。
尝试用这个替换您add()
方法:
void add(int x) {
System.out.println(5+i);
}
输出将成为7.你现在正在做的,有效的,是打印出来5+x
。
回答:
内部add
的i
是从参数的一个不从父类
void add(int i) <----------------+ { |
System.out.println(5 + i); --+
System.out.println(5 + this.i); --> member i
}
THEREFOR add(5)
后,将打印5+5
继承i
- >10
。
要表示继承i
,请尝试使用this.i
来代替。
回答:
add()函数中的参数与class属性具有相同的名称。
重命名您的参数,它应该工作:
void add(int someNumber) {
System.out.println(5+i); // result 7
System.out.println(5+someNumber); // result 10
}
回答:
如果你有范围的局部变量(它是从。无论您在引用它的访问),这将需要当地的一个。由于超类(JavaTest)中有一个实例变量,而add方法中有一个参数,因此将采用后者。
除非另有要求,一般建议将所有实例变量设为私有。最重要的是,对局部变量和实例变量使用相同的名称是非常糟糕的做法(它认为这叫做阴影)。
回答:
- 这是一个简单的概念
inheritance
。 凡超类的
methods
和instance variables
被继承到基类。i
是由其基类继承的JavaTest类的实例变量。空隙加载(int i)以{
System.out.println(5+i); // i is already 5, so 5 + 5 = 10
}
以上是 简单的继承,但令人困惑的 的全部内容, 来源链接: utcz.com/qa/260097.html