java覆盖不工作
我是一名Java初学者,我使用PHP,C++和Lua,并且从来没有遇到过这个问题,我只为了运动的缘故做了两个类Facto
和MyFacto
,第一个确实找到了阶乘,第二个应该通过增加而不是通过乘法来找到阶乘。不要责怪我愚蠢和毫无意义的代码,我只是测试并试图获得Java的窍门。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()
方法没有被覆盖有什么关系,它使用Facto
类的run()
方法?我怎样才能解决这个问题或者什么是正确的方式来重写这样的事情?
您遇到问题的原因归结于member access visibility。
一言以蔽之:
-
public
允许任何 Java类实地看/功能,只要它可以到达。 -
<package>
或者没有明显的修饰符,允许任何Java对象(但不是子类)看到字段/函数,只要它们在同一个目录或包中。 -
protected
允许声明的类和所有其他子类访问该字段/函数以及同一目录/包中的任何类。 -
private
允许只有声明的类来访问该字段/函数。
谢谢!不知何故,我忽视了我在私密性方面的要求,因为我看到它是公开的代码,哦,深夜编程!谢谢你的解释! –
要展开什么@Makoto说,你遇到了一个问题,因为Facto
的calc()
方法不能访问的MyFacto
的run()
的方法,所以它使用它自己的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!
我没有意识到你已经完成了,当我张贴,很高兴现在一切都好。 :) – lachy2901
然而,你的评论是有帮助的,我试着用'@ Override'注释,但有一个错误'MyFacto类型的方法run(int)必须覆盖或实现一个超类型方法',找不到它真的意味着我将它擦除,然后我将从现在开始使用它。除了可读性和在IDE中获取错误之外,是否还有其他理由使用'@ Override'注释? –
@Vlakarados:“@ Override”的要点是准确地捕捉到你所面临的问题 - 当你不是的时候,你认为你重写了一种方法。 –
在两个类中将'private int run()'更改为'protected int run()'。 –
@GregKopff究竟在'Facto'类还是'MyFacto'中?我改变了他们两个,结果是15和0. –
,因为0 *任何= 0.即你的覆盖现在正常工作,工作逻辑。=) –