- 如代碼第23行,User05 的對象user,爲什麼不能直接調用Object類中受保護的clone()方法呢?
package com.atguigu.bigdata.java.chapter06;;
/**
* @author Nien
* @create 2020-05-25
*/
public class Java05_Access {
public static void main(String[] args) throws Exception {
User05 user = new User05();
// protected訪問權限 : 調用者和提供者滿足同類,同包,子類
// 方法的提供者:java.lang.Object
// 方法的調用者:com.atguigu.bigdata.java.chapter06.Java05_Access
/* 問題1:方法的調用者不是User05?
對,點的作用只是從屬關係,並不是調用關係,
真正的調用者是com.atguigu.bigdata.java.chapter06.Java05_Access
*/
/* 問題2 : Java05_Access和Object沒有父子關係?
有父子關係但是每一個類的對象都會構建一個自己的Object父類
以下不能調用clone方法的原因是Java05_Access調用自己的父類Object中的方法可以,
但是通過User調用他的父類Object中的方法是不可以的,內存結構如圖一所示
*/
// user.clone(); 無法調用
Java05_Access user2 = new Java05_Access();
//可以調用自己父類中的方法,滿足父子關係
user2.clone();
}
}
//聲明一個類默認會繼承Object類,同時繼承Object中的方法
class User05 {
}
- 正確的內存結構理解,圖一:
- 錯誤的內存結構理解,圖二:
- 爲什麼圖二是錯誤的呢,話不多說用代碼來證明:
package com.atguigu.bigdata.java.chapter06;
/**
* @author Nien
* @create 2020-05-25
*/
public class Java06_Object {
public static void main(String[] args) {
User06 user1 = new User06();
User06 user2 = new User06();
//以下輸出結合圖二是理解不了的,結合圖一就很好理解
System.out.println(user1.hashCode());//856419764
System.out.println(user1.superHashCode());//856419764
System.out.println(user2.hashCode());//621009875
System.out.println(user2.superHashCode());//621009875
}
}
class Person06{
public void test(){
System.out.println("person test");
}
}
class User06 extends Person06{
@Override
public void test(){
System.out.println("User06 test");
}
public void superTest(){
super.test();
}
public int superHashCode(){
return super.hashCode();
}
}
- 成員方法會動態綁定到com.atguigu.bigdata.java.chapter06.AAA,屬於同一個包,所以下面代碼可以調用。
package com.atguigu.bigdata.java.chapter06;
/**
* @author Nien
* @create 2020-05-25
*/
public class Java08_Clone {
public static void main(String[] args) throws CloneNotSupportedException {
AAA aaa = new AAA();
//方法的提供者:com.atguigu.bigdata.java.chapter06.AAA
//方法的調用者:com.atguigu.bigdata.java.chapter06.Java08_Clone
aaa.clone();
}
}
class AAA {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
- 編譯看左邊,左邊決定提供者,反編譯後顯示提供者是java.lang.Object,不屬於同一個包,所以以下代碼不能調用clone方法
package com.atguigu.bigdata.java.chapter06;
/**
* @author Nien
* @create 2020-05-25
*/
public class Java08_Clone {
public static void main(String[] args) throws CloneNotSupportedException {
Object aaa = new AAA();
//方法的提供者:java.lang.Object
//方法的調用者:com.atguigu.bigdata.java.chapter06.Java08_Clone
//aaa.clone();無法調用
}
}
class AAA {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
用博客見證成長,用行動證明我在努力。
如果你有緣看到我博客,對你有幫助、喜歡博客內容,請“點贊” “評論”“收藏”
一鍵三連哦!