Java类的方法、变量可以使用的访问控制修饰符为:public、无访问控制修饰符(即包访问控制修饰符,也叫默认访问控制修饰符)、protected、private。
各访问控制修饰符的控制范围如下:
访问控制修饰符 | 访问范围 |
---|---|
public | 任何类都可以访问 |
无访问控制修饰符 | 同一包中的子类可以访问;同一包中的非子类可以访问 |
protected | 同一包中的子类可以访问;同一包中的非子类可以访问;不同包中的子类可以访问 |
private | 只有类自身可以访问 |
代码示例:
代码结构如下:
注意:在下面的代码示例中,注释掉的代码都是错误的调用,如果不注释掉,会编译报错。
// 类Test4
package com.thb;
import com.thb.tao.D;
public class Test4 {
public static void test() {
C c = new C();
D d = new D();
c.m1PublicInC(); // 类C的public方法,任何地方都可见,因为在同一包中,所以不需要用import导入
c.m2ProtectedInC(); // 类C的protected方法,对被同一包中的类可见
c.m4PackageInC(); // 类C的包访问控制方法,对被同一包中的类可见
//c.m3PrivateInC(); // 类C的private访问控制方法,只对类C本身可见
d.m1PublicInD(); // 类D的public方法,任何地方都可见,因为不在同一包中,所以需要用import导入
//d.m2ProtectedInD(); // 类D的protected方法,对被不同包中的非子类不可见
//d.m4PackageInD(); // 类D的包访问控制方法,对被不同包中的非子类不可见
//d.m3PrivateInD(); // 类D的private访问控制方法,只对类D本身可见
}
}
// 类C
package com.thb;
public class C {
public void m1PublicInC() {}
protected void m2ProtectedInC() {}
void m4PackageInC() {}
private void m3PrivateInC() {}
}
// 类D
package com.thb.tao;
public class D {
public void m1PublicInD() {}
protected void m2ProtectedInD() {}
void m4PackageInD() {}
private void m3PrivateInD() {}
}
// 类Cchild
package com.thb;
import com.thb.tao.D;
public class Cchild extends C {
public void test() {
D d = new D();
m1PublicInC(); // 类C的public方法,任何地方都可见,因为在同一包中,所以不需要用import导入
m2ProtectedInC(); // 类C的protected方法,对被同一包中的子类可见
m4PackageInC(); // 类C的包访问控制方法,对被同一包中的子类可见
//m3PrivateInC(); // 类C的private访问控制方法,只对类C本身可见
d.m1PublicInD(); // 类D的public方法,任何地方都可见,因为不在同一包中,所以需要用import导入
//d.m2ProtectedInD(); // 类D的protected方法,对被不同包中的非子类不可见
//d.m4PackageInD(); // 类D的包访问控制方法,对被不同包中的非子类不可见
//d.m3PrivateInD(); // 类D的private访问控制方法,只对类D本身可见
}
}
// 类Dchild
package com.thb;
import com.thb.tao.D;
public class Dchild extends D {
public void test() {
C c = new C();
c.m1PublicInC(); // 类C的public方法,任何地方都可见,因为在同一包中,所以不需要用import导入
c.m2ProtectedInC(); // 类C的protected方法,对被同一包中的类可见
c.m4PackageInC(); // 类C的包访问控制方法,对被同一包中的类可见
//c.m3PrivateInC(); // 类C的private访问控制方法,只对类C本身可见
m1PublicInD(); // 类D的public方法,任何地方都可见,因为不在同一包中,所以需要用import导入
m2ProtectedInD(); // 类D的protected方法,对被不同包中的子类可见
//m4PackageInD(); // 类D的包访问控制方法,对被不同包中的子类不可见
m3PrivateInD(); // 类D的private访问控制方法,只对类D本身可见
}
}