java提供的访问权限控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键字)、private。
这几个访问权限修饰词在使用时,是置于类中每个成员的定义之前的。无论它是一个方法还是一个域。每个访问权限修饰词仅控制它所修饰的特定定义的访问权。
1、包访问权限(没有关键字)
如果不提供任何访问修饰词,意味着它是“包访问权限”。当前的包中的所有其他类对那个成员都有访问权限,但对于这个包之外的所有类,这个成员却是private。
2、接口访问权限(public)
使用关键字public,意味着public之后紧跟着的成员声明自己对每个人都是可用的。
3、私有访问权限(private)
意味着除了包含该成员的类之外,其他任何类都无法访问这个成员。
任何可以肯定只是该类的一个“助手”方法的方法,都可以把它指定为private,以确保不会在包内的其他地方误用到它。
4、继承访问权限(protected)
将基类的某个特定成员的访问权限赋予派生类而不是所有类,可以使用protected。它也提供包访问权限,相同包内的其他类也可以访问protected元素。
//包路径
package com.thinkinjava.chapter06.dessert;
public class Cookie {
public Cookie(){
System.out.println("Cookie Constructor");
}
//包访问权限
void bite(){
System.out.println("bite");
}
}
上面的两个类在不同的包中,Cookie类有一个包访问权限方法bite()。Chocolate类继承Cookie类。同时继承了Cookie类中的public成员和包访问权限成员方法bite()。但是不能在Chocolate类中使用该方法bite()。它位于不同的包中,所以无法使用它,即使在继承的子类中存在该方法。但是将它改为protected访问权限就可以使用了。
访问权限总结:
类访问权限
类的访问权限的修饰词必须出现在关键字class之前。
每一个编译单元(文件)都只能有一个public类。而且public类的名称必须与该编译单元的文件名相匹配,包括大小写。但是在该编译单元中,也可以包括多个不带public的类,具有包访问权限:
图片中的Acctest类的成员的访问权限也都是适用的,在同包中其他类中创建该类的对象,并调用方法:
类既不可以是private的,也不可以是protected的。不可以被其他类创建。
但是在内部类中,可以使用private 和protected访问权限:
对于类的访问权限,只能是public或包访问权限。可以把构造器指定为private,从而阻止任何人创建该类的对象。但是你可以在本类的static方法中创建对象,因为与初始化的顺序有关:
//两种方式创建私有构造器的类的对象
public class ClassAccess {
//构造器设置为private,
private ClassAccess(){
}
//可以通过static方法创建对象,且有且只有一个
public static ClassAccess makeObject(){
return new ClassAccess();
}
//也可以是static域,且有且只有一个
private static ClassAccess ca=new ClassAccess();
public static ClassAccess access(){
return ca;
}
}