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

问题描述:

这是类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,实际的问题是得到家长的我值类添加..

+1

没有任何复杂的逻辑。你只是打印5 + 5 ... – sashkello 2013-04-23 07:27:51

+3

@Anand没有人知道所有这些东西。例如,如果您发布JSF问题,与[BalusC](http://*.com/users/157882/balusc)相比,您会看起来像noob,但不需要对任何人不礼貌(至少不在本网站)。 – 2013-04-23 07:33:08

+0

@LuiggiMendoza,问题改变了,看看,我不能发布更多的问题,也可以upvote,如果可能的话,让我发布新的问题......但我需要解释你上次做了,你​​解释得很好 – anshulkatta 2013-05-16 10:02:58

东西这里是你的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 
    } 
} 
+0

+1彻底回答 – 2013-04-23 07:30:50

+0

明白了,但如果我在JavaTest2中拥有与我相同的成员会发生什么......并且执行相同的操作。i – anshulkatta 2013-04-23 07:37:10

+0

然后你的'JavaTest2'将会隐藏**'JavaTest'类中声明的属性**。 – 2013-04-23 07:38:08

您指的是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 
    

    }