Java的访问控制

包(Package)

  1. 创建自己的包时,要求 package语句必须是文件中的第一个“非注释”代码。
  2. 如果类名冲突时,可这样写java.util.Vector v = new java.util.Vector();
  3. 可能(但并常见)有一个编译单元根本没有任何公共类。此时,可按自己的意愿任意指定文件名。

访问控制

修饰符

类内部

同一个包

子类

任何地方

private

default

protected

public

类的修饰符只有public 和 default,默认时只能被同一个文件或包内访问。

下面是代码解释

//PackageClass.java
package com.fatkun.util;
/**
 * 在包com.fatkun.util内,分别有a,b,c,d四个变量,它们的修饰符都不一样。
 * @author fatkun
 *
 */
public class PackageClass {
	private int a;
	int b;
	protected int c;
	public int d;

	public static void main(String[] args) {
		PackageClass p = new PackageClass();
		System.out.println(p.a);
		System.out.println(p.b);
		System.out.println(p.c);
		System.out.println(p.d);

		new InsideClass();
	}

}
class InsideClass {

}
//AnotherPackageClass.java
package com.fatkun.util;

/**
 * 同一个包内的类,private的不能访问
 * @author fatkun
 *
 */
public class AnotherPackageClass {

	public static void main(String[] args){
		PackageClass p = new PackageClass();
		System.out.println(p.a);//private只能在类内部访问
		System.out.println(p.b);
		System.out.println(p.c);
		System.out.println(p.d);

		//内部类在同一个包内可以访问
		new InsideClass();
	}

}
//ExtendClass.java
import com.fatkun.util.*;
/**
 * PackageClass的子类
 * @author fatkun
 *
 */
public class ExtendClass extends PackageClass {

	public static void main(String[] args) {
		ExtendClass e = new ExtendClass();
		System.out.println(e.a);//private只能在类内部访问
		System.out.println(e.b);//default只能在类内部和同一个包内访问
		System.out.println(e.c);//protect能在子类访问
		System.out.println(e.d);

		//内部类在子类不可以访问
		new InsideClass();
	}
}
//DefaultClass.java
import com.fatkun.util.*;
/**
 * 不同包内
 * @author fatkun
 *
 */
public class DefaultClass {

	public static void main(String[] args) {
		PackageClass p = new PackageClass();
		System.out.println(p.a);//private只能在类内部访问
		System.out.println(p.b);//default只能在类内部和同一个包内访问
		System.out.println(p.c);//protect只能在类内部、同一个包、子类访问
		System.out.println(p.d);//public能在任何地方访问

		//内部类在不同包内不可以访问
		new InsideClass();
	}

}
updatedupdated2023-12-062023-12-06