Java访问控制修饰符

283 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

访问控制修饰符

今天我带大家回顾一下访问控制修饰符的内容,首先给大家看一个表格。大家一定不陌生。这就是我们的访问修饰符权限表。

访问级别访问控制修饰符同类同包同包子类不同包子类不同包
公开public
受保护protectedx
默认没有修饰符xx
私有privatexxxx

今天我带大家实际操作一下,让你们对它们权限的理解更深刻一些。

同类

package yrx;
public class Ysbt {
    public int a = 1;
    int b = 1;
    protected int c = 1;
    private int d = 1;
    public void e(){
        System.out.println("这是e方法");
    }
    void f(){
        System.out.println("这是f方法");
    }
    protected void j(){
        System.out.println("这是j方法");
    }
    private void h(){
        System.out.println("这是h方法");
    }

    public static void main(String[] args) {
        Ysbt ysbt = new Ysbt();
        System.out.println(ysbt.a);
        System.out.println(ysbt.b);
        System.out.println(ysbt.c);
        System.out.println(ysbt.d);
        ysbt.e();
        ysbt.f();
        ysbt.j();
        ysbt.h();
    }
}

大家通过上面的代码可以很清楚的看到,在同一个类中无论是什么访问控制修饰符都是可以被调用的。一个类的内部就像一个大家庭,谁都可以用家中的东西。

同包

package yrx;
public class Dog {
    public int a = 1;
    int b = 1;
    protected int c = 1;
    private int d = 1;
    public void e(){
        System.out.println("这是e方法");
    }
    void f(){
        System.out.println("这是f方法");
    }
    protected void j(){
        System.out.println("这是j方法");
    }
    private void h(){
        System.out.println("这是h方法");
    }

}

package yrx;
public class Ysbt {

    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.a);
        System.out.println(dog.b);
        System.out.println(dog.c);
 //     System.out.println(dog.d);  报错
        dog.e();
        dog.f();
        dog.j();
//      dog.h();  报错
    }
}

这时我们会发现同一个包不同类中调用访问控制修饰符为private会报错。不同类中私有属性private是不会被访问到的。

子类

同包子类

package yrx;
public class Dog {
    public int a = 1;
    int b = 1;
    protected int c = 1;
    private int d = 1;
    public void e(){
        System.out.println("这是e方法");
    }
    void f(){
        System.out.println("这是f方法");
    }
    protected void j(){
        System.out.println("这是j方法");
    }
    private void h(){
        System.out.println("这是h方法");
    }
}
package yrx;
public class Ysbt extends Dog{
    public static void main(String[] args) {
        Ysbt ysbt = new Ysbt();
        System.out.println(ysbt.a);
        System.out.println(ysbt.b);
        System.out.println(ysbt.c);
 //     System.out.println(ysbt.d);  报错
        ysbt.e();
        ysbt.f();
        ysbt.j();
//      ysbt.h();  报错
    }
}

同包子类也只有私有属性private是不会被访问到的。

不同包子类

package two;
public class Cat {
    public int a = 1;
    int b = 1;
    protected int c = 1;
    private int d = 1;
    public void e(){
        System.out.println("这是e方法");
    }
    void f(){
        System.out.println("这是f方法");
    }
    protected void j(){
        System.out.println("这是j方法");
    }
    private void h(){
        System.out.println("这是h方法");
    }
package yrx;
import two.Cat;
public class Ysbt extends Cat{
    public static void main(String[] args) {
        Ysbt ysbt = new Ysbt();
        System.out.println(ysbt.a);
//       System.out.println(ysbt.b);报错
        System.out.println(ysbt.c);
//        System.out.println(ysbt.d);报错
        ysbt.e();
//        ysbt.f();报错
        ysbt.j();
//        ysbt.h();  报错
    }
}

不同包子类只有public和protected可以被访问到。

不同包

package two;
public class Cat {
    public int a = 1;
    int b = 1;
    protected int c = 1;
    private int d = 1;
    public void e(){
        System.out.println("这是e方法");
    }
    void f(){
        System.out.println("这是f方法");
    }
    protected void j(){
        System.out.println("这是j方法");
    }
    private void h(){
        System.out.println("这是h方法");
    }
}
package yrx;
import two.Cat;
public class Ysbt {
    public static void main(String[] args) {
        Cat cat = new Cat();
        System.out.println(cat.a);
//        System.out.println(cat.b);报错
//        System.out.println(cat.c);报错
//        System.out.println(cat.d);报错
        cat.e();
//        cat.f();报错
//        cat.j();报错
//        cat.h();  报错
    }
}

不同包只能访问public修饰过得属性和方法。

个人感悟

访问控制修饰符很重要,在未来能否和合理地使用访问控制修饰符,决定着一个项目的开发和维护的难易程度。private访问控制修饰符大大提高java语言的安全性,把不想让别人看到属性私有化起来,同时可以使用get和set方法来设置和修改private的方法和属性。