在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的实例对象aA 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 |
不同情形下 | ||||
同类 | ● | ● | ● | ● |
同包 | ● | ● | ● | |
子类(可以不同包) | ● | ● | ||
通用型 | ● |