在分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述的事物,这个还有的事物就可以定义为内部类来描述。
1、内部类的特点
①内部类可以直接访问外部类中的成员,因为内部类持有了外部类的引用,外部类名.this
②外部类如果要访问内部类的成员,必须要建立内部类的成员。
③如果内部类中定义了静态成员,则该内部类是静态的。
④如果内部类是静态的,该内部类相当于一个外部类。因为静态成员可以直接用类名调用,不需要创建对象。
class Outer{ private static int num = 31; class Inner// 内部类。 { void show() { System.out.println("show run..."+num); } /*static void function()//如果内部类中定义了静态成员,该内部类也必须是静态的。 { System.out.println("function run ...."+num); } */ } public void method() { Inner in = new Inner(); in.show(); }}public class InnerClass1 { public static void main(String[] args) {// Outer out = new Outer();// out.method(); //直接访问外部类中的内部类中的成员。 Outer.Inner in = new Outer().new Inner(); in.show(); //如果内部类是静态的。 相当于一个外部类// Outer.Inner in = new Outer.Inner();// in.show();// 如果内部类是静态的,成员是静态的。// Outer.Inner.function(); }}2、内部类可以放在局部位置上,当内部类放在局部位置上时,只能访问局部中被final修饰的局部变量
3、匿名内部类
匿名内部类就是内部类的简写格式,使用前提:内部类必须继承或实现一个外部类或者接口。匿名内部类其实就是一个匿名的子类对象。格式:new 父类或者接口() {子类内容}
abstract class Demo{ abstract void show();}class Outer { int num = 3; void method(){ new Demo(){ void show(){ System.out.println("show ........"+num); } }.show(); }}class InnerClass3{ public static void main(String[] args) { new Outer().method(); }}匿名内部类中方法有多个时如何调用?
interface Inter{ void show1(); void show2();}class Outer{ public void method() { Inter in = new Inter() { public void show1() { System.out.println("show1 run ..."); } public void show2() { System.out.println("show2 run ..."); } }; in.show1(); in.show2(); }}class InnerClass4 { public static void main(String[] args) { new Outer().method(); }}