很多介绍Java语言的书籍(包括《Java编程思想》)都对protected介绍的比较的简单,基本都是一句话,就是: 被 protected 修饰的成员对于本包和其子类可见。这种说法有点太过含糊,常常会对大家造成误解。实际上,protected的可见性在于两点:

  • 基类的 protected 成员是包内可见的,并且对子类可见;
  • 若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。

我们可以通过以下几个关于protected方法可见性的例子来进一步掌握protected关键字。在碰到涉及protected成员的调用时,首先要确定出该protected成员来自何方,其可见性范围是什么,然后就可以判断出当前用法是否可行了,看下面七个例子:

package p1;
public class Father1 {protected void f() {}    // 父类Father1中的protected方法
}package p1;
public class Son1 extends Father1 {}package p11;
public class Son11 extends Father1{}package p1;
public class Test1 {public static void main(String[] args) {Son1 son1 = new Son1();son1.f(); // Compile OK     ----(1)son1.clone(); // Compile Error     ----(2)
 Son11 son = new Son11();    son11.f(); // Compile OK     ----(3)son11.clone(); // Compile Error     ----(4)
    }
}

对于上面的示例,首先看(1)(3),其中的f()方法从类Father1继承而来,其可见性是包p1及其子类Son1和Son11,而由于调用f()方法的类Test1所在的包也是p1,因此(1)(3)处编译通过。其次看(2)(4),其中的clone()方法的可见性是java.lang包及其所有子类,对于语句"son1.clone();"和"son11.clone();",二者的clone()在类Son1、Son11中是可见的,但对Test1是不可见的,因此(2)(4)处编译不通过。

package p2;
class MyObject2 {protected Object clone() throws CloneNotSupportedException{return super.clone();}
}package p22;
public class Test2 extends MyObject2 {public static void main(String args[]) {MyObject2 obj = new MyObject2();obj.clone(); // Compile Error         ----(1)
 Test2 tobj = new Test2();tobj.clone(); // Complie OK         ----(2)
    }
}

对于(1)而言,clone()方法来自于类MyObject2本身,因此其可见性为包p2及MyObject2的子类,虽然Test2是MyObject2的子类,但在Test2中不能访问基类MyObject2的protected方法clone(),因此编译不通过;对于(2)而言,由于在Test2中访问的是其本身实例的从基类MyObject2继承来的的clone(),因此编译通过。

package p3;
class MyObject3 extends Test3 {
}package p33;
public class Test3 {public static void main(String args[]) {MyObject3 obj = new MyObject3();obj.clone();   // Compile OK     ------(1)
  }
}

对于(1)而言,clone()方法来自于类Test3,因此其可见性为包p33及其子类MyObject3,而(1)正是在p33的类Test3中调用,属于同一包,编译通过。

package p4;
class MyObject4 extends Test4 {protected Object clone() throws CloneNotSupportedException {return super.clone();}
}package p44;
public class Test4 {public static void main(String args[]) {MyObject4 obj = new MyObject4();obj.clone(); // Compile Error      -----(1)
  }
}

对于(1)而言,clone()方法来自于类MyObject4,因此其可见性为包p4及其子类(此处没有子类),而类Test4却在包p44中,因此不满足可见性,编译不通过。

package p5;class MyObject5 {protected Object clone() throws CloneNotSupportedException{return super.clone();}
}
public class Test5 {public static void main(String[] args) throws CloneNotSupportedException {MyObject5 obj = new MyObject5();obj.clone(); // Compile OK        ----(1)
    }
}

对于(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不在此范围内,因此不满足可见性,编译不通过。

转载于:https://www.cnblogs.com/powerwu/articles/9237397.html

Java protected 关键字详解相关推荐

  1. Java instanceof关键字详解

    严格来说 instanceof 是 Java 中的一个双目运算符,由于它是由字母组成的,所以也是 Java 的保留关键字.在 Java 中可以使用 instanceof 关键字判断一个对象是否为一个类 ...

  2. [转载] Java static关键字详解

    参考链接: Java中的static关键字 static关键字 在类中,用static声明的成员变量为静态成员变量,也成为类变量.类变量的生命周期和类相同,在整个应用程序执行期间都有效. 这里要强调一 ...

  3. Java this关键字详解

    this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用. this.属性名 大部分时候,普通方法访问其他方法.成 ...

  4. Java——volatile关键字详解

    关注微信公众号:CodingTechWork,一起学习进步. volatile介绍 volatile概述 volatile是比synchronized关键字更轻量级的同步机制,访问volatile变量 ...

  5. Java volatile关键字详解

    1.关于volatile volatile是Java语言中的关键字,用来修饰会被多线程访问的共享变量,是JVM提供的轻量级的同步机制,相比同步代码块或者重入锁有更好的性能.它主要有两重语义,一是保证多 ...

  6. Java super关键字详解

    一.super关键字作用 1:主要存在于子类方法中,用于指向子类对象中父类对象. 2:访问父类的属性 3:访问父类的函数 4:访问父类的构造函数 二. super注意的地方 this和super很像, ...

  7. Java关键字详解-配视频讲解链接(附带一些面试题)

    Java中常用的关键字详解-配视频讲解链接(附带一些面试题) 关键字:被Java赋予了特定含义的英文单词.关于关键字的学习贯穿了整个Java的学习,结合应用理解记忆关键字,不能单纯的死记硬背,在这里通 ...

  8. Java static静态关键字详解(public、 private、 volatile)

    文章目录 前言 static要解决什么问题? 格式 特点 static静态变量 静态变量和实例变量的区别 static静态方法 static应用场景 static 与volatile static如何 ...

  9. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

最新文章

  1. 3dmax Vray建筑可视化入门学习教程
  2. 清华博士找工作7个月没着落,本科学历影响几时休?
  3. mysql的聚合函数综合案例_MySQL常用聚合函数详解
  4. Daily Scrum 10.27
  5. 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!...
  6. tp3.2php开启事务,Thinkphp 3.2.3 开启调试模式
  7. hbase 单机连接hadoop_Hadoop、Hbase单机环境安装
  8. jQuery学习笔记系列(一)——入口函数,jQuery对象和DOM对象,jQuery选择器、样式操作、效果(显示隐藏、滑入滑出、淡入淡出、自定义动画、停止动画队列)
  9. springboot怎么杀进程_全新Steam在线游戏 Among us太空狼人杀攻略
  10. flag--命令行参数解析之StringVar
  11. seaborn_Seaborn Kdeplot –综合指南
  12. 学号20155308 2016-2017-2 《Java程序设计》实验一(Java开发环境的熟悉)实验报告...
  13. 【新知实验室 TRTCIM】实时互动课堂最佳实践
  14. 北卡州立大学的数据分析学硕士项目排名大数据专业第一名
  15. html div中水平居中,如何在另一个div中水平居中div?
  16. 【 MES】 MES的另一视角
  17. (持续更新)Ubuntu22.04双系统的安装、扩容、重装及配置
  18. C++ 内存管理 —— 第一講:C++ 內存構件
  19. 中断处理优先级与中断相应次序
  20. windows7蓝牙怎么打开_windows7系统怎么调待机时间

热门文章

  1. mysql_safe作用_mysqld_safe
  2. 500g linux怎么分区吗,500G的硬盘,怎么分区比较合理?
  3. 电商渠道转化越来越低,究竟怎样引流才能提高转化率?
  4. selectprovider 分页_修改EFOracleProvider——解决分页排序问题
  5. java的位桶是什么_Java关于桶排序的知识点总结
  6. 2021陆川高考成绩查询,陆川中考成绩查询2021
  7. 11年写的一篇文章----智能终端安全现状及前景展望
  8. Java网络编程(一)- 一个简单的服务端/客户端应用程序
  9. iOS申请发布证书-图文详解
  10. JPA、Hibernate、Springdata JPA