内部类
1.实例内部类:定义在类的内部的一个类
- 如何实例化内部类?
OuterClass.InnerClass innerClass = out.new InnerClass();
外部类名.内部类名 变量 = 外部类对象的引用.new 内部类();
- 只要是内部类,那么生成的字节码文件格式:外部类$内部类.class
- 在实例内部类中,不能定义静态的成员变量!!如果非要定义,那么一定要在编译时期确定的值
public static final int data = 4;
- this实际上是一个静态的成员
System.out.println(OuterClass.this.data);
- 示例内部类实际上拥有2个this。一个是实例内部类自己的,一个是外部类的。面试题:实例内部类,是否有额外的内存开销?
- 代码
public static void main(String[] args) {
//InnerClass innerClass = new InnerClass();
OuterClass out = new OuterClass();
OuterClass.InnerClass innerClass2 = out.new InnerClass();
innerClass2.test();
}`
2.静态内部类:定义在类的内部的一个类,但由static来修饰的。
- 如何拿到静态内部类对象?
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
外部类名.内部类名 变量 = new 外部类.静态内部类();
- 字节码文件和上面是相同的。
- 在静态内部类当中,是不可以访问外部类的非静态数据成员的!!!因为,外部类的非静态数据成员是依赖于外部类对象的。
- 代码
public static void main2(String[] args) {
OuterClass out = new OuterClass();
OuterClass.InnerClass innerClass = new OuterClass.InnerClass(out);
innerClass.test();
}
3.匿名内部类:
在匿名内部类中,使用的变量,或者是常量或者是在整个过程当中没有发生改变的量
class OuterClass {
public void sayHello() {
System.out.println("hello");
}
}
public class TestDemo {
public void func() {
class A {
//本地内部类
}
}
public static void main(String[] args) {
int data1 = 10;
new OuterClass(){
@Override
public void sayHello() {
//data1 = 10;
//super.sayHello();
System.out.println("hhhhhh,匿内部类终于学完了!!!");
System.out.println(data1);
}
}.sayHello();
}