我在使用超类中的变量时遇到了问题。请参阅下面的代码。在ConncetionMap(final int n)中,我可以成功地使用来自超类的变量n,但是在重写的Test()方法中,该变量n突然不再被识别。如何在那里继续使用变量?
我认为如果ConncetionMap是公开的,我应该能够从同一个班级的其他地方访问n。
public abstract class Connection {
public Connection(final int n) {
}
public abstract int Test();
}
public class ConnectionMap extends Connection {
public ConnectionMap (final int n) {
super(n);
//Here, n is recognized from the superclass and it simply works
if (n < 0) {
throw new IllegalArgumentException("Error.");
}
}
@Override
public int Test() {
int c = n; //This is an example usage of n, and here n is not recognized anymore.
}
}
答案 0 :(得分:1)
n
是构造函数的参数。像局部变量一样,参数的作用域是方法/构造函数。所以它只能从构造函数中看到。这与超类BTW没什么关系。只是可变范围。
如果超类没有提供任何获取其值的方法(例如,使用受保护或公共getN()
方法),那么您需要将其存储到子类中的字段中才能访问它来自另一种方法:
public class ConnectionMap extends Connection {
private int n;
public ConnectionMap (final int n) {
super(n);
//Here, n is recognized from the superclass and it simply works
if (n < 0) {
throw new IllegalArgumentException("Error.");
}
this.n = n;
}
@Override
public int test() {
int c = this.n;
...
}
}
答案 1 :(得分:1)
您已在构造函数中将n
声明为局部变量(参数),因此它在其范围之外不可用。试试这个:
public abstract class Connection {
public final int n;
public Connection(final int n) {
this.n = n;
}
public abstract int Test();
}
public class ConnectionMap extends Connection {
public ConnectionMap (final int n) {
super(n);
//Here, n is recognized from the superclass and it simply works
if (n < 0) {
throw new IllegalArgumentException("Error.");
}
}
@Override
public int Test() {
int c = n; //This is an example usage of n, and here n is not recognized anymore.
}
}
此处,构造函数中的n
将传递给对象中的n
。由于public
&gt; = protected
,n
从ConnectionMap继承,因此可以在Test()
中使用。