Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java抽象类(此关键字)_Java_Android - Fatal编程技术网

Java抽象类(此关键字)

Java抽象类(此关键字),java,android,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() {

我想我误解了什么,如果是这样,我需要帮助

假设我有以下两个类:

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?

Reality
中的
number
不会覆盖
抽象
类中的
number
。因此,
抽象
类仍然将自己的
number
值视为
0

解决办法是:

public class Reality extends Abstraction {
   public Reality() {
       number = 1;
       this.printNumber();
   }
}
由于
抽象中的
数字
受到保护,因此您可以在
Reality
类中访问它


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

private int number;

public void myMethod(int number){
    number = 2;
}
您的
private int number
字段不会被设置,相反,参数
number
将被设置为
2


最后,关于
this
super
关键字的一个词,请参见您的类编辑:

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
   }
}
您正在
Reality
中创建一个局部变量,但是
printNumber()
方法引用的成员变量仍然是0

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

number = 1;
会好的


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

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

public void setNumber(int value) {
this.number = value;
}
你试图实现这一点的方法是行不通的,因为变量并没有超过超类的要求

我希望这有帮助

public class Reality extends Abstraction {
    int number = 1;
    public Reality() {
        this.printNumber();
    }
}
代码
number
上方是class
Reality
的实例变量和超类的调用方法。在super类中,
printNumber()
方法将打印
number
0的值,因为它是用0初始化的

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

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