Objectの中のclone()はどうしてprotected修飾子ですか?

1735 ワード

1.clone()はどうしてプロcted修飾子を使っていますか?publicではありません。
Objectクラスでclone()メソッドは、Objectのclone()メソッドをクラスに書き換えていない場合には、本クラスでのみクローンの対象となる保護機構であると宣言しています。プログラムの比較で詳しく説明します。
public class User implements Cloneable {
	public static void main(String[] args) {	
	User u =new User();
		try {
			u.clone();   //    
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
}
}

public class Test {
	public static void main(String[] args) {
		User u =new User();
		u.clone(); //    ,    The method clone() from the type Object is not visible
	}
}
Test類は、User類が親タイプObjectから継承されたclone()を呼び出すことができません。User類自体は呼び出すことができます。最初に述べたステートメントプロテックスを通じて、自分自身のインスタンスオブジェクトをクローンすることができるという保証しかないということを検証しました。次にコードを見に来ました。
public class User implements Cloneable {
   
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
	public static void main(String[] args) {
		User u =new User();
		try {
			u.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}
}

public class Test {

	public static void main(String[] args) {
		User u =new User();
		try {
			u.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

User類に親タイプObjectのクローン方法を書き換えてから、Test類もUserオブジェクトをクローンできます。
結論
子類(User類)は親類(Object)が保護されているcloneを書き換える方法がない場合、それは親類Objectから引き継いできたclone()の方法を使用していますが、Test類とObject類は異なるパッケージの関係ですので、呼び出すことができません。つまり、上の第一段コードが展示されているように、エラーThe method clone()from the type Object is not visibleをコンパイルします。サブクラスのUserがclone方法を書き換えると、サブクラスのclone方法が呼び出されます。サブクラスのUserとTestは同じカバンの中にありますので、呼び出すことができます。