java覆盖不起作用

时间:2012-06-27 00:48:46

标签: java

我是Java的初学者,我使用PHP,C ++和Lua并且从未遇到过这个问题,我为了锻炼而做了两个课FactoMyFacto,第一个确实找到了一个阶乘第二个应该找到阶乘而不是通过相加,而是通过相乘。不要因为愚蠢而毫无意义的代码而责备我,我只是在测试并尝试获得Java的支持。

主:

public class HelloWorld {
public static void main(String[] args) {

    Facto fc = new Facto(5);
    fc.calc();
    System.out.println(fc.get());   

    MyFacto mfc = new MyFacto(5);
    mfc.calc();
    System.out.println(mfc.get());

}
}

Facto.java:

public class Facto {
private int i;
private int res;

public Facto(int i) {
    this.i = i;
}

public void set(int i) {
    this.i = i;
}

public int get() {
    return this.res;
}

public void calc() {
    this.res = this.run(this.i);
}

private int run(int x) {
    int temp = 0;
    if(x>0) {
        temp = x + this.run(x-1);
    }
    return temp;
}
}

MyFacto.java:

public class MyFacto extends Facto {
public MyFacto(int i) {
    super(i);
}

private int run(int x) {
    int temp = 0;
    if(x>0) {
        temp = x * this.run(x-1);
    }
    return temp;
}
}

我认为结果应该是15和120,但我得到15和15.为什么会发生这种情况?是否与calc()方法没有被覆盖有关,它使用run()类中的Facto方法?我怎样才能解决这个问题,或者用什么方法来覆盖这样的东西?

2 个答案:

答案 0 :(得分:6)

您遇到问题的原因归因于member access visibility

简而言之:

  • public允许任何 Java类查看字段/函数,只要它可以到达。
  • <package>,或者没有明显的修饰符,允许任何Java对象(但不是子类)查看字段/函数,只要它们位于同一目录或包中。
  • protected允许声明的类和所有其他子类访问该字段/函数,以及同一目录/包中的任何类。
  • private允许声明的类访问该字段/函数。

答案 1 :(得分:3)

要扩展@Makoto所说的内容,您遇到了问题,因为calc() Facto方法无法访问run() MyFacto方法run() ,所以它使用它自己的protected方法。将它们更改为private而不是@Override应该可以解决问题。

另外,您应该学会使用的是@Override protected int run(int x) { int temp = 0; if(x>0) { temp = x * this.run(x-1); } return temp; } 注释。将它置于您所覆盖的任何方法之上是一种好习惯。这样,如果您拼错了某些内容,或者参数不匹配,您将收到警告。此外,它使您和/或读者清楚。例如:

MyFacto.java#运行:<​​/ p>

{{1}}

祝你好运!