1

私はJavaの初心者で、PHP、C ++、Luaを使用しましたが、この問題は発生しませんでした。演習のためだけに2つのクラスを作成しましたFacto。最初のクラスMyFactoは階乗を検出し、2番目のクラスは階乗を追加するのではなくによって検出する必要があります。乗算。愚かで無意味なコードで私を責めないでください。私はただテストして、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これを修正するにはどうすればよいですか、またはこのようなものをオーバーライドする正しい方法は何ですか?

4

2 に答える 2

6

問題が発生している理由は、メンバー アクセスの可視性が原因です。

手短に:

  • public到達できる限り、任意のJava クラスがフィールド/関数を参照できるようにします。
  • <package>、または明らかな修飾子がない場合、同じディレクトリまたはパッケージ内にある限り、任意の Java オブジェクト (ただしサブクラスではない) がフィールド/関数を参照できます。
  • protected宣言されたクラスと他のすべてのサブクラスがそのフィールド/関数、および同じディレクトリ/パッケージ内の任意のクラスにアクセスできるようにします。
  • private宣言されたクラスのみがそのフィールド/関数にアクセスできるようにします。
于 2012-06-27T01:04:08.170 に答える
3

@Makoto の発言を拡張するには、 のメソッドが のメソッドにcalc()アクセスFactoできないため、問題が発生しているため、独自のメソッドを使用しています。代わりに両方を変更すると、うまくいくはずです。run()MyFactorun()protectedprivate

また、おそらく使用方法を学ぶ必要があるのは、@Override注釈です。オーバーライドするメソッドの上に配置することをお勧めします。そうすれば、スペルが間違っていたり、パラメーターが一致していなかったりすると、警告が表示されます。また、それはあなたおよび/または読者に明確になります。例えば:

MyFacto.java#run:

@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 に答える