Java抽象类(这个关键字)

时间:2012-08-09 13:18:05

标签: java android

我认为我误解了一些事情,如果是的话,我需要帮助......

假设我有以下两个类:

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 个答案:

答案 0 :(得分:9)

number班级 中的Reality不会 覆盖number班级中的Abstraction。因此,Abstraction类仍将自己的number值视为0

解决方案是:

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

由于number中的Abstraction受到保护,您可以在Reality课程中访问它。


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

private int number;

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

您的private int number 字段将不会设置,而参数 number将设置为2。< / p>


最后,关于thissuper关键字的单词,请参阅您的课程编辑:

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
   }
}

答案 1 :(得分:1)

您正在Reality中创建本地变量,但printNumber()方法指的是仍为0的成员变量。

如果您没有创建本地变量,但您使用该字段的方式如下:

number = 1;

没关系。

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

答案 2 :(得分:1)

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

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

他们试图实现这一点的方法无效,因为变量不会覆盖超类的变量。

我希望这有帮助!

答案 3 :(得分:-1)

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

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

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

public Reality(int num) {
    this.printNumber();
}