在Java语言中,类成员的访问修饰符用于定义类成员的可见性,即哪些其他类可以访问这些成员。类成员包括字段(变量)、方法和构造器。Java提供了四种访问修饰符来控制成员的访问权限:
-
public:公共的。任何类都可以访问。这是最宽松的访问级别。
-
protected:受保护的。同一个包中的其他类以及所有子类可以访问。比
public
更严格,但允许子类访问。 -
默认(无修饰符):也称为包级私有。同一个包中的其他类可以访问,但包外的类不能访问。这是默认的访问级别,如果不显式指定访问修饰符,类成员就使用这个级别。
-
private:私有的。私有的成员只能在该类中被访问。类的实例属性常用private进行访问限制,外部类只能通过私有成员所在类中的方法进行访问(在类中定义相关的get/set方法)。
下面是一个例子,展示了如何在Java类中使用这些访问修饰符:
public class AccessModifiersExample {
// 公共字段,任何类都可以访问
public int publicField;
// 受保护字段,同一个包中的类和所有子类可以访问
protected int protectedField;
// 默认(包级私有)字段,同一个包中的类可以访问
int defaultField;
// 私有字段,只有AccessModifiersExample类可以访问
private int privateField;
// 公共方法,任何类都可以访问
public void publicMethod() {
// ...
}
// 受保护方法,同一个包中的类和所有子类可以访问
protected void protectedMethod() {
// ...
}
// 默认(包级私有)方法,同一个包中的类可以访问
void defaultMethod() {
// ...
}
// 私有方法,只有AccessModifiersExample类可以访问
private void privateMethod() {
// ...
}
}
类的public成员(属性)作为公共的成员,可以被其他类随意访问,public方法作为对象提供给外部的接口。
代码:A.java
// 类A在包com.test中
package com.test;
public class A {
// 类A的一个接口(公共方法)
public void publicMethod(){
System.out.println("这是类A的公共方法:publicmethon()");
}
}
代码:B.java
//类B在包com.test2中
package com.test2;
// 导入在com.test包中的类A
import com.test.A;
public class B {
public static void main(String[] args) {
// 创建类A的实例对象a
A a = new A();
// 调用类A的方法publicMethod()
a.publicMethod();
}
}
上面B类在包com.test2中,可以调用com.test包中的A类中用public修饰符修饰的方法publicMethond()方法。
请注意:类A和类B是在不同的包,分别在com.test和com.test2包中。
代码:C.java
package com.test;
public class C {
/**
* 使用proteced修饰的方法,也成为继承访问权限。
* 1、可以在子类中被访问(调用),子类可以不在同一个包中
* 2、也可以在同一个包中的其它类(没有继承关系)中被访问(调用)
*/
protected void protectedMethond() {
System.out.println("这是一个使用protected修饰符定义的方法");
}
}
代码:D.java
package com.test;
import com.test.C;
public class D {
public static void main(String[] args) {
C c = new C();
c.protectedMethond();
}
}
类D和类C是没有继承关系的两个类,在同一个包com.test中。上面代码在类D中方法,创建类C的对象,访问类C中使用protected修饰的方法protecedMethond()。
代码:E.java
package com.test2;
import com.test.C;
public class E extends C {
public static void main(String[] args) {
E e = new E();
e.protectedMethond();
}
}
类E继承类C,E是C的子类,C是E的父类,但是它们在不同的包中,类E在com.test2中,类C在com.test包中。
编译上面代码,运行正常。总结如下:
访问说明符 | public | protected | default | private |
不同情形下 | ||||
同类 | ● | ● | ● | ● |
同包 | ● | ● | ● | |
子类(可以不同包) | ● | ● | ||
通用型 | ● |