1,成员内部类: Outer$Inner.class
(1)将类定义到了另一个类的内部。A类要直接访问B类中的成员时,可以将A类定义到B类中。作为B类的内部类存在。相当于外部类的一个成员。
(2)访问规则:
a)内部类可以直接访问外部类中的成员。
b)外部类要想访问内部类,只能创建内部类的对象来访问。
c)如果内部类权限是非私有的,就可以在外部其他程序中被访问到。就可以通过创建外部类对象完成。Outer.Inner in=new Outer().new Inner();
Class Outer{ class Inner{//非静态类 show1(){ } //非静态 } }
(3)内部类可以直接访问外部类中的成员,是因为内部类持有了外部类的引用:外部类名.this (Outer.this),但是如果内部类为静态的就没有此引用了。
2,静态内部类
Class Outer{ static class Inner{ show1(){ } //非静态 static show2(){ }//静态 } }
(1)静态,非私有的内部类访问方式:访问非静态成员
Outer.Inner in=new Outer.Inner(); in.show1();
(2)静态,非私有的内部类访问方式:访问静态成员
Outer.Inner.show2();
注意:非静态内部类中只允许定义静态的常量(static final double PI=3.1415),不可以定义其他静态成员。
3,局部内部类: Outer$1 Inner.class 将内部类定义到了局部位置上。
(1)Java中的内部类不可以访问所在局部的局部变量,生命周期不同,编译时会报错。可以访问局部中的常量,final修饰的局部变量。
4,匿名内部类:Outer$1.class 简化书写的内部类。
(1)使用前提:内部类需要继承或者实现外部的类或者接口。
格式:new 父类or接口名(){子类的内容}
abstract class FU{ abstract void show(); } class Outer{ private int num=4; public void method(){ new FU(){//匿名内部类 //覆盖FU中的抽象方法。 public void show()
{
System.out.println("show------"+num);
} }.show();//调用匿名内部类中的方法
}
}
(2)匿名内部类其实就是一个子类对象