• Java笔记: protected的真正含义


    关于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的子类,因此编译不通过,规则掌握之后就很简单了。

  • 相关阅读:
    C# 读写ini文件
    How to Create DLL(Dynamic link library)
    运算符优先级
    汇编指令:lea
    AT&T汇编语法与x86语法基本区别
    栈的生长方向理解
    Mac Mojave 10.14.5安装python tesserocr
    一台电脑发布多个网站
    局域网内电脑之间互相访问网站
    判断两个对象是否相等——javascript实现
  • 原文地址:https://www.cnblogs.com/cocode/p/12275093.html
Copyright © 2020-2023  润新知