Java protected 关键字详解
很多介绍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 关键字详解相关推荐
- Java instanceof关键字详解
严格来说 instanceof 是 Java 中的一个双目运算符,由于它是由字母组成的,所以也是 Java 的保留关键字.在 Java 中可以使用 instanceof 关键字判断一个对象是否为一个类 ...
- [转载] Java static关键字详解
参考链接: Java中的static关键字 static关键字 在类中,用static声明的成员变量为静态成员变量,也成为类变量.类变量的生命周期和类相同,在整个应用程序执行期间都有效. 这里要强调一 ...
- Java this关键字详解
this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用. this.属性名 大部分时候,普通方法访问其他方法.成 ...
- Java——volatile关键字详解
关注微信公众号:CodingTechWork,一起学习进步. volatile介绍 volatile概述 volatile是比synchronized关键字更轻量级的同步机制,访问volatile变量 ...
- Java volatile关键字详解
1.关于volatile volatile是Java语言中的关键字,用来修饰会被多线程访问的共享变量,是JVM提供的轻量级的同步机制,相比同步代码块或者重入锁有更好的性能.它主要有两重语义,一是保证多 ...
- Java super关键字详解
一.super关键字作用 1:主要存在于子类方法中,用于指向子类对象中父类对象. 2:访问父类的属性 3:访问父类的函数 4:访问父类的构造函数 二. super注意的地方 this和super很像, ...
- Java关键字详解-配视频讲解链接(附带一些面试题)
Java中常用的关键字详解-配视频讲解链接(附带一些面试题) 关键字:被Java赋予了特定含义的英文单词.关于关键字的学习贯穿了整个Java的学习,结合应用理解记忆关键字,不能单纯的死记硬背,在这里通 ...
- Java static静态关键字详解(public、 private、 volatile)
文章目录 前言 static要解决什么问题? 格式 特点 static静态变量 静态变量和实例变量的区别 static静态方法 static应用场景 static 与volatile static如何 ...
- Java中的static关键字详解
** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...
最新文章
- 3dmax Vray建筑可视化入门学习教程
- 清华博士找工作7个月没着落,本科学历影响几时休?
- mysql的聚合函数综合案例_MySQL常用聚合函数详解
- Daily Scrum 10.27
- 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!...
- tp3.2php开启事务,Thinkphp 3.2.3 开启调试模式
- hbase 单机连接hadoop_Hadoop、Hbase单机环境安装
- jQuery学习笔记系列(一)——入口函数,jQuery对象和DOM对象,jQuery选择器、样式操作、效果(显示隐藏、滑入滑出、淡入淡出、自定义动画、停止动画队列)
- springboot怎么杀进程_全新Steam在线游戏 Among us太空狼人杀攻略
- flag--命令行参数解析之StringVar
- seaborn_Seaborn Kdeplot –综合指南
- 学号20155308 2016-2017-2 《Java程序设计》实验一(Java开发环境的熟悉)实验报告...
- 【新知实验室 TRTCIM】实时互动课堂最佳实践
- 北卡州立大学的数据分析学硕士项目排名大数据专业第一名
- html div中水平居中,如何在另一个div中水平居中div?
- 【 MES】 MES的另一视角
- (持续更新)Ubuntu22.04双系统的安装、扩容、重装及配置
- C++ 内存管理 —— 第一講:C++ 內存構件
- 中断处理优先级与中断相应次序
- windows7蓝牙怎么打开_windows7系统怎么调待机时间
热门文章
- mysql_safe作用_mysqld_safe
- 500g linux怎么分区吗,500G的硬盘,怎么分区比较合理?
- 电商渠道转化越来越低,究竟怎样引流才能提高转化率?
- selectprovider 分页_修改EFOracleProvider——解决分页排序问题
- java的位桶是什么_Java关于桶排序的知识点总结
- 2021陆川高考成绩查询,陆川中考成绩查询2021
- 11年写的一篇文章----智能终端安全现状及前景展望
- Java网络编程(一)- 一个简单的服务端/客户端应用程序
- iOS申请发布证书-图文详解
- JPA、Hibernate、Springdata JPA