不能在子类的方法中使用来自超类的变量

时间:2016-03-02 23:07:44

标签: java

我在使用超类中的变量时遇到了问题。请参阅下面的代码。在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.
    }
}

2 个答案:

答案 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; = protectedn从ConnectionMap继承,因此可以在Test()中使用。