Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有、默认、保护和公有,具体规则如下表:
1.私有级别
私有级别的关键字是private,私有级别的成员变量和方法只能在其所在类的内部自由使用,在其他的类中则不允许直接访问。私有级别限制性最高。示例代码如下:
// PrivateClass.java文件
public class PrivateClass {
private int x;
public PrivateClass() {
x = 100;
}
private void printX() {
System.out.println("Value Of x is" + x);
}
}
// HelloWorld.java文件调用PrivateClass
public class HelloWorld {
public static void main(String[] args) {
PrivateClass p;
p = new PrivateClass();
//编译错误,PrivateClass中的方法 printX()不可见
p.printX();
}
}
上述代码第2行声明PrivateClass类,其中的代码第3行是声明私有实例变量x,代码第5行是声明公有的构造方法。代码第8行声明私有实例方法。HelloWorld类中代码第22行会有编译错误,因为PrivateClass中printX()的方法是私有方法。
2.默认级别
默认级别没有关键字,也就是没有访问修饰符,默认级别的成员变量和方法,可以在其所在类内部和同一个包的其他类中被直接访问,但在不同包的类中则不允许直接访问。示例代码如下:
// DefaultClass.java文件
package com.Kevin;
public class DefaultClass {
int x;
public DefaultClass() {
x = 100;
}
void printX() {
System.out.println("Value Of x is" + x);
}
}
上述代码第6行的x变量前没有访问限制修饰符,代码第12行的方法也是没有访问限制修饰符。它们的访问级别都有默认访问级别。
在相同包(com.Kevin)中调用DefaultClass类代码如下:
// com.Kevin包中HelloWorld.java文件
package com.Kevin;
public class HelloWorld {
public static void main(String[] args) {
DefaultClass p;
p = new DefaultClass();
p.printX();
}
}
默认访问级别可以在同一包中访问,上述代码可以编译通过。
在不同的包中调用DefaultClass类代码如下:
// 默认包中HelloWorld.java文件
import com.Kevin.DefaultClass;
public class HelloWorld {
public static void main(String[] args) {
DefaultClass p;
p = new DefaultClass();
// 编译错误,DefaultClass中的方法 printX()不可见
p.printX();
}
}
该HelloWorld.java文件与DefaultClass类不在同一个包中,printX()是默认访问级别,所以p.printX()方法无法编译通过。
3.共有级别
公有级别的关键字是public,公有级别的成员变量和方法可以在任何场合被直接访问,是最宽松的一种访问控制等级。示例代码如下:
// PublicClass.java文件
package com.Kevin;
public class PublicClass {
public int x;
public PublicClass() {
x = 100;
}
public void printX() {
System.out.println("Value Of x is" + x);
}
}
上述代码第6行的x变量是公有级别,代码第12行的方法也是公有级别。调用PublicClass类代码如下:
// 默认包中HelloWorld.java文件
import com.Kevin.PublicClass;
public class HelloWorld {
public static void main(String[] args) {
PublicClass p;
p = new PublicClass();
p.printX();
}
}
该HelloWorld.java文件与PublicClass类不在同一个包中,可以直接访问公有的printX()方法。
4.保护级别
保护级别的关键字是protected,保护级别在同一包中完全与默认访问级别一样,但是不同包中子类能够继承父类中的protected变量和方法,这就是所谓的保护级别,“保护”就是保护某个类的子类都能继承该类的变量和方法。示例代码如下:
// ProtectedClass.java文件
package com.Kevin;
public class ProtectedClass {
protected int x;
public ProtectedClass() {
x = 100;
}
protected void printX() {
System.out.println("Value Of x is " + x);
}
}
上述代码第6行的x变量是保护级别,代码第12行的方法也是保护级别。
在相同包(com.Kevin)中调用ProtectedClass类代码如下:
// 默认包中HelloWorld.java文件
package com.Kevin;
import com.Kevin.ProtectedClass;
public class HelloWorld {
public static void main(String[] args) {