Inner Class
定义
某个类定义在另一个类的内部,表示为:
class Outer {
class Inner {
}
}
例子
public class Demo {
public static void main(String[] args) {
Outer outer = new Outer("Hetongxue"); //实例化Outer
Outer.Inner inner = outer.new Inner(); //实例化Inner
}
}
class Outer {
private String name;
Outer(String name){
this.name = name;
}
class Inner {
void hello() {
System.out.println("Hello,"+ Outer.this.name);
}
}
}
Anonymous Class
定义
这也是一种定义Inner Class的方法,和上面不一样,不用Outer Class中定义这个class,而是在方法内部进行定义,表示为:
class Outer {
void asyncHello {
}
}
例子
public class Demo {
public static void main(String [] args){
Outer outer = new Outer("Nested"); // 只用实例化Outer
outer.asynHello();
}
}
class Outer {
private String name;
Outer(String name){
this.name = name;
}
void asynHello() {
Runnable r = new Runnnable() {
//Runnable本身是接口,这里定义了实现Runnable接口的匿名类
@Override
public void run(){
System.out.println("Hello,"+ Outer.this.name);
}
};
new Thread(r).start(); //线程池
}
}
Static Class
定义
用static修饰,称为静态内部类(Static Nested Class)。
class Outer{
static class StaticNested {
}
}
例子
public class Demo{
public static void main(String[] args) {
Outer.StaticNested sn = new Outer.StaticNested()}; //不用实例化outer,只用实例化StaticNested
sn.hello();
}
}
class Outer {
private static String NAME = "OUTER";
private String name;
Outer(String name){
this.name = name;
}
static class StaticNested {
void hello(){
System.out.println("Hello,"+ Outer.NAME); //上面没有实例化Outer,static是一个独立的类,无法引用Outer.this
}
}
}
总结
Java的内部类可分为Inner Class、Anonymous Class和Static Nested Class三种:
-
Inner Class和Anonymous Class本质上是相同的,都必须依附于Outer Class的实例,即隐含地持有Outer.this实例,并拥有Outer Class的private访问权限;
-
Static Nested Class是独立类,但拥有Outer Class的private访问权限。
参考链接
https://www.liaoxuefeng.com/wiki/1252599548343744/1376414781669409