Java 預設訪問控制符
阿新 • • 發佈:2019-01-31
眾所周知,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或者預設修飾的變數。