一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 關于protected修飾符詳解-源于Cloneable接口

關于protected修飾符詳解-源于Cloneable接口

2022-03-09 13:19FinelyYang Java教程

這篇文章主要介紹了protected修飾符詳解-源于Cloneable接口,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Cloneable接口是一個空接口,僅用于標記對象,Cloneable接口里面是沒有clone()方法,clone()方法是Object類里面的方法,默認實現是一個Native方法。

 

今天在做對象拷貝的時候發現一個問題

某類實現Cloneable接口后,還要重新實現Object類中的clone()方法:

關于protected修飾符詳解-源于Cloneable接口

感覺有點奇怪,這個類里也沒做什么特殊的操作啊,就是調用一下父類的clone方法:

關于protected修飾符詳解-源于Cloneable接口

這太麻煩了,我們都知道protected的權限范圍:

關于protected修飾符詳解-源于Cloneable接口

也就是說子類是可以訪問protected修飾的方法的。

 

接下來按照我們的思路寫代碼實現

1.去掉User類中的clone方法:

關于protected修飾符詳解-源于Cloneable接口

接下來直接調用Object類中的clone方法:

關于protected修飾符詳解-源于Cloneable接口

這時發現,報錯啦!!! 子類實例竟然不能調用父類的clone方法!!!我們會有疑問:Object類是所有類的父類,那么為什么子類不能訪問父類protected修飾的方法呢?

其實是因為:“與基類不在同一個包中的子類,只能訪問自身從基類繼承而來的受保護成員,而不能訪問基類實例本身的受保護成員”。這句話是什么意思?不要急,接下來我們用代碼詳細解釋。

所以這里是因為,User類和Object類不同包,導致protected方法訪問不了,接下來我們驗證一下:

關于protected修飾符詳解-源于Cloneable接口

關于protected修飾符詳解-源于Cloneable接口

沒有錯誤,可以直接調用父類protected方法getA:

關于protected修飾符詳解-源于Cloneable接口

此時Student類和Person類在同一個包下,假如不在同一個包中呢:

關于protected修飾符詳解-源于Cloneable接口

關于protected修飾符詳解-源于Cloneable接口

此時報錯了:

關于protected修飾符詳解-源于Cloneable接口

我們發現此時子類不能調用父類的protected方法了。

 

為什么應用了Cloneable接口的類

 

通常還必須重寫一個public的clone()方法

這里有兩個原因:

(1) 如果不重寫,由于Object.clone()是proteced屬性,所以這個clone()方法將無法在外部被調用,更精確地說,無法在目標類之外的任何地方調用。這樣就使得克隆失去了用武之地。

(2) Object.clone()畢竟只是提供了淺層拷貝,對于基本類型的字段,可以說它成功克隆了。但對于對象型字段,它并沒有實現克隆的功能,僅僅做了一個賦值。試運行一下下面的代碼就會更清楚了:

public class Student implements Cloneable 
{
    private int id;
    private String name;
    public StringBuffer sb = new StringBuffer(""); 
    public Student() {
        this.id = 744;
        this.name = "FL";
    }
 
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
 
    public boolean equals(Object obj) {
        return this.id == ((Student) obj).id;
    }
 
    public String toString() {
        return "Student id : " + id + " Name " + name;
    }    
 
    public static void main(String[] args) throws CloneNotSupportedException 
    {
        Student s1 = new Student(101, "WangQiang");
        Student s2 = (Student) s1.clone();
        System.out.println(s1 == s2);
        System.out.println(s1);
        System.out.println(s2); 
        s1.sb.append("s1"s string");
        System.out.println("s2.sb"s value = " + s2.sb.toString());
        System.out.println(s1.sb==s2.sb);        
    }
}

 

總結

對于protected的成員或方法,要分子類和基類是否在同一個包中。與基類不在同一個包中的子類,只能訪問自身從基類繼承而來的受保護成員和方法,而不能訪問基類實例本身的受保護成員和方法。在相同包時,protected和public是一樣的。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/xiaoxiangzi520/article/details/79019670

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 特级淫片欧美高清视频蜜桃 | 楚乔传第二部免费播放电视连续剧 | 国内自拍成人网在线视频 | 欧美精品久久久亚洲 | 亚洲第一区在线观看 | 日韩视频在线精品视频免费观看 | 无码一区国产欧美在线资源 | japan在线观看| 特黄视频 | 免费xxxx日本大片在线观看 | 亚洲精品乱码久久久久久蜜桃 | 日本免费高清在线观看播放 | 日本xxx在线观看免费播放 | 亚洲成人免费观看 | 贤妻良母电影日本 | 草嫩社区 | 日日爽 | 日韩伦理在线观看 | 亚洲成年网站在线观看 | 成人免费体验区福利云点播 | 7777奇米| 果冻传媒在线视频播放观看 | 狠狠色96视频 | 67id人成观看免费 | 69一级毛片| 青青草99久久精品国产综合 | 精品久久香蕉国产线看观看亚洲 | 538亚洲欧美国产日韩在线精品 | 亚洲国产成人久久99精品 | 深夜福利影院 | 国产在线麻豆波多野结衣 | 青青草成人在线 | 398av影院视频在线 | 小舞丝袜调教喷水沦为肉奴 | 青青草成人在线观看 | 无人影院在线播放 | 久久无码AV亚洲精品色午夜麻豆 | 国产一久久香蕉国产线看观看 | 亚洲无线一二三四区 | 国产精品国产三级在线专区 | 公园暴露娇妻小说 |