关于protected关键字,即使是Java初学者也能够说出它的含义:protected修饰的成员可以被子类访问。但是这样理解并不完全准确,下面考虑它的真正含义。

Java访问控制回顾

Java语言定义的访问级别有private、package、protected、public,从前往后访问权限依次扩大。protected和public成员可能被其他包访问,因此被认为是契约的一部分。其他三种访问都容易理解,而protected与继承有关,因此需要稍微注意。

简单示例

考虑如下Java程序,Zu、Fu、Zi(祖、父、子)分别定义在a、b、c三个包中,且Zu->Fu->Zi。Fu分别访问了来自this、Fu、Zu、Zi的protected成员age。那么下面test哪个能通过编译,哪个不能?

package a;

public class Zu {
protected int age = 67;
}
package b;

import a.Zu;
import c.Zi; public class Fu extends Zu { private void test1() {
System.out.println(this.age);
} private void test2(Fu f) {
System.out.println(f.age);
} private void test3(Zu z) {
System.out.println(z.age);
} private void test4(Zi z) {
System.out.println(z.age);
}
}
package c;

import b.Fu;

public class Zi extends Fu {

}

真正含义

准确的讲,一个受保护的成员除了可以被自身以及同一个包的类访问之外,还可以通过对象引用访问,只要满足访问者类型比引用类型“宽”(同一类型或者父类)。

根据上述规则,test1、test2访问和被访问者类型都是Fu,因此编译通过。test4访问者是Fu,被访问者是Zi,Fu是Zi的父类,因此编译通过。只有test3中被访问的引用为Zu,不是Fu的子类,因此编译不通过,规则掌握之后就很简单了。

Java笔记: protected的真正含义的更多相关文章

  1. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

  2. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  3. Java笔记 —— 继承

    Java笔记 -- 继承 h2{ color: #4ABCDE; } a{ text-decoration: none!important; } a:hover{ color: red !import ...

  4. Java笔记 —— 方法重载和方法重写

    Java笔记 -- 方法重载和方法重写 h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: red ...

  5. 《Java笔记——基础知识点》

    Java笔记--基础知识点       位运算符操作的都是整型的数据. 位运算符是直接对整数的二进制进行计算. 整数不能进行逻辑运算. 运算符优先级别由高到低分别是:() > ! > 算术 ...

  6. 【转】java中volatile关键字的含义

    java中volatile关键字的含义   在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

  7. JAVA中protected的作用

    JAVA中protected的作用   1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是 ...

  8. 转:java中volatile关键字的含义

    转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

  9. java笔记00-目录

    --2013年7月26日17:49:59 学习java已久,趁最近有空,写一个总结: java笔记01-反射:

随机推荐

  1. 无线冲方案 WPC Qi v1.2.4 update

    参考: 1. Qi标准v1.2.4最新版 2. Qi Baseline Power Profile (BPP) and Extended Power Profile (EPP) Wireless Ch ...

  2. NoSQL 是什么

    NoSQL 全称 Not only SQL ,是一种相对较新的数据库设计方式,传统的关系型数据库使用的是固定模式,并将数据分割在多个表中,然而,对于大数据集的情况,数据量太大使其难以存放在单一的服务器 ...

  3. CTU Open Contest 2019 AB题

    小菜鸡飘过 A: Beer Barrels 题意:给出四个整数:A,B,K,C,:A,B,C都是大于0的个位数,问在所有仅有A或者B组成的K位数中,数字C的个数是多少 思路: 1.先考虑特殊情况: ( ...

  4. Pytorch 分割模型构建和训练【直播】2019 年县域农业大脑AI挑战赛---(四)模型构建和网络训练

    对于分割网络,如果当成一个黑箱就是:输入一个3x1024x1024 输出4x1024x1024. 我没有使用二分类,直接使用了四分类. 分类网络使用了SegNet,没有加载预训练模型,参数也是默认初始 ...

  5. Red_Hat yum源配置

    http://www.linuxidc.com/Linux/2016-06/132171.htm

  6. ROS学习笔记9-创建ros消息和服务

    该节内容主要来自于官方文档的两个小节:1.使用rosed来编辑2.创建ros消息的服务 先来看rosed: rosedrosed命令是rosbash的一部分,使用rosed可以直接编辑包中的一个文件, ...

  7. linux 串口通信 编程详解

    计算机串口的引脚说明 序号 信号名称 符号 流向 功能 3 发送数据 TXD DTE→DCE DTE发送串行数据 2 接收数据 RXD DTE←DCE DTE 接收串行数据 7 请求发送 RTS DT ...

  8. Fiddler抓取HTTPS

    对于想抓取HTTPS的测试初学者来说,常用的工具就是fiddler.可是在初学时,大家对于fiddler如何抓取HTTPS真是伤了脑筋,可能你一步步按着网上的帖子成功了,那当然是极好的. 有可能没有成 ...

  9. Metasploit学习笔记——强大的Meterpreter

    1. Meterpreter命令详解 1.1基本命令 使用Adobe阅读器渗透攻击实战案例打开的Meterpreter会话实验,靶机是WinXP.由于所有命令与书中显示一致,截图将书中命令记录下来. ...

  10. Codeforces 1296E2. String Coloring (hard version)

    这道题和HDU1257一模一样,一开始窝都用贪心直接解,没法理解为什么求一个最长下降序列,直到看了巨巨的题解,先给出一个定理,Dilworth's theorem,离散学不好,补题两行泪,该定理是说, ...