最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的權限修飾符(protected)示例詳解

 更新時間:2021年01月13日 15:19:58   作者:肥魚先生  
這篇文章主要給大家介紹了關于Java中權限修飾符(protected)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

大部分來自:https://blog.csdn.net/justloveyou_/article/details/61672133。并在這個博客的基礎上,加上了自己的一些理解。

權限控制表

修飾詞 本類 同一個包的類 繼承類 其他類
private × × ×
無(默認) × ×
protected ×
public

關于protected

最近在看Effective Java時,遇到了一個關于protected修飾符的問題。這個問題中,對于它的認識與我之前對它的認識有一些出入。所以在這里記錄一下。

很多介紹Java語言的書籍(包括《Java編程思想》)都對protected介紹的比較的簡單,基本都是一句話,就是:被protected修飾的成員對于本包和其子類可見。這種說法有點太過含糊,常常會對大家造成誤解。實際上,protected的可見性在于兩點:

  • 父類的protected成員是包內(nèi)可見的,并且對子類可見;
  • 若子類與父類不在同一包中,那么在子類中,子類實例可以訪問其從父類繼承而來的protected方法,而不能訪問父類實例的protected方法

在碰到涉及protected成員的調(diào)用時,首先要確定出該protected成員來自何方,其可見性范圍是什么,然后就可以判斷出當前用法是否可行。

這里有一個疑問就是上述結(jié)論的第二點。咋一看是比較繞口的,甚至有點矛盾,但是在看了下面的幾個例子之后,理解就會更加深一點。

示例一

p1/Father1.java

package basic.testprotected.p1;

public class Father1 {
 protected void f() {} // 父類Father1中的protected方法
}

p1/Son1.java

package basic.testprotected.p1;

public class Son1 extends Father1{}

p11/Son11.java

package basic.testprotected.p11;

import basic.testprotected.p1.Father1;

public class Son11 extends Father1{}

p1/Test1.java

這里寫圖片描述

首先看(1)(3),其中的f()方法從類Father1繼承而來,其可見性是包p1及其子類Son1和Son11,而由于調(diào)用f()方法的類Test1所在的包也是p1,因此(1)(3)處編譯通過。也就是說,如果我們換一個包,比如Test11.java在p11下,那么將都不可訪問。如下:

這里寫圖片描述

其次看(2)(4),其中的clone()方法的可見性是java.lang包及其所有子類,對于語句son1.clone();son11.clone();,二者的clone()在類Son1、Son11中是可見的,但對Test1是不可見的,因此(1)(3)處編譯不通過。也就是說,如果在Son1或Son11這兩個類中調(diào)用clone()方法,則是可以編譯通過的。

這里寫圖片描述 

其實到此,我所遇到的問題已基本解決。因為我遇到的情況和這里的示例代碼是一模一樣的。

示例二

p2/MyObject2.java

package basic.testprotected.p2;

public class MyObject2 {
 protected Object clone() throws CloneNotSupportedException{
 return super.clone();
 }
}

p22/Test2.java

這里寫圖片描述 

對于(1)而言,clone()方法來自于類MyObject2本身,因此其可見性為包p2及MyObject2的子類,雖然Test2是MyObject2的子類,但在Test2中不能訪問父類MyObject2的protected方法clone(),因此編譯不通過;對于(2)而言,由于在Test2中訪問的是其本身實例的從父類MyObject2繼承來的的clone(),因此編譯通過。所以在這里,就很好地闡述了上面所給的第二條結(jié)論:

若子類與父類不在同一包中,那么在子類中,子類實例可以訪問其從父類繼承而來的protected方法,而不能訪問父類實例的protected方法。

為什么要這樣以及這樣要如何解釋呢?

我想這可能需要思考一下對子類可見的定義。先加一個構造函數(shù),在這個構造函數(shù)里面,可以訪問clone方法,這個方法來自MyObject2。

這里寫圖片描述 

所以,再寫一個類Test22繼承自MyObject2,然后重新寫個方法testSuperClone(),如下:

這里寫圖片描述 

感覺這兩個之間還是存在一些差距。所以,我的不太恰當理解為:對子類的實例可見,即可以在子類中,通過子類的實例去訪問相應的protected方法。

示例三

p3/MyObject3.java

package basic.testprotected.p3;

import basic.testprotected.p33.Test3;

public class MyObject3 extends Test3 {}

p33/Test3.java

這里寫圖片描述 

對于(1)而言,clone()方法來自于類Test3,因此其可見性為包p33及其子類MyObject3,而(1)正是在p33的類Test3中調(diào)用,屬于同一包,編譯通過。

示例四

p4/MyObject4.java

package basic.testprotected.p4;

import basic.testprotected.p44.Test4;

public class MyObject4 extends Test4 {
 protected Object clone() throws CloneNotSupportedException {
 return super.clone();
 }
}

p44/Test4.java

這里寫圖片描述 

對于(1)而言,clone()方法來自于類MyObject4,因此其可見性為包p4及其子類(此處沒有子類),而類Test4卻在包p44中,因此不滿足可見性,編譯不通過。

示例五

p5/MyObject5.java

package basic.testprotected.p5;

public class MyObject5 {
 protected Object clone() throws CloneNotSupportedException{
 return super.clone();
 }
}

p5/Test5.java

這里寫圖片描述 

對于(1)而言,clone()方法來自于類MyObject5,因此其可見性為包p5及其子類(此處沒有子類),而類Test5也在包p5中,因此滿足可見性,編譯通過。

示例六

package p6;

class MyObject6 extends Test6{}

public class Test6 {
 public static void main(String[] args) {
 MyObject6 obj = new MyObject6();
 obj.clone(); // Compile OK -------(1)
 }
}

對于(1)而言,clone()方法來自于類Test6,因此其可見性為包p6及其子類MyObject6,而類Test6也在包p6中,因此滿足可見性,編譯通過。

示例七

package p7;

class MyObject7 extends Test7 {
 public static void main(String[] args) {
 Test7 test = new Test7();
 test.clone(); // Compile Error ----- (1)
 }
}

public class Test7 {
}

對于(1)而言,clone()方法來自于類Object,因此該clone()方法可見性為包java.lang及其子類Test7,由于類MyObject7不在此范圍內(nèi),因此不滿足可見性,編譯不通過。

總結(jié)

到此這篇關于Java中權限修飾符(protected)的文章就介紹到這了,更多相關Java權限修飾符(protected)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Spring Security認證流程

    詳解Spring Security認證流程

    這篇文章主要介紹了Spring Security認證流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 詳解如何在Java中創(chuàng)建Excel迷你圖

    詳解如何在Java中創(chuàng)建Excel迷你圖

    迷你圖是一種簡潔而有效的數(shù)據(jù)可視化方式,常用于展示趨勢和變化,通常被用于數(shù)據(jù)儀表盤、報告和展示中,以便在有限的空間內(nèi)展示多個數(shù)據(jù)集的趨勢,今天小編為大家介紹如何在Java中創(chuàng)建Excel迷你圖,需要的朋友可以參考下
    2023-10-10
  • Java阻塞隊列BlockingQueue詳解

    Java阻塞隊列BlockingQueue詳解

    這篇文章主要介紹了Java阻塞隊列BlockingQueue,文章通過隊列的類型展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • Spring Bean的定義及三種創(chuàng)建方式

    Spring Bean的定義及三種創(chuàng)建方式

    本文主要介紹了Spring容器獲取Bean的9種方式小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • java服務器端微信、支付寶支付和退款功能

    java服務器端微信、支付寶支付和退款功能

    這篇文章主要為大家詳細介紹了java服務器端微信、支付寶支付和退款功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 詳解Java文件下載的幾種實現(xiàn)方式

    詳解Java文件下載的幾種實現(xiàn)方式

    這篇文章主要介紹了詳解Java文件下載的幾種實現(xiàn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Dubbo服務無法注冊到ZK上問題

    Dubbo服務無法注冊到ZK上問題

    這篇文章主要介紹了Dubbo服務無法注冊到ZK上問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • springboot項目編譯提示無效的源發(fā)行版17解決辦法

    springboot項目編譯提示無效的源發(fā)行版17解決辦法

    這篇文章主要給大家介紹了關于springboot項目編譯提示無效的源發(fā)行版17解決辦法,這個錯誤意味著你的Spring Boot項目正在使用Java 17這個版本,但是你的項目中未配置正確的Java版本,需要的朋友可以參考下
    2023-06-06
  • mybatis多個接口參數(shù)的注解使用方式(@Param)

    mybatis多個接口參數(shù)的注解使用方式(@Param)

    這篇文章主要介紹了mybatis多個接口參數(shù)的注解使用方式(@Param),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • SpringBoot通過Nginx代理獲取真實IP

    SpringBoot通過Nginx代理獲取真實IP

    springboot作為后臺代碼,獲取到的登錄IP是前臺的代理服務器地址,并不是用戶的真實IP地址,本文主要介紹了SpringBoot通過Nginx代理獲取真實IP,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01

最新評論

沾益县| 腾冲县| 浙江省| 阿坝县| 新郑市| 贵德县| 渭南市| 图们市| 吉木萨尔县| 柘城县| 吴旗县| 无棣县| 三穗县| 舟曲县| 应城市| 金溪县| 胶南市| 和龙市| 西平县| 会昌县| 临沂市| 乐山市| 华安县| 马山县| 麻城市| 清河县| 黎平县| 扎赉特旗| 土默特右旗| 龙南县| 达尔| 揭阳市| 林口县| 仲巴县| 靖西县| 家居| 承德县| 泾源县| 大同县| 临沭县| 固始县|