9.面向对象(4):包
2025-05-15 本文已影响0人
呦丶耍脾气
包
包(Package) 是一种用于组织和管理类、接口及其他资源的命名空间机制。它的核心意义在于解决大型项目中的代码组织、命名冲突、访问控制等问题
定义包
在类文件首行声明包名:
package model; // 声明该类属于model包
public class User {
private String name;
// ...
}
导入包
通过 import 使用其他包的类
import model.User; // 导入单个类
import model.*; // 导入整个包(不推荐,易导致冲突)
import static java.lang.System.*;// 导入System类的所有静态字段和静态方法:不常用
public class Main {
public static void main(String[] args) {
User user = new User(); // 使用导入的User类
out.println("Hello, world!");// 相当于调用System.out.println(…)
}
}
Java编译器最终编译出的.class文件只使用完整类名,因此,在代码中,当编译器遇到一个class名称时:
- 如果是完整类名,就直接根据完整类名查找这个class;
- 如果是简单类名,按下面的顺序依次查找:
- 查找当前package是否存在这个class;
- 查找import的包是否包含这个class;
- 查找java.lang包是否包含这个class。
// Main.java
package test;
import java.text.Format;
public class Main {
public static void main(String[] args) {
java.util.List list; // ok,使用完整类名 -> java.util.List
Format format = null; // ok,使用import的类 -> java.text.Format
String s = "hi"; // ok,使用java.lang包的String -> java.lang.String
System.out.println(s); // ok,使用java.lang包的System -> java.lang.System
MessageFormat mf = null; // 编译错误:无法找到MessageFormat: MessageFormat cannot be resolved to a type
}
}
- 默认自动import当前
package的其他class;- 默认自动
import java.lang.*。
内部类
如果一个类定义在另一个类的内部,这个类就是Inner Class:
class Outer {
class Inner {
// 定义了一个Inner Class
}
}
public class Outer {
private String name;
public Outer(String name) {
this.name = name;
}
public class Inner {
public void print() {
System.out.println(Outer.this.name);
}
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer("张三");
Outer.Inner inner = outer.new Inner();
inner.print();
}
}
要实例化一个Inner,我们必须首先创建一个Outer的实例,然后,调用Outer实例的new来创建Inner实例:
Outer.Inner inner = outer.new Inner();
Inner Class和普通Class相比,除了能引用Outer实例外,还有一个额外的“特权”,就是可以修改Outer Class的private字段,因为Inner Class的作用域在Outer Class内部,所以能访问Outer Class的private字段和方法。
观察Java编译器编译后的.class文件可以发现,Outer类被编译为Outer.class,而Inner类被编译为Outer$Inner.class。