我认为我误解了一些事情,如果是的话,我需要帮助......
假设我有以下两个类:
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?
答案 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>
最后,关于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
}
}
答案 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();
}