访问权限控制
修饰符用来定义类、方法或者变量,通常放在语句的最前端。
Java语言提供了很多修饰符,主要分为以下两类:
- 访问修饰符
- 非访问修饰符
其中非访问修饰符主要有:static、final、abstract、synchronized和volatile,非访问修饰符根据各自的特性来保证特定功能的实现。
Java中使用访问控制符来保护对类、变量、方法和构造方法的访问,访问控制修饰符对应的权限控制的大小情况为:public > protected > default(包访问权限) > private。
目的
-
为了让用户不要碰触他们不应该接触的地方
-
为了让类库设计者更改类库的内部工作方式,而不用担心对客户端程序造成重大影响。
编译单元和包
编译单元:即为最小的可以被编译且执行的Java文件。
一个.java文件就是一个编译单元,一个编译单元必须只包含有一个public类,可以包含有其他非public的类,并且用publi类标示的类名必须和文件名相同。如果.java文件中不包含有publi类,则这个类也是没有意义的,因为不能被外界所访问。.java文件中包含有几个类,编译后就会生成几个.class文件。
包含有一组类,是以一个名字空间集合在一起的类而已。
访问控制修饰符
-
public : 对所有类可见
使用对象:类、接口、变量、方法
-
protected : 对同一包内的类和所有子类可见
使用对象:变量、方法。 注意:不能修饰类(外部类)
-
default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符
使用对象:类、接口、变量、方法。
-
private : 在本类中可见
使用对象:变量、方法。 注意:不能修饰类(外部类)
private和protected修饰符不能用以修饰类/接口
2.1 公有访问修饰符-public
被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。
如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。
由于类的继承性,类所有的公有方法和变量都能被其子类继承。
2.2 受保护的访问修饰符-protected
protected 又称继承访问权限
protected 需要从以下两个点来分析:
- 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
- 子类与基类不在同一包中:在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法
子类能访问 protected 修饰符声明的方法和变量,这样就能避免不相关的类使用这些方法和变量。
在碰到涉及protected成员的调用时,首先要确定出该protected成员来自何方,其可见性范围是什么,然后就可以判断出当前用法是否可行了
package p2;
class MyObject2 {
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
package p22;
public class Test2 extends MyObject2 {
public static void main(String args[]) {
MyObject2 obj = new MyObject2();
obj.clone(); // Compile Error ----(1)
Test2 tobj = new Test2();
tobj.clone(); // Complie OK ----(2)
}
}
对于(1)而言,clone()方法来自于类MyObject2本身,因此其可见性为包p2及MyObject2的子类,虽然Test2是MyObject2的子类,但在Test2中不能访问基类MyObject2的protected方法clone(),因此编译不通过;
对于(2)而言,由于在Test2中访问的是其本身实例的从基类MyObject2继承来的的clone(),因此编译通过。
2.3 默认访问修饰符-不使用任何关键字
使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。
接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public。
2.4 私有访问修饰符-private
被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。
声明为私有访问类型的变量可以通过类中公共(public修饰)的 getter 方法被外部类访问。
private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY