简单的继承但令人困惑

时间:2013-04-23 07:25:59

标签: java

这是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值。

8 个答案:

答案 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
  • 的简单概念
  • 超类methodsinstance variables继承到基类。

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

    void add(int i){

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

    }