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

你可能感兴趣的:(Java笔记: protected的真正含义)