1

我是 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());

}
}

事实.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?我该如何解决这个问题或覆盖这样的事情的正确方法是什么?

4

2 回答 2

6

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

简而言之:

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

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

此外,您可能应该学习使用@Override注释。将它放在您要覆盖的任何方法之上是一种很好的做法。这样,如果您拼写错误或参数不匹配,您将收到警告。此外,它使您和/或读者清楚。例如:

MyFacto.java#运行:

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

祝 Java 好运!

于 2012-06-27T01:11:01.910 回答