众所周知,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或者默认修饰的变量。