## 内部类
内部类就是在一个类的内部再定义一个类。如:
Class A {
Class B{
}
}
A 是 B 的外部类,B 是 A 的内部类
成员内部类
public class Outer {
private int id ;
public void out() {
System.out.println("外部类的方法");
}
// 成员内部类
public class Inner {
public void inner() {
System.out.println("内部类的方法");
}
// 可以直接使用外部类的属性/方法
public void getOuterId(){
System.out.println("内部类调用外部类属性和方法");
// 创建成员内部类之前肯定要创建外部类对象
// 即使id不是静态变量、out不是静态方法,但创建外部类对象时已经存在。
System.out.println(id);
out();
}
}
}
静态内部类
看到静态二字难免想起 static
,没错!在成员内部类的基础上添加static修饰符,内部类即成为静态内部类
此时,静态内部类与外部类一起加载,所以不能调用非静态的属性和方法!
public class Outer {
private int id ;
public void out() {
System.out.println("外部类的方法");
}
public static void outStatic() {
System.out.println("外部类的静态方法");
}
// 静态内部类
public static class Inner {
public void inner() {
System.out.println("内部类的方法");
}
// 可以直接使用外部类的 静态!! 属性/方法
public void getOuterId(){
System.out.println("内部类调用外部类 静态!! 属性和方法");
outStatic();
}
}
}
局部内部类
局部内部类与局部变量类似,在方法中声明
public class Outer {
public void out() {
System.out.println("进入外部类的方法");
// 局部内部类
class Inner {
public void inner() {
System.out.println("局部内部类与局部变量类似,在方法中声明");
}
}
Inner inner = new Inner();
inner.inner();
}
}
匿名内部类
public class Application {
public static void main(String[] args) {
// 匿名内部类在多线程中的使用,到时候再深究
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类实现线程的逻辑操作");
}
});
// 开启线程
thread.start();
}
}
源文件声明规则
在本节的最后部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。
- 一个源文件中只能有一个public类
- 一个源文件可以有多个非public类
- 源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。
- 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
- 如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
- import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。这些将在访问控制章节介绍。
除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类。