前言:如果提到protected的访问控制级别,您的第一反应是”只能是子类才可以访问“,那么您很可能需要往下看。
首先,大致介绍一下各个访问控制符的访问控制级别(具体的介绍很多大牛的博文都有介绍,我就不细说了,可以点击这里查看),如下图:
private | default | protected | public | |
同一个类中 | √ | √ | √ | √ |
同一个包中 | √ | √ | √ | |
子类中 | √ | √ | ||
全局范围内 | √ |
在这里,很多人都存在一个误区,就是,认为protected修饰的方法只能在子类中才能访问,其他情况下不行;事实上,正确的表述方式应该是”如果在同一个包,则protected修饰的成员都可以被访问到;假如不在同个包,则只有子类才能访问到“。
下面写一个实例(也可以到这里 下载):
(1)首先是程序的结构,这里,有两个包,分别有com.harvin包含parent和child类;com.other包含other_child类
(2)com.harvin.Parent类的代码:
package com.harvin;
/*
* @author harvin
*/
public class Parent {public static void main(String[] args){
}
private void private_method() { }
protected void protected_method() { }
void default_method(){ }
public void public_method(){ }}
(3)com.harvin.child类代码:
package com.harvin;public class Child{
private void private_method() {
//这里会报错。因为private修饰的成员,其他类均不可访问
new Parent().private_method();
}
protected void protected_method() {
//同一个包内,不过是不是子类,都可以访问到protected成员
new Parent().protected_method();
}
void default_method(){
//同一个包内,也可以访问
new Parent().default_method();
}
public void public_method(){
new Parent().public_method();
}
}
(4)com.other.other_child类的代码:
package com.other;
import com.harvin.*;public class Other_child extends Parent{
private void private_method() {
//这里会报错。因为private修饰的成员,其他类均不可访问
super.private_method();
}
protected void protected_method() {
//这里会报错。不在同一个包内,但是是parent的子类,所以可以访问
super.protected_method();
}
void default_method(){
//这里会报错。不在同一个包内,不可以访问
super.default_method();
}
public void public_method(){
super.public_method();
}
}
再学Java 之 private、protected、public和default的作用域,布布扣,bubuko.com