5

java では、デフォルトですべてのクラスが Object クラスを拡張することがわかっている場合、どのクラスからでもこれらのメソッドにアクセスするのに as protected で十分な public 修飾子を持つメソッドがあるのはなぜですか? したがって、これに関する情報が必要です。ありがとう。

4

4 に答える 4

11

Objectメソッドがパブリック(またはパッケージスコープ)でない場合、子オブジェクトの外部から呼び出すことはできません。それらがすべてのJavaオブジェクトに継承されるという事実は、これらのメソッドのスコープと直交しています。

簡単な例:どのくらいの頻度で電話しますx.toString()か?そのメソッドが公開されていなければ、それを行うことはできませんでした。そして、そのメソッドがObjectにまったく存在しなかった場合は、新しいクラスごとにそのメソッドを再実装する必要があります。

于 2010-08-15T15:30:13.510 に答える
1

<編集>1つのオブジェクトは同じクラスのすべてのオブジェクトのプライベートプロパティにアクセスできますが、保護されたメソッドが共通のスーパークラスで定義されている場合でも、他のクラスのオブジェクトの保護されたメソッドにアクセスすることはできません。

したがって、このコードがコンパイルされている間:

public class Test {
    private int x;

    private void change(Test test) {
        test.x = test.x + 1;
    }

    public static void main() {
        Test test1 = new Test();
        Test test2 = new Test();
        test1.change(test2);
    }
}

次のコードはコンパイルされません。

public class Test2 {
    public static void main() {
         Test1 test1 = new Test1();
         test1.clone();   // The method clone() from the type Object is not visible
    }
}

</編集>

toString()、、、およびequals(Object)を呼び出すことができるhashCode()getClass() on all objects makes things a lot easier.

clone() and finalize() are protected. So in order to be able to call them from the outside the subclass has to increase the visibility. And that is obviously a design decision.

To be honest, i have no idea why Sun decided that all object are "locks" and have notify(), notifyAll(), wait(long), wait(long, int)。私の見解では、これらのメソッドはObjectにあるべきではなく、特殊なLockクラスにあるべきです。しかし、私はそれらを非常に初期にそこに置く正当な理由があったと思います、そしてそれは互換性を壊さずに今日変更することはできません。

于 2010-08-15T15:42:43.517 に答える
1

clone()clone()はObjectの保護されたメソッドであり、他のクラスのインスタンスを呼び出すことはできません。

于 2010-08-15T15:32:53.383 に答える
1

as protected は、任意のクラスからこれらのメソッドにアクセスするのに十分です

どのクラスからでも、はいObject

Java 言語仕様では、 の意味を次のように定義しています。protected

オブジェクトの保護されたメンバーまたはコンストラクターは、そのオブジェクトの実装を担当するコードによってのみ宣言されているパッケージの外部からアクセスできます。

つまり、サブクラス S は、S のインスタンスでのみ、スーパークラス C の保護されたコンストラクター/メンバーを呼び出すことができます。

于 2010-08-15T15:52:46.547 に答える