2

継承によって、すべてのクラスがオブジェクトクラスからメソッドを継承することを知っています。同様に、あるクラスを他のクラスで拡張すると、メソッドも継承します。次に、継承された保護されたメソッドを他のクラスから呼び出すことができ、継承されたメソッドを Object クラスから呼び出すことができない理由

package com.core.test;

public class CloneableTest {
    public static void main(String[] args) {
        Testclass test= new Testclass();        

        test.someClassSpecificMethod();
        test.clone();  //ERROR AT tHIS LINE why                  
    }
}

class SomeClass implements Cloneable {

    protected void someClassSpecificMethod(){

    }
}

class Testclass extends SomeClass {

} 

上記のファイルで、Testclass のインスタンスを使用して someClassSpecificMethod にアクセスできるのに、なぜ clone メソッドにアクセスできないのでしょうか?

4

2 に答える 2

2

cloneは と同じパッケージにあるクラスでは定義されていませんが、CloneableTestsomeClassSpecificMethodです。クラスは、親から継承した保護されたメソッドにのみアクセスできます。他のクラスと同じ親から継承したとしても、他のクラスのメソッドにはアクセスできません。これは、背後にある意図に関して完全に理にかなっていprotectedます。これは、基本クラスがその子に提供するパブリック API ですが、クラスのクライアントには提供しません。

protectedは package-private より厳密に広いため、package-private の場合にアクセスできたメソッドにいつでもアクセスできprotectedますsomeClassSpecificMethod

于 2015-08-29T19:12:29.500 に答える
1

アクセスprotectedするクラスでメソッドが宣言されている場合にのみ、独自のパッケージからクラスのメソッドにアクセスできます。クラスとそのメソッドの両方が同じパッケージに含まれている必要があります。そうでない場合、機能しません。Objectcloneメソッドはパッケージ内の一部として宣言されているためObject、パッケージ内でオーバーライドも宣言しない限りjava.langアクセスできません。clone

class SomeClass implements Cloneable {
    @Override
    protected Object clone() {
        ... // Do something here
    }
}

clonetype の変数を宣言する限り、同じパッケージから呼び出すことができますSomeClass

SomeClass sc1 = new SomeClass();
SomeClass sc2 = (SomeClass)sc1.clone();
于 2015-08-29T19:12:02.610 に答える