为什么必须要为final呢
我们一般都是利用构造器来完成某个实例的初始化工作的,但是匿名内部类是没 有构造器的!那怎么来初始化匿名内部类呢?使用构造代码块!利用构造代码块 能够达到为匿名内部类创建一个构造器的效果
常见的匿名内部类实例
public class Demo {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
Thread t = new Thread(r);
t.start();
}
}
成员内部类 也是最常规的内部类。该内部类相当于位于外部类的成员的位置。该内部类可以 访问外部类的所有成员和方法,即使是private.
public class Outer {
public class Inner {
public void print(String str) {
System.out.println(str);
}
}
public Inner getInner() {
return new Inner();
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.print("Outer.new");
inner = outer.getInner();
inner.print("Outer.get");
}
}
静态内部类
class Outter {
public Outter() {
System.out.println("Outter constructor.");
}
static class Inner {
public Inner() {
System.out.println("Inner constructor.");
}
}
}
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner();
}
}
方法内部类 类被创建在外部类方法中
class People{
public People() {
}
}
class Man{
public Man(){
}
public People getWoman(){
class Woman extends People{ //局部内部类
int age =0;
}
return new Woman();
}
}
匿名内部类
就是一个内部类的简化版
定义匿名内部类的前提是,该类必须继承一个外部类或者实现接口。 具体实现如下图 这是一个继承类的正常版,一共分为这几步
Out outer = new Out();
Out.In inner = outer.new In(); //第一个Out是为了说
明该内部类到底属于哪个外部类
外部类的访问
内部类为非静态时,外部类访问内部类,必须建立内部类对象。建立 对象方法,如前所述。
内部类为静态时, 外部类访问非静态成员,通过(外部类对象名.内 部类名.方法名)访问,如new Out().In.function();
内部类为静态时,外部类访问静态成员时,直接通过(外部类名.内部 类名.方法名) ,如 Out.In.funchtion();
PS:当内部类中定义了静态成员时,内部类必须是静态的;当外部静态方法访问内部类时,内部类也必须是静态的才能访问
原文:https://www.cnblogs.com/AronJudge/p/14643182.html