包
java允许使用包(package)将类组织起来。使用包的主要原因是确保类名的唯一性,防止命名冲突。
package语句必须是文件中除注释以外的第一行程序代码:package access
,以表明该文件是在包access 下。
比如说对于两个 Person 类,放在不同的包下,这样
java
package ming; // 申明包名ming
public class Person {
}
java
package hong; // hong
public class Person {
}
⚠️要特别注意:包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
类的导入
一个类可以使用所属包中的所有类,以及其他包中的公有类(public class)。
我们可以采用两种方式访问另一个包中的公有类。
- 为每个类名之前添加完整包名
java
java.time.LocalDate today = java.time.LocalDate.now();
- 使用
import
语句
plain
package abc;
public class Hello {
public void hi() {
}
}
plain
package xyz;
class Main {
void foo() {
// Main可以访问Hello
Hello h = new Hello();
}
}
plain
package abc;
public class Hello {
public void hi() {
}
}
plain
package xyz;
class Main {
void foo() {
Hello h = new Hello();
h.hi();
}
}
plain
__package abc;
public class Hello {
// 不能被其他类调用:
private void hi() {
}
public void hello() {
this.hi();
}
}
plain
package abc;
public class Hello {
public void hello() {
this.hi();
}
private void hi() {
}
}
plain
// private
plain
package abc;
public class Hello {
// protected方法:
protected void hi() {
}
}
plain
package xyz;
class Main extends Hello {
void foo() {
// 可以访问protected方法:
hi();
}
}
plain
package abc;
// package权限的类:
class Hello {
// package权限的方法:
void hi() {
}
}
plain
package abc;
class Main {
void foo() {
// 可以访问package权限的类:
Hello h = new Hello();
// 可以调用package权限的方法:
h.hi();
}
}
plain
package abc;
public class Hello {
void hi(String name) { // ①
String s = name.toLowerCase(); // ②
int len = s.length(); // ③
if (len < 10) { // ④
int p = 10 - len; // ⑤
for (int i=0; i<10; i++) { // ⑥
System.out.println(); // ⑦
} // ⑧
} // ⑨
} // ⑩
}
plain
package abc;
// 无法被继承:
public final class Hello {
private int n = 0;
protected void hi(int t) {
long i = t;
}
}
plain
package abc;
public class Hello {
// 无法被覆写:
protected final void hi() {
}
}
plain
package abc;
public class Hello {
private final int n = 0;
protected void hi() {
this.n = 1; // error!
}
}
plain
package abc;
public class Hello {
protected void hi(final int t) {
t = 1; // error!
}
}