-3

这是类 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 值添加..

4

8 回答 8

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 相同的成员会发生什么...并且执行相同的 this.i

这称为隐藏,Oracle 的 Java 教程中有很好的解释:隐藏字段

例子:

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
    }
}
于 2013-04-23T07:27:35.093 回答
1

您指的是i您收到的参数。试试this.i

void add(int i)
{
    System.out.println(i + this.i);
}

这将在您上面的示例中打印7

于 2013-04-23T07:27:43.127 回答
0
  • 这是一个简单的概念inheritance
  • methodsand被继承到基类中。instance variables

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

    无效添加(int i){

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

    }

于 2013-04-23T07:33:34.353 回答
0

您将 5 传递给该add方法。对此 5 是 5 添加并打印

System.out.println(5+i);

所以这里没什么奇怪的。

i被初始化的被方法声明中的JavaTest遮蔽。i最局部的变量按定义使用。如果您希望该方法使用该字段i,您可以像这样更改您的方法:

void add(int j) {
    System.out.println(5+i);
}
于 2013-04-23T07:28:02.987 回答
0

在您的add方法中,i超类中的变量不可见。您正在使用您也称为的参数覆盖它i

尝试用add()这个替换你的方法:

void add(int x)
{
    System.out.println(5+i);
}

输出将变为 7。您现在正在做的实际上是打印输出5+x

于 2013-04-23T07:28:18.650 回答
0

i里面add是不是继承i自父类的from参数

  void add(int i) <----------------+
  {                                |
      System.out.println(5 + i); --+

      System.out.println(5 + this.i);  --> member i
  }

因此之后add(5),它将打印5+5-> 10

要表示继承i,请尝试this.i改用。

于 2013-04-23T07:28:32.977 回答
0

add() 函数中的参数与类属性同名。

重命名您的参数,它应该可以工作:

void add(int someNumber)
{
     System.out.println(5+i); // result 7
     System.out.println(5+someNumber); // result 10
}
于 2013-04-23T07:28:33.683 回答
0

如果您在范围内有一个局部变量(可以从您引用它的任何地方访问它),它将采用本地变量。由于您在超类 (JavaTest) 中有一个实例变量,并且在 add 方法中有一个参数,所以它将采用后者。

除非另有要求,否则通常建议将所有实例变量设为私有。最重要的是,对局部变量和实例变量使用相同的名称是非常糟糕的做法(它认为这称为阴影)。

于 2013-04-23T07:30:25.510 回答