1. 简介
可见性修饰符可以用于确定一个类以及他的成员的可见性
2. public
可以在类、方法、数据源前使用public修饰符,表示他们可以被任何其他类访问。
3. protected
允许子类访问父类中的数据域或方法,但不允许非子类访问这些数据域和方法。
4. 默认修饰符
如果没有使用可见性修饰符,那么默认类、方法和数据域可以被同一个包中的任何一个类访问。这称为包私有(package-private)或包内访问(package-access)。
5. private
限定方法和数据域只能在自己的类中访问。注意修饰符private只能应用在类成员上,修饰符public可以应用在类或类成员上。在局部变量上使用public和private都会导致编译错误。
在大多数情况下构造方法都是公共的,但如果想防止用户创建类的实例,就使用私有构造方法,实例化时会提示构造方法不可视错误。例如Math类所有方法都是静态方法,所以为防止用户创建Math对象,其构造方法定义如下
private Math(){
}
6. 总结
类中成员修饰符 | 同一类中可访问 | 同一包中可访问 | 在子类中可访问 | 在不同包中可访问 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | - |
(default) | √ | √ | - | - |
private | √ | - | - | - |
下面的程序中展示了使用可见性修饰符之后,数据和方法的作用范围。子类可以扩大父类定义的作用范围,但是不能削弱父类的作用范围
package p1;
public class C1{
public int x;
protected int y;
int z;
private int u;
protect void m(){
}
}
public class C2{
C1 o = new C1();
can access o.x;
//在同一个包中
can access o.y;
can access o.z;
cannot access o.u;
can invoke o.m();
}
public class C3 extends C1{
can access x;
can access y;
can access z;
cannot access u;
can invoke m();
}
package p2;
public class C4{
C1 o = new C1();
can access o.x;
//没有继承也不在同一个包
cannot access o.y;
cannot access o.z;
cannot access o.u;
cannot invoke o.m();
}
public class C5 extends C1{
can access x;
can access y;
//不在同一个包
cannot access z;
cannot access u;
//继承父类
can invoke m();
}