简单的继承,但令人困惑的

这是类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

回答:

内部addi是从参数的一个不从父类

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
  • 凡超类的methodsinstance variables被继承到基类。

  • i是由其基类继承的JavaTest类的实例变量。

    空隙加载(int i)以{

    System.out.println(5+i); // i is already 5, so 5 + 5 = 10 

    }

以上是 简单的继承,但令人困惑的 的全部内容, 来源链接: utcz.com/qa/260097.html

回到顶部