Java 访问权限修饰符以及protected修饰符的理解
发布日期:2022-04-02 18:15:45 浏览次数:8 分类:博客文章

本文共 3213 字,大约阅读时间需要 10 分钟。

2017-11-04 22:28:39

  • 访问权限修饰符的权限

  • 访问修饰符protected的权限理解

在Core Java中有这样一段话“在Object类中,clone方法被声明为protected,因此无法直接调用anObject.clone()。子类只能直接调用受保护的clone方法克隆它自己。为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象”。但是不是所有的子类都可以访问受保护的方法吗?不是每个子类都是Object的之类吗?下面就用例子来说明下protected访问修饰符的问题。

1、在package1中创建SuperClass.java文件,里面有一个protected方法:

package package1;            public class SuperClass {          protected void method(){              System.out.println("This is a protected method in the super class .");          }      }

 

 2、在同一个包中创建SubClass1.java文件,类SubClass1和类SubClass2均继承自SuperClass:

package package1;            public class SubClass1 extends SuperClass {          public static void main(String[] args) {              SuperClass sup = new SuperClass();              SubClass1 sub1 = new SubClass1();              SubClass2 sub2 = new SubClass2();              sup.method();  //Compile OK              sub1.method();  //Compile OK              sub2.method();  //Compile OK          }      }      class SubClass2 extends SuperClass{                }

编译全部通过,不难理解,protected方法对同包中的类是可见的

 

3、如果在另一个包package2中创建SubClass1.java文件,内容与包package1中的SubClass1.java内容相同。

package package2;            import package1.SuperClass;            public class SubClass1 extends SuperClass {          public static void main(String[] args) {              SubClass1 sub1 = new SubClass();              SubClass2 sub2 = new SubClass2();              Sub1.method();  //Compile OK              sub2.method();  //Compile Error          }            }      class SubClass2 extends SuperClass{                }

这样编译器会在sub2.method()处报错误The method clone from the type SuperClass is not visiuable。这种情况下,sub1和sub2都从父类中继承到名为method()的protected方法,sub1.method()编译通过,而sub2.method()编译没有通过,因为sub2是他所在的类的父类的另一个子类。由此我们可以想到:不能在一个子类中访问另一个子类protected方法,尽管这两个子类继承自同一个父类

 

4、如果我们在package2的SubClass1.class中重写SubClass2类中的SuperClass的method方法。

package package2;            import package1.SuperClass;            public class SubClass1 extends SuperClass {          public static void main(String[] args) {              SubClass1 sub1 = new SubClass1();              SubClass2 sub2 = new SubClass2();              sub1.method();  //Compile OK              sub2.method();  //Compile OK          }            }      class SubClass2 extends SuperClass{          protected void method(){              super.method();          }      }

这种情况跟第一种类似,protected方法可以被同一个包中的类访问。当在SubClass2类中覆盖method()方法时,SubClass2类和SubClass1类在同一个包下,所以此protected方法对SubClass1类可见现在应该可以理解“为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象这句话了吧

 

5、如果在子类中调用父类对象的protected方法

package package2;            import package1.SuperClass;            public class SubClass extends SuperClass {          public static void main(String[] args) {              SuperClass sup = new SuperClass();              SubClass sub = new SubClass();              sup.method(); //Compile Error              sub.method();  //Compile OK          }            }

这里我在SubClass继承另一个包中的SuperClass,这个SuperClass中有一个名为method()的protected方法。在SubClass类中调用SubClass类的实例sub的method()方法,编译不会报错。而同样调用SuperClass类的实例sup的method()方法,编译报错!

现在必须明确的是:类SubClass确实是继承了类SuperClass(包括它的method方法),所以在类SubClass中可以调用自己的method方法。但类SuperClass的protected方法对其不同包子类SubClass来说,是不可见的。

 

转载地址:https://www.cnblogs.com/hyserendipity/p/7784931.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java IO流-随机访问流
下一篇:Java final关键字

发表评论

最新留言

不错!
[***.144.177.141]2024年03月02日 21时29分53秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

vscode 不能使用中文输入法_vscode中vim插件设置 2019-04-21
fi sap 凭证冲销 稅_SAP中的成本要素 2019-04-21
kangle主机怎么配置MySQL_kangle web服务+easypanel主机控制面板快速搭建网站和数据库以及管理空间详细教程... 2019-04-21
mysql 翻页 存储过程_MySQl通用翻页(存储过程) 2019-04-21
2020word替换所有文本_Excel字符函数(5):REPLACE、SUBSTITUTE查找替换函数之区别... 2019-04-21
win10安装ipython_win10环境 ipython app.py 8080 这里为什么是ipython 这步无法启动 2019-04-21
mysql多字段存储过程_mysql 的存储过程_多字段 2019-04-21
python怎么创建字符串列表_如何在python列表中为每个字符串创建子列表? 2019-04-21
vba ado 执行多条mysql 语句_access 按钮 多条sql语句 VBA 2019-04-21
弹性方法计算连续梁板内力_(梁板结构)混凝土结构设计复习题及答案 2019-04-21
java root权限_android java获得root权限调用linux命令 | 学步园 2019-04-21
java最小化窗体_JAVA窗体最大化最小化控制+托盘 2019-04-21
java 注解 数组默认值_Java注解默认值 2019-04-21
java流程语句_Java流程控制语句 2019-04-21
java require_java正则中的requireEnd和hitEnd 2019-04-21
400错误java_java代码转化成c#代码 报400错误 2019-04-21
java常见对象_Java 常见对象 02 2019-04-21
spring java配置_Spring Java配置要点 2019-04-21
共享内存 java_java - Java客户端-服务器编程:客户端之间的共享内存 - 堆栈内存溢出... 2019-04-21
java布局管理器空布局_Java图形化界面设计——布局管理器之null布局(空布局)... 2019-04-21