java中有四种不同权限的访问控制符(算上默认这一种),从下面的表格中能更清晰地看出四种访问控制符的权限范围
同一个类中 | 同一个包中 | 不同包中的子类 | 不同包中的非子类 | |
private | yes | |||
默认 | yes | yes | ||
protected | yes | yes | yes | |
public | yes | yes | yes | yes |
下面分别讲述四种控制符
1.private
一个类的不同对象可以访问对方的private成员变量或调用对方的private方法
例如,在以下程序中,三种对字段a的访问都是可以的
class TestPrivate{
private int a;
void m(){
int i = a;
int j = this.a;
int k = new TestPrivate().a;
}
}
由于private域或方法只能被这个类本身所访问,所以private域或方法不可能被子类所继承。当我们说“子类自动继承所有域和方法”时,是指非private的域或方法。
2.默认
顾名思义,类中的成员默认访问控制符时,称为默认访问控制。
3.protected
它的声明如下:
protected protectedVar;
protected protectedMethod([paramlist]){
....
}
经常需要允许子类访问定义在父类中的数据域或方法,但不允许位于不同包中的非子类的类访问这些数据域和方法,可以使用protected访问这些数据域和方法。
4.public
类中限定为public的成员可以被所有的类访问。
应用举例
public class Original{
int n_friendly = 1;
private int n_private = 2;
protected int n_protected = 3;
public int n_public = 4;
void Access(){
System.out.println("***In same class,you can access***");
System.out.println("friendly member" + n_friendly);
System.out.println("private member" + n_private);
System.out.println("protected member" + n_protected);
System.out.println("public member" + n_public);
}
}
class Derived extends Original{
void Access(){
System.out.println("***相同包的子类***");
System.out.println("friendly member" + n_friendly);
System.out.println("private member" + n_private);
System.out.println("protected member" + n_protected);
System.out.println("public member" + n_public);
Original o = new Original();
System.out.println("***相同包子类的其他对象***");
System.out.println("friendly member" + n_friendly);
System.out.println("private member" + n_private);
System.out.println("protected member" + n_protected);
System.out.println("public member" + n_public);
}
}
class SamePackageClass{
void Access(){
Original o = new Original();
System.out.println("***相同包其他类***");
System.out.println("friendly member" + o.n_friendly);
System.out.println("protected member" + o.n_protected);
System.out.println("public member" + o.n_public);
}
}
class AccessControl{
public static void main(String[] args) {
Original o = new Original();
o.Access(); //输出1,2,3,4; 1,3,4
Derived d = new Derived();
d.Access(); //输出1,3,4
SamePackageClass s = new SamePackageClass();
s.Access(); //同样输出1,3,4
}
}
/***除了访问相同包的子类时,其他情况private均不能访问***/
使用private修饰符可以完全隐藏该类的成员,这样,就不能从类外直接访问它们。不使用修饰符(default)就表示允许同一个包里的任何类直接访问该类的成员,但其他包中的类不可以访问。使用protected修饰符允许位于任何包中的子类或同一包中的类访问该类成员。使用public修饰符一些任意类访问该类成员。
注意:子类可以重写其父类的protected方法,并把它的可见性改为public。但是,子类不能削弱父类中定义的方法的可访问性。例如:如果一个方法在父类中定义为public,在子类中与必须定义为public。