我是Java的初学者,我使用PHP,C ++和Lua并且从未遇到过这个问题,我为了锻炼而做了两个课Facto
和MyFacto
,第一个确实找到了一个阶乘第二个应该找到阶乘而不是通过相加,而是通过相乘。不要因为愚蠢而毫无意义的代码而责备我,我只是在测试并尝试获得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
方法?我怎样才能解决这个问题,或者用什么方法来覆盖这样的东西?
答案 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}}
祝你好运!