内部类
定义在另一个类中的类
- 成员内部类(静态、非静态)
- 格式:
外部类
$内部类名
.class e.g.OuterClass$NonStaticInnerClass.class
OuterClass$NonStaticInnerClass.class
- 格式:
- 局部内部类(方法内、代码块内、构造器内)
- 格式:
外部类
$数字
内部类名
.class e.g.OuterClass$1PartInnerClass.class
- 格式:
- 作为外部类的成员
- 调用外部类的结构
- 可以被 static 修饰
- 可以被 4 种不同的权限修饰
- 作为一个类
- 类内可以定义属性、方法、构造器等
- 可以被 final 修饰,表示此类不能被继承。不使用 final,就可以被继承
- 可以被 abstract 修饰
在局部内部类的方法
中如果调用内部类所声明的方法中的局部变量
的话,要求此局部变量声明为 final 的。
OuterClass.java
package com.hua.demo;
public class OuterClass {
String name = "OuterClass";
private void show() {
System.out.println(this.name);
}
public static class StaticInnerClass {
}
public class NonStaticInnerClass {
String name = "NonStaticInnerClass";
public void show(String name) {
System.out.println(name); // 形参
System.out.println(this.name); // 内部类属性
System.out.println(OuterClass.this.name); // 外部类属性
OuterClass.this.show(); // 外部类的方法
}
}
public SomeInterface getPartInnerClass() {
class PartInnerClass implements SomeInterface {
}
return new PartInnerClass();
}
public void showPartInnerClass() {
int a = 1;
class PartInnerClass {
public void showPartAttr() {
// a += 1;
// variable should be final
System.out.println(a);
}
}
PartInnerClass partInnerClass = new PartInnerClass();
partInnerClass.showPartAttr();
}
}
interface SomeInterface {
}
InnerClassTest.java
package com.hua.demo;
import org.junit.Test;
public class InnerClassTest {
@Test
public void test() {
// 创建静态内部类实例
OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass();
System.out.println(staticInnerClass);
// 创建非静态内部类实例
OuterClass outerClass = new OuterClass();
OuterClass.NonStaticInnerClass nonStaticInnerClass = outerClass.new NonStaticInnerClass();
System.out.println(nonStaticInnerClass);
nonStaticInnerClass.show("Harvey");
outerClass.showPartInnerClass();
System.out.println(outerClass.getPartInnerClass());
}
}