欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中的权限修饰符的访问范围详解

程序员文章站 2024-02-20 14:04:10
...

Java*有四个权限修饰符,分别是private, default(表示不写), protected,  public,访问权限范围由小到大。下面我们分别介绍权限修饰符修饰类、修饰成员修饰构造器的情况。

一、修饰类

修饰类只有两个权限修饰符:public和default

  • public:全局访问
  • default:表示不写修饰符的情况,只能在同包中访问

 下面我们进行测试:

1.创建两个包,取名为com.syc.test和com.syc.input,然后在com.syc.test下创建Test类、Woman类,com.syc.input下创建People类

Java中的权限修饰符的访问范围详解

2.编写代码。people.java文件的内容如下:

package com.syc.input;

public class People {
}
class Man{
    
}

Test类的内容如下:

package com.syc.test;

import com.syc.input.People;

public class Test {
    public static void main(String[] args){
        new People();//跨包时需要导包
//        new Man();//错误,表示default修饰的类不能跨包访问
        new Woman();

    }
}

Woman类的内容如下:

package com.syc.test;

class Woman {
}

3.测试并总结:我们用Test类中的main方法进行测试,发现创建People对象是可以直接new出来的(Public全局访问),但是Man对象却无法创建,而Woman对象也是可以new出来(default只能在同包中访问)。

 二、修饰成员

权限修饰符修饰成员的访问范围如下图所示:

Java中的权限修饰符的访问范围详解

我们按照权限由小到大的顺序来测试修饰符。

 

1.测试private

我们新创建一个项目,然后创建包com.syc.test,在其中新建一个类People

Java中的权限修饰符的访问范围详解

编写People的代码如下: 

package com.syc.test;

public class People {
    //访问权限由小到大定义成员变量
    private int a = 10;
    int b = 20;
    protected int c = 30;
    public int d = 40;

    //访问权限由小到大定义成员方法
    private void fun1(){

    }

    void fun2(){

    }

    protected void fun3(){

    }

    public void fun4(){

    }

    public static void main(String[] args) {
        //本类当中访问成员变量和成员方法,先创建这个类的对象
        People p = new People();
        System.out.println(p.a);//私有的权限最低的都能访问,其他权限高的一定能访问
        p.fun1();
    }
}

可以看到在本类中,权限最小的都能访问到,其他三个就必定能够访问了。

2.测试default

我们继续在com.syc.test包中创建新的类Test,然后对成员变量进行测试,发现在使用p.只弹出了bcd,可见私有成员a无法脱离其所属类进行访问。

Java中的权限修饰符的访问范围详解

 Test类的代码如下:

package com.syc.test;

public class Test {
    public static void main(String[] args) {
        People p = new People();
//        System.out.println(p.a);//提示错误,private修饰的成员不能在其类外访问到
        System.out.println(p.b);
        p.fun2();
    }
}

当我们跨包时,只能查看到public所修饰的成员(此时没有继承):

Java中的权限修饰符的访问范围详解 

3.测试protected

protected修饰的成员能在本类,同包,子类中被访问。

我们在com.syc.input中新建Student类,使这个类继承自People,然后我们可以看到能访问到父类的protected 成员c。

Java中的权限修饰符的访问范围详解

public就不用说了,全局能访问,如上上图(未继承时)能访问到public成员d。

三、修饰构造器

权限修饰符修饰构造器的访问范围与修饰成员时候访问范围相同。

1.测试private

和测试成员一样,我们新建一个项目,然后创建com.syc.test包,在其中添加People类,然后添加四个构造器(需要添加不同类型的参数来对构造器重载),并在本类中用main方法进行测试,发现四个构造器均能使用。

package com.syc.Test;

public class People {
    private People(){

    }

    People(int a){

    }

    protected People(char c){

    }

    public People(String s){

    }

    public static void main(String[] args) {
        new People();
        new People(1);
        new People('c');
        new People("syc");
    }
}

2.测试default

我们在com.syc.Test包下新建Test类,发现不能访问无参的私有构造器(private People(){})。

Java中的权限修饰符的访问范围详解

3.测试public

我们新建一个包com.syc.input,也创建一个类Test,此时在main方法中测试,发现只能访问public方法修饰的构造器(public People(String s){})

Java中的权限修饰符的访问范围详解