内部类
内部类的构建
//com.insanus.OuterClass.java
package com.insanus;
public class OuterClass {
class InnerClass {
}
}
在外部访问这个类的时候需要具体地指明这个对象的类型
OterClassName.InnerClassName
也正是因为内部类的是类中类,所以内部类可以访问外部类的所有方法和属性。
可以把内部类理解成是外部类的一个属性
.this和.new
//com.insanus.OuterClass1.java
package com.insanus;
public class OuterClass1 {
class InnerClass1 {
public OuterClass1 getSupper() {
return OuterClass1.this;
}
}
public static void main(String[] args) {
OuterClass1 outclass = new OuterClass1();
OuterClass1.InnerClass1 interclass = outclass.new InnerClass1();
//因为是在OuterClass1类中,所以也可以这么写
//InnerClass1 interclass = outclass.new InnerClass1();
}
}
“想去哪就去哪”的内部类
方法里的内部类
//com.insanus.FunClass.java
package com.insanus;
public class FunClass {
//接口实现
public InterClassInterFace createClass() {
return new InterClassInterFace() {
};
}
//把类声明写入方法中
//public class InterClass {
//}
//public InterClass createClass() {
// return new InterClass() {
// }
//}
}
//com.insanus.InterClassInterFace.java
package com.insanus;
public interface InterClassInterFace {
}
内部类的继承和覆盖
//com.insanus.ExtendsClass.java
package com.insanus;
public class ExtendsClass {
public class InnerClass {
public void view() {
System.out.println("未被覆盖");
}
}
public static void main(String[] args) {
ExtendsClass outClass = new ExtendsClass();
InnerClassExtends innerClassExtends = new InnerClassExtends(outClass);
innerClassExtends.view();
}
}
class InnerClassExtends extends ExtendsClass.InnerClass {
InnerClassExtends(ExtendsClass e) {
e.super();
//通过这句话来提醒外围类和内围类的关系
//外部类必须初始化
}
public void view() {
System.out.println("已被覆盖");
}
}/* Output:
已被覆盖
*///:~
嵌套类
注意事项:
1. 嵌套类不能访问外部非静态对象
2. 创建嵌套类不需要外围类对象
//com.insanus.StaticClass.java
package com.insanus;
public class StaticClass {
public static class InterStaticClass {
}
}
内部类标示符
因为每个类都会产生.class文件,寻找内部类就可以借助内部类标示符
OuterClassName$InnerClassName.class