0

記法clone()を使用してメソッドにアクセスできるのに、Object 型の新しいオブジェクトを作成してアクセスできないのはなぜですか。super.たとえば、次のようなことをすると

Object obj = new Object();

次に (Eclipse を使用して)clone()ドット演算子を使用してメソッドを表示できません。これは、obj がクラスの保護されたメンバーを表示できないことを示していますObject(パブリック メソッドのみが表示されます)。

superキーワード ie useを使用すると、super.保護されたメソッドも表示できます。

したがって、私の質問は、他のクラスを明示的に継承 (拡張) しないクラスでは、オブジェクト クラス コンストラクターへの暗黙的な呼び出しを行うことを知っています。つまり、オブジェクト クラスはそのスーパークラスです。オブジェクトクラスのメンバーですが、オブジェクトクラスのインスタンスを作成しても同じことは達成されません(オブジェクトクラスのインスタンスにはパブリックメンバーのみが表示されます)?

これはより明確なコードです(意味はありませんが、最初の部分は準拠しており、他の部分は準拠していません):

public class temp {

    public temp() {
        // TODO Auto-generated constructor stub
        TestBikes t1 = new  TestBikes();
        Object ob1 = new Object();
        try {
            t1 = (TestBikes)super.clone(); //SUPER KEYWORD IS ABLE TO ACCESS
                                                   //PROTECTED MEMBERS OF Object 
                                                   //CLASS   
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            t1 = (TestBikes)ob1.clone();  // HERE IS THE ERROR SAYING clone()
                                                  // FROM Object CLASS IS NOT VISIBLE
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
4

1 に答える 1

4

protectedサブクラス(または同じパッケージ内のクラス)からのみアクセスできることを意味します。したがって、サブクラスでは、thisまたはsuperまたは何も使用せずにアクセスできますが、別のインスタンスではアクセスできません。

あなたの例はコンパイルされますが、実行されません。

    try {
        t1 = (TestBikes)super.clone(); // creates a clone of temp, not a TestBikes
        t1 = (TestBikes)this.clone(); // does the same thing  
        t1 = (TestBikes)clone(); // does the same thing  

    } catch (CloneNotSupportedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

ところで:これは単なる例ですが、コンストラクターでオブジェクトを複製することは悪い考えです。


を実装するサブクラスでアクセスできるように、保護する必要がありますCloneable。ただし、すべてのオブジェクトが複製可能であるとは限らないため、通常はアクセスできません。

を使用superすると、保護されたメソッドにアクセスできます。参照を使用してメソッドを作成するには、メソッドがアクセス可能である必要があります。たとえば、パブリックまたはパッケージ ローカルで、同じパッケージ内にある必要があります。

私の知る限り、 clone()/Cloneable API は壊れているため、避けるべきであることが一般的に認められています (プリミティブ配列を除く)。たとえば、Cloneable インターフェイスObject clone();には公開するメソッドがなくObject、キャストする必要があるものを返します。

于 2013-01-02T17:13:45.110 に答える