我对Java访问权限修饰符理解

662 阅读2分钟

在java中定义了四种访问权限修饰符, 它们分别是:公共的以public关键字修饰,对所有类可见;受保护的以protected关键字修饰,对同一包内的类和所有子类可见;私有的以private关键字修饰,仅在同一类内可见;还有就是默认的(default不显式标注修饰),仅在同一包内可见,不使用任何修饰符。对于父类,只有定义为public类时才能被包外访问,不然成员不管是什么访问权限只能被包中类访问。

同一个包中(方法和字段同理)

package package1;
/**
 * 属于同一个包中的类A
 */
public class A {
    int a; // 默认访问权限
    public int b; // 公共的public
    protected int c; // 受保护的protected
    private int d;  // 私有的private
    void test() {
       System.out.print(a); // 可以访问默认的
       System.out.print(b); // 可以访问public
       System.out.print(c); // 可以访问protected
       System.out.print(d); // 可以访问private
    }
}

package package1;
/**
 * 属于同一个包中的类B
 */
class B {
    A ca = new A();
    void test() {
       System.out.print(ca.a); // 可以访问默认的
       System.out.print(ca.b); // 可以访问public
       System.out.print(ca.c); // 可以访问protected
       // System.out.print(ca.d);不可访问private
    }
}

package package1;
/**
 * 属于同一个包中的继承了A类的子类C
 */
class C extends A {
    void test() {
       System.out.print(a); // 可以访问默认的
       System.out.print(b); // 可以访问public
       System.out.print(c); // 可以访问protected
       // System.out.print(d);不可访问private
    }
    
}

不在同一个包中(方法和字段同理)

package package1;
/**
 * 属于同一个包中的类A
 */
public class A {
    int a; // 默认访问权限
    public int b; // 公共的public
    protected int c; // 受保护的protected
    private int d;  // 私有的private
    void test() {
       System.out.print(a); // 可以访问默认的
       System.out.print(b); // 可以访问public
       System.out.print(c); // 可以访问protected
       System.out.print(d); // 可以访问private
    }
}

package package2;
/**
 * 属于不同包中的类B
 */
class B {
    A ca = new A();
    void test() {
       // System.out.print(ca.a); // 不可以访问默认的
       System.out.print(ca.b); // 可以访问public
       //System.out.print(ca.c); // 不可以访问protected
       // System.out.print(ca.d);不可访问private
    }
}

package package3;
/**
 * 属于不同包中的继承了A类的子类C
 */
class C extends A {
    void test() {
       // System.out.print(a); // 不可以访问默认的
       System.out.print(b); // 可以访问public
       System.out.print(c); // 可以访问protected
       // System.out.print(d);不可访问private
    }
    
}