1. 程式人生 > >Java 預設訪問控制符

Java 預設訪問控制符

眾所周知,Java的訪問控制符,有public、protected、預設、private四種。對於我而言,預設型別是最容易混淆的。雖然知道預設型別的訪問許可權排第3,但是有時候和protected還是會混淆。這裡做個小小的梳理。default與protected在大多數的資料中顯示的是

同包 子類
protected
預設 ×

這樣乍一看,在子類中預設都不能訪問嗎?

package org.zheng.accesscontrol.a;

/**
 * Create by zxb on 2017/4/16
 */
public class A {
    protected String aa;
    String bb;
    private String cc;
}

package org.zheng.accesscontrol.a;

/**
 * Create by zxb on 2017/4/16
 */
public class B extends A {
    public void H(){
        this.aa = "";  //正常訪問
        this.bb = ""; //正常訪問
    }
    public static void main(String[] args){
        A a = new A();
        a.aa = "1"; //正常訪問
        a.bb = "1"; //正常訪問
    }
}

這裡看到bb在子類B中是能夠正常訪問的。

再看在不同包下的子類C

package org.zheng.accesscontrol.b;

import org.zheng.accesscontrol.a.A;

/**
 * Create by zxb on 2017/4/16
 */
public class C extends A {
    public void H(){
        this.aa = "";  //正常訪問
        this.bb = "";  //編譯報錯
    }
    public static void main(String[] args){
        A a = new A();
        a.aa = "1";  //編譯報錯
        a.bb = "1";  //編譯報錯
    }
}

這時候,在子類C的例項方法中,protected修飾的aa是可以訪問的,但是預設的bb會編譯異常
package org.zheng.accesscontrol.b;

import org.zheng.accesscontrol.a.A;

/**
 * Create by zxb on 2017/4/16
 */
public class D {

    public static void main(String[] args) {
        A a = new A();
        a.aa = "1";  //編譯報錯
        a.bb = "1";  //編譯報錯
    }
}

在不同包的類D,例項方法同樣訪問aa,bb都是編譯錯誤的。

因此可以知道,

跨包情況下,protected修飾的變數仍可以被子類繼承,而預設的不行。

跨包情況下,例項物件無法訪問protected或者預設修飾的變數。