java覆盖不起作用

Ser*_*sky 1 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());

}
}
Run Code Online (Sandbox Code Playgroud)

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;
}
}
Run Code Online (Sandbox Code Playgroud)

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;
}
}
Run Code Online (Sandbox Code Playgroud)

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

Mak*_*oto 6

您遇到问题的原因是会员访问可见性.

简而言之:

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