Java的包和访问权限
包package
- 包的命名规则
包名全部由小写字母(多个单词也全部小写);
如果包名包含多个层次,每个层次应该用“.”分割;
包名一般由倒置的域名开头,比如com.baidu;——不要有www
自定义包不能java开头;
- 包的作用
有利于类的查找与管理。一个软件由很多类构成,这些类按其功能可分为vo类、dao类、工具类、service类、controller类等,将这些类按其功能分门别类地放在不同包中有利于类的查找与管理;
解决了同名类命名冲突;
有利于保护类中的成员变量及其方法。类中成员变量及其方法前面的访问控制符决定了该变量和方法的使用范围;
例如:
java.lang:提供利用 Java 编程语言进行程序设计的基础类,例如:String、Math、Integer、System和Thread等。
java.util:java工具类,包含对集合的操作、事件模型、日期和时间设施、国际化和各种实用工具类。
java.io:通过数据流、序列化和文件系统提供系统输入和输出。
java.net:为实现网络应用程序提供类。
java.awt:包含用于创建用户界面和绘制图形图像的所有类。
访问修饰符
- 访问控制符使用范围
public是最大的访问权限修饰符,其修饰的成员变量、构造方法和普通方法可在任何一个类中被操作或使用;
protected修饰的成员变量、构造方法和普通方法可以在其定义类中、与定义类同包的其它类(可以使子类)中和与定义类不同包但是其子类的类中使用;
默认(友好的)修饰的成员变量、构造方法和普通方法可以在其定义类中和与定义类同包的其它类(可以使子类)中使用;
private是最小的访问权限控制符,其修饰的成员变量、构造方法和普通方法只能在定义它们的类中被操作或使用;
- 访问权限表
访问修饰符 | 本类 | 同包(无论是否继承) | 不同包的子类 | 不同包的非子类 |
---|---|---|---|---|
public | true | true | true | true |
protected | true | true | true | |
默认 | true | true | ||
private | true |
- protected
在不同包下的两个类(非继承),如果其中一个类想访问另一个类的protected字段或方法,则会报错,无论字段或方法是否是静态的。
1 | package com.muchlab.foo; |
如果两个类是继承关系,即Son继承Foo,则子类可以创建子类对象来访问继承过来的成员,但不能通过创建父类对象来访问其非静态成员。原因是创建子类对象是再同包中发生,而创建父类对象是在不同包下发生。但可以访问通过父类对象访问静态成员
1 | package com.muchlab.foo; |