将一个类定义在另一个类里面,对里面那个类就称为内部类(内置类,嵌套类)。
访问特点:
内部类可以直接访问外部类中的成员,包括私有成员。而外部类要访问内部类中的成员必须要建立内部类的对象。一般用于类的设计。分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容,这时就是还有的事物定义成内部类来描述。(孙悟空阶芭蕉扇,进铁扇公主的肚子,孙悟空是内部类,铁扇公主是外部类) class Outer { private static int num=3; static 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(); } } class InnerClassDemo { 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(); } }内部类-细节
为什么内部类能直接访问外部类的成员呢?
那是因为内部类持有了外部类的引用。外部类名.this
class Outer { int num=3; class Inner { int num=4; void show() { int num=5; System.out.println(num);//System.out.println(Outer.this.num); } } void method() { new Inner().show(); } } class InnerClassDemo2 { public static void main(String[] args) { new Outer().method();//输出5 } }内部类-局部内部类
内部类可以存放在局部位置上。
内部类在局部位置上只能访问局部中被final修饰的局部变量。
class Outer { int num=3; void method() { final int x=9; class Inner { void show() { System.out.println("show..."+x);//从内部类中访问局部变量x,需要被声明为最终类型final } } Inner in=new Inner(); in.show(); } } class InnerClassDemo3 { public static void main(String[]args) { new Outer().method(); } }匿名内部类
匿名内部类。就是内部类的简写格式。
必须有前提:
内部类必须继承或者实现一个外部类或者接口。
匿名内部类:其实就死一个匿名子类对象。
格式:new 父类or接口()(子类内容)
astract class Demo { abstract void show(); } class Outer { int num=4; /* class Inner extends Demo { void show() { System.out.println("show..."+num); } } */ public void method() { //new Inner().show(); new Demo//匿名内部类。 { void show() { System.out.println("show......."+num); } } } } class InnerClassDemo4 { public static void main(String[]args) { new Outer().method(); } }匿名内部类-应用
interface Inter { void show1(); void show2(); }通常使用场景之一:
当函数参数是接口类型时,而且接口中的方法不超过三个。
可以用匿名内部类作为实际参数进行传递。
class Outer { /* class Inner implements Inter { public void show1(); { } public void show2() { } } */ public void method() { //Inner in=new Inner(); //in.show1(); //in.show2(); Inter in=new Inter() { public void show1() { } public void show2() { } }; in.show1(); in.show2(); } } class InnerClassDemo5 { public static void main(String[]args) { show(new Inter()) { public void show1(); public void show2(); } } public static void show(Inter in) { in.show1(); in.show2(); } }