一、什么是内部类,内部类有哪些类型?
内部类:定义在一个类内部的类。
四种形式:
成员式:静态内部类和一般成员内部类;相当于外部类的一个成员;
局部式:放在外部类的方法体内部,相当于一个局部变量一样; 分为 普通局部内部类和匿名内部类。
-------------------------------------------------------------------------------------------------------------------------
二、成员静态内部类
* 静态内部类: 作为外部类的类成员存在的
* 修饰符和成员内部类一样
* 静态内部里不能访问外部类的非静态成员,只能访问静态成员
* 声明: 外部类名.内部类名
* 实例化: new 外部类名.内部类构造函数();
* 静态内部里可以定义静态成员
public class OuterA {
public static String staticStr = "static String";
public String str = "general string";
public static class InnerA{
public InnerA(){
System.out.println("InnerA()...");
}
public void accessOutClass(){
System.out.println(OuterA.staticStr);//可以访问外部类的静态成员
// System.out.println(str);//访问外部类的非静态成员是会出错
}
}
}
实例化:
OuterA.InnerA innerA = new OuterA.InnerA();
innerA.accessOutClass();
-------------------------------------------------------------------------------------------------------------------------
三、非静态成员内部类
* 每一个成员内部类的对象都对应一个外部类对象;一个外部类对象可以有多个内部类对象;
* 在成员内部类可以访问外部类的 私有属性和方法 ,可以通过 OuterB.this. 来访问,但不是必须的。
public class OuterB {
private int intOuter=100;
public void useInner(){
InnerB innerb = this.new InnerB();
}
public class InnerB{
public InnerB(){
System.out.println("InnerB...");
}
public void accessOuter(){
System.out.println(OuterB.this.intOuter);//可以访问外部类的属性和方法
}
}
}
实例化:
OuterB outB = new OuterB();
outB.useInner();
OuterB.InnerB innerB = outB.new InnerB();
innerB.accessOuter();
-------------------------------------------------------------------------------------------------------------------------
四、一般局部内部类
局部内部类:在方法中定义甚至在代码块中定义的;使用最少的一种内部类;
相当于局部变量,不能用访问控制修饰;
局部内部类可以访问外部类的成员变量,但只能访问final 类型的局部变量;
public class OuterC {
private String name="hehe";
public void useLocalInner(){
final int id=10;
class LocalInner{
public void accessMethod(){//只能访问外部方法的final属性
System.out.println(id);
}
public void accessOuter(){//可以访问外部类的属性和方法
System.out.println(name);
}
};
LocalInner localInner = new LocalInner();
localInner.accessMethod();
localInner.accessOuter();
}
}
实例化:
OuterC outerC = new OuterC();
outerC.useLocalInner();
-------------------------------------------------------------------------------------------------------------------------
五、局部匿名内部类
匿名内部类:特殊的局部内部类,没有类名,没有构造方法,
public class OuterD {
public OuterD() {
System.out.println("OuterD...");
}
public void testAnonymous() {
new Thread() {
public void run() {
while (true) {
System.out.println("Thread:" + this.getId());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
实例化
OuterD outerD = new OuterD();
outerD.testAnonymous();
我觉得java的内部类的设计还是蛮清晰的,一种是作为类成员的成员式,一种是作为方法内部的局部式。第一种成员式就是外部类的一个成员。局部式更简单就像方法中的局部变量一样,只要注意以上的一些语法细节就ok了。