包其实就是用来区分类位置的东西, 也可以用来将我们的类进行分类(类似于C++中的namespace)随着我们的程序不断变大, 可能会创建各种各样的类, 他们可能会做不同的事情, 那么这些类如果都放在一起的话, 有点混乱, 我们可以通过包的形式将这些类进行分类存放。
包的命名规则同样是英文和数字的组合, 最好是一个域名的格式, 比如我们经常访问的www.baidu.com, 后面的baidu.com就是域名, 我们的包就可以命名为com.baidu, 当然, 各位小伙伴现在还没有自己的域名, 所以说我们随便起一个名称就可以了。其中的.就是用于分割的, 对应多个文件夹, 比如com.test:
关键字package, 这个是用于指定当前类所处的包的, 注意, 所处的包和对应的目录是一一对应的。
package com.test; //在放入包中,需要在类的最上面添加package关键字来指明当前类所处的包
public class Main { //将Main类放到com.test这个包中
public static void main(String[] args) {
}
}
之前使用的 System.out 等类就是属于 java.lang
这个包下的类。 而之前没有手动导入是因为默认会导入 java.lang
中的所有内容。
此时, 如果在一个包外定义一个Main类, 并访问包内的 Person 类, 会出现无法访问的问题:
这就引入了访问权限控制。
访问权限控制
访问权限控制(可见性),我们可以为成员变量、成员方法、静态变量、静态方法甚至是类指定访问权限,不同的访问权限,有着不同程度的访问限制:
private
- 私有,标记为私有的内容无法被除当前类以外的任何位置访问。什么都不写
- 默认,默认情况下,只能被类本身和同包中的其他类访问。protected
- 受保护,标记为受保护的内容可以能被类本身和同包中的其他类访问,也可以被子类访问(子类我们会在下一章介绍)public
- 公共,标记为公共的内容,允许在任何地方被访问。
这四种访问权限,总结如下表:
当前类 | 同一个包下的类 | 不同包下的子类 | 不同包下的类 | |
---|---|---|---|---|
public | ✅ | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ✅ | ❌ |
默认 | ✅ | ✅ | ❌ | ❌ |
private | ✅ | ❌ | ❌ | ❌ |
如果某个类中存在静态方法或是静态变量,那么我们可以通过静态导入的方式将其中的静态方法或是静态变量直接导入使用,但是同样需要有访问权限的情况下才可以:
public class Person {
String name;
int age;
String sex;
public static void test(){
System.out.println("我是静态方法!");
}
}
我们来尝试一下静态导入:
import static com.test.entity.Person.test; //静态导入test方法
public class Main {
public static void main(String[] args) {
test(); //直接使用就可以,就像在这个类定义的方法一样
}
}