首页 > 代码库 > 再学Java 之 private、protected、public和default的作用域

再学Java 之 private、protected、public和default的作用域

前言:如果提到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();
    }
}