目录
1.Public class
public表示公共的,即该类或成员可以被任何其他类或对象访问:
例子:
public class PublicClass {
public String publicStr = "public";
}
public class OtherClass {
public static void main(String[] args) {
PublicClass pc = new PublicClass();
System.out.println(pc.publicStr);
}
}
输出为public
上述例子中,PublicClass是一个公共类(public class),内部有一个公共字符串变量publicStr。在OtherClass类中,通过创建PublicClass实例后就可以直接访问publicStr变量。
2.private
private表示私有的,即该类或成员只能在声明它们的类中访问:
例子:
public class PrivateClass {
private String privateStr = "private";
public void printPrivateStr() {
System.out.println(privateStr);
}
}
public class OtherClass {
public static void main(String[] args) {
PrivateClass pc = new PrivateClass();
// 编译器会报错:privateStr has private access in PrivateClass
System.out.println(pc.privateStr);
pc.printPrivateStr();
}
}
上述例子中,PrivateClass是一个私有类(没有access modifier,默认是包访问权限),内部有一个私有字符串变量privateStr和一个公共方法printPrivateStr()。在OtherClass类中,创建了PrivateClass的实例pc后无法通过pc.privateStr方式来访问privateStr变量,因为其被声明为私有的;但可以通过pc.printPrivateStr()来调用公共方法printPrivateStr()。
3.protected
protected表示受保护的,即该类或成员只能被该类、其子类和在同一包中的其他类访问:
例子:
package com.example;
protected class ProtectedClass {
protected String protectedStr = "protected";
}
package com.example;
public class Test {
public static void main(String[] args) {
ChildClass cc = new ChildClass();
// 可以正常输出ChildClass的保护变量protectedStr
System.out.println(cc.protectedStr);
// 编译器会报错:IllegalAccessError: class Test cannot access its superclass ProtectedClass
ProtectedClass pc = new ProtectedClass();
}
}
class ChildClass extends ProtectedClass {
public void foo() {
// 可以直接访问父类ProtectedClass中的保护变量protectedStr
System.out.println(protectedStr);
}
}
上述例子中,ParentClass是一个受保护的类(protected class),内部有一个受保护字符串变量protectedStr。ChildClass继承自ParentClass,并定义了一个公共方法printProtectedStr()来打印protectedStr变量。在OtherClass类中,创建了ChildClass的实例cc后可以通过cc.printProtectedStr()方式来访问protectedStr变量,因为ChildClass是ParentClass的子类;但无法通过cc.protectedStr方式直接访问protectedStr变量,因为其被声明为受保护的。
4.默认类
默认(无修饰符):默认类(default class,也称为包访问权限类)只能在同一包中的其他类中访问,其他包中的类无法访问。没有访问修饰符的类被认为具有默认访问修饰符。默认类通常用于实现和维护程序模块并希望将一些详细信息隐藏在模块内部。
例子:
package com.example;
class DefaultClass {
private String privateStr = "private";
String defaultStr = "default";
protected String protectedStr = "protected";
public String publicStr = "public";
}
class OtherClass {
public static void main(String[] args) {
DefaultClass dc = new DefaultClass();
// 编译器会报错:PrivateStr 在 DefaultClass 中是 private 访问控制
System.out.println(dc.privateStr);
System.out.println(dc.defaultStr);
System.out.println(dc.protectedStr);
System.out.println(dc.publicStr);
}
}
在上述代码中,我们定义了一个名为DefaultClass的默认类(也称“包访问权限类”,即没有显式指定修饰符的类)。由于没有使用public、protected或private访问修饰符,因此DefaultClass类只能在与其位于同一包中的类中访问。
DefaultClass内部定义了四个不同访问修饰符的成员变量:私有的privateStr、默认的defaultStr、受保护的protectedStr和公共的publicStr。在OtherClass类中,我们创建了一个DefaultClass的实例dc,并尝试使用println()方法输出其四个成员变量的值。其中,privateStr被定义为私有的,在DefaultClass以外的地方不可访问,因此编译器会报错;而其他三个成员变量均可以正常访问。
5.总结:
public:公共访问级别,在任何地方都可以访问。
protected:受保护访问级别,只能在相同的包或子类中访问。
private:私有访问级别,仅允许在该类内部访问,即外部类无法直接访问该成员。
默认(无修饰符):默认访问级别,只能在相同的包中访问,其他不同的包无法访问。