【Java】學了這麼久Java,你真的理解父子類的含義嗎? 你會調用Java中的clone方法嗎?protected關鍵字你真的敢用嗎?

  • 如代碼第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();
    }
}

在這裏插入圖片描述

用博客見證成長,用行動證明我在努力。
如果你有緣看到我博客,對你有幫助、喜歡博客內容,請“點贊” “評論”“收藏”一鍵三連哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章