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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 无人区在线观看免费观看 | 99精品国产高清自在线看超 | 扒开老女人 | 掀开奶罩边躁狠狠躁软学生 | 四虎影视永久在线观看 | 精品国产91久久久久久久 | 91看片淫黄大片.在线天堂 | 日本在线观看www | 性生大片免费看 | 91tm视频| 欧美久在线观看在线观看 | 亚洲国产成人在人网站天堂 | 色吧五月婷婷 | 女女同性做爰xxoo亲吻 | 日韩ab | 1024香蕉视频 | 啊啊啊好爽在线观看 | 国产精品不卡高清在线观看 | 好湿好紧太硬了我太爽了网站 | 日本三级免费看 | 羞羞色男人的天堂伊人久久 | chinesespanking调教 | 波多野结衣在线免费观看 | 人性本色| 暖暖暖免费观看在线观看 | 古代翁熄乩伦小说h | 成人免费播放 | 欧美最猛性xxxxx短视频 | h网站国产| 亚洲欧美国产另类视频 | 极品手交handjobtattoo | 无限资源在线观看完整版免费下载 | 日韩精品特黄毛片免费看 | 9久热这里只有精品免费 | 国产在线观看一区 | 激情三级做爰在线观看激情 | 国产精品色拉拉免费看 | 9966国产精品视频 | 吉川爱美与黑人解禁 | 99热这里有精品 | 国内精品久久久久久中文字幕 |