2012-06-27 99 views
0

我是一名Java初学者,我使用PHP,C++和Lua,并且从来没有遇到过这个问题,我只为了运动的缘故做了两个类FactoMyFacto,第一个确实找到了阶乘,第二个应该通过增加而不是通过乘法来找到阶乘。不要责怪我愚蠢和毫无意义的代码,我只是测试并试图获得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()方法?我怎样才能解决这个问题或者什么是正确的方式来重写这样的事情?

+2

在两个类中将'private int run()'更改为'protected int run()'。 –

+0

@GregKopff究竟在'Facto'类还是'MyFacto'中?我改变了他们两个,结果是15和0. –

+1

,因为0 *任何= 0.即你的覆盖现在正常工作,工作逻辑。=) –

回答

5

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

一言以蔽之:

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

谢谢!不知何故,我忽视了我在私密性方面的要求,因为我看到它是公开的代码,哦,深夜编程!谢谢你的解释! –

3

要展开什么@Makoto说,你遇到了一个问题,因为Factocalc()方法不能访问的MyFactorun()的方法,所以它使用它自己的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!

+0

我没有意识到你已经完成了,当我张贴,很高兴现在一切都好。 :) – lachy2901

+0

然而,你的评论是有帮助的,我试着用'@ Override'注释,但有一个错误'MyFacto类型的方法run(int)必须覆盖或实现一个超类型方法',找不到它真的意味着我将它擦除,然后我将从现在开始使用它。除了可读性和在IDE中获取错误之外,是否还有其他理由使用'@ Override'注释? –

+0

@Vlakarados:“@ Override”的要点是准确地捕捉到你所面临的问题 - 当你不是的时候,你认为你重写了一种方法。 –