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来说,是不可见的。

Java 访问权限修饰符以及protected修饰符的理解的更多相关文章

  1. java访问权限修饰符

    作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × ja ...

  2. Java 访问权限控制:你真的了解 protected 关键字吗?

    摘要: 对于类的成员而言,其能否被其他类所访问,取决于该成员的修饰词:而对于一个类而言,其能否被其他类所访问,也取决于该类的修饰词.在Java中,类成员访问权限修饰词有四类:private,无(包访问 ...

  3. [THINKING IN JAVA]访问权限控制

    6 访问权限控制 6.1 包:库单元 package.import.import *.import static: 修改classpath环境变量可以将自己写的类库添加至环境变量并在任何java程序中 ...

  4. java访问权限的问题

    java访问权限的问题 java 访问权限 修饰符 背景: 关于java中的四种访问修饰符,public ,default ,protected ,private的作用范围本以为很熟悉了,但碰到了这样 ...

  5. 论Java访问权限控制的重要性

    人在什么面前最容易失去抵抗力? 美色,算是一个,比如说西施的贡献薄就是忍辱负重.以身报国.助越灭吴:金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨” ...

  6. java访问权限表

    private(私有的) 默认的(什么都不写) protected(受保护的) public(公共的 ) 同一个类中 yes   yes yes   yes 同一个包中不同类之间 no yes yes ...

  7. Java访问权限控制

    访问权限控制           java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访问权限控制的等级,从最大权限到最小权限依次是:public.prote ...

  8. Java访问权限修饰符public protected friendly private用法总结(转载好文Mark)

    首先声明:Java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly.为了条理清晰,分三种不同情况来总结. 一 访问权限修饰符修饰成员变量和 ...

  9. Java 访问权限控制- protected 关键字

    protected 关键字的真正内涵 文章来源:http://blog.csdn.net/justloveyou_/article/details/61672133 很多介绍Java语言的书籍(包括& ...

随机推荐

  1. css样式属性-字体和隐藏

    1.字体 font-family:字体: <body> <div style="font-family:宋体">宋体</div> </bo ...

  2. SQL Server 将查询结果导出插入(insert)语句的简单方式

    转自 http://blog.csdn.net/danny_style/article/details/45166391 1.首先将查询结果添加到一个原数据库中不存在的表,表名随意命名. 例:SELE ...

  3. webpack 3 & React 的配置 。

    今天真是难过的一天

  4. STA分析(一) setup and hold

    timing check可以分为Dynamic Timing Analysis(Post_sim)和Static Timing Analysis STA:可以分析的很全面:仿真速度也很快:可以分析控制 ...

  5. discuz注册页修改

    大家好!近来备受发帖机困扰,备受垃圾帖子困扰.一直以来都纯粹在删帖当中,本来网站服务器就是国内服务器,这样一来很多关键字是禁止的,可不管如何设置防灌水还是无法杜绝这一事项,特别是国内空间的网站,一出现 ...

  6. Spring 自动扫描 不支持jar包 <component-scan>

    问题描述: 本机windows myeclipse10.7 运行非maven java项目,其中部分类使用spring3 注解进行注入,使用配置文件component-scan进行扫描,在本机debu ...

  7. 710 Random Pick with Blacklist

    1. 问题 给定一个黑名单,包含[0, N)的一些数,从[0, N)之间的非黑名单数中随机采样一个值. 2. 思路 字典映射 (1)计算黑名单数的长度,记作B,因为已经排除掉了B个元素,所以最后是从N ...

  8. 2016NOI冬令营day4

    上午:随机算法/近似算法与随机算法的分析方法与应用实例 不懂,完全滑水QAQ :( 下午:计算理论与NP问题 只有讲2-sat和3-sat的时候能听懂,其他的基本都在滑水:( 晚上说是什么中学生学术训 ...

  9. java.lang.NoClassDefFoundError: org/apache/http/client/config/RequestConfig

    java 错误.java.lang.NoClassDefFoundError: org/apache/http/client/config/RequestConfig 本质上是httpClient的j ...

  10. ELK学习笔记之Logstash和Filebeat解析对java异常堆栈下多行日志配置支持

    0x00 概述 logstash官方最新文档.假设有几十台服务器,每台服务器要监控系统日志syslog.tomcat日志.nginx日志.mysql日志等等,监控OOM.内存低下进程被kill.ngi ...