0

我想我误解了一些东西,如果是这样,我需要帮助..

假设我有以下两个类:

public abstract class Abstraction() {
   protected int number = 0;
   public void printNumber() {
       System.out.println(this.number);
       System.out.println(getNumber());
   }
   public int getNumber() {
       return this.number();
   }
}

public class Reality extends Abstraction {
   int number = 1;
   public Reality() {
       this.printNumber();
   }
}

// some other class
new Reality();

输出应该是什么?我得到 0, 0 (这里的代码有点复杂,但仍然是同样的问题)。如何使输出为 1,1?

4

4 回答 4

9

number中的不会覆盖类中的。因此,班级仍然将他自己的价值视为。 RealitynumberAbstractionAbstractionnumber0

一个解决方案是:

public class Reality extends Abstraction {
   public Reality() {
       number = 1;
       this.printNumber();
   }
}

因为您的numberinAbstraction受到保护,您可以在Reality课堂上访问它。


另一个例子是方法中的参数:

private int number;

public void myMethod(int number){
    number = 2;
}

不会设置您的private int number 字段,而是将参数 number设置为2.


this最后,关于andsuper关键字的一句话,请参阅您的课程的编辑:

public abstract class Abstraction() {
   protected int number = 0;
   public void printNumber() {
       System.out.println(this.number);
       System.out.println(getNumber());
   }
   public int getNumber() {
       return this.number();
   }
}

public class Reality extends Abstraction {
   int number = 1;
   public Reality() {
       System.out.println(number); //Will print 1
       System.out.println(this.number); //Will print 1
       System.out.println(super.number); //Will print 0
   }
}
于 2012-08-09T13:20:02.537 回答
1

您正在创建一个局部变量,Reality但该printNumber()方法引用仍然为 0 的成员变量。

如果您不创建本地变量,而是使用该字段,如下所示:

number = 1;

一切都会安好的。

如果您在理解字段时遇到问题,您可以随时参考官方文档,可在此处找到:Oracle java docs

于 2012-08-09T13:20:37.823 回答
1

您可以在抽象类中创建 setter 方法:

public void setNumber(int value) {
this.number = value;
}

他们试图实现这一点的方式是行不通的,因为变量不会覆盖超类的变量。

我希望这有帮助!

于 2012-08-09T13:22:08.497 回答
-1
public class Reality extends Abstraction {
    int number = 1;
    public Reality() {
        this.printNumber();
    }
}

上面的代码number是类的实例变量Reality和超类的调用方法。在超类printNumber()方法中将打印值number0,因为它是用 0 初始化的。

如果要获取 的子类变量值number,则必须将值作为方法参数传递,如下所示:

public Reality(int num) {
    this.printNumber();
}
于 2012-08-09T13:38:01.370 回答