java では、デフォルトですべてのクラスが Object クラスを拡張することがわかっている場合、どのクラスからでもこれらのメソッドにアクセスするのに as protected で十分な public 修飾子を持つメソッドがあるのはなぜですか? したがって、これに関する情報が必要です。ありがとう。
4 に答える
Objectメソッドがパブリック(またはパッケージスコープ)でない場合、子オブジェクトの外部から呼び出すことはできません。それらがすべてのJavaオブジェクトに継承されるという事実は、これらのメソッドのスコープと直交しています。
簡単な例:どのくらいの頻度で電話しますx.toString()
か?そのメソッドが公開されていなければ、それを行うことはできませんでした。そして、そのメソッドがObjectにまったく存在しなかった場合は、新しいクラスごとにそのメソッドを再実装する必要があります。
<編集>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
。私の見解では、これらのメソッドはObjectにあるべきではなく、特殊なLockクラスにあるべきです。しかし、私はそれらを非常に初期にそこに置く正当な理由があったと思います、そしてそれは互換性を壊さずに今日変更することはできません。notify()
, notifyAll()
, wait(long)
, wait(long, int)
clone()
clone()
はObjectの保護されたメソッドであり、他のクラスのインスタンスを呼び出すことはできません。
as protected は、任意のクラスからこれらのメソッドにアクセスするのに十分です
どのクラスからでも、はいObject
。
Java 言語仕様では、 の意味を次のように定義しています。protected
オブジェクトの保護されたメンバーまたはコンストラクターは、そのオブジェクトの実装を担当するコードによってのみ宣言されているパッケージの外部からアクセスできます。
つまり、サブクラス S は、S のインスタンスでのみ、スーパークラス C の保護されたコンストラクター/メンバーを呼び出すことができます。