内部类定义在局部时:
1.不可以被成员修饰符修饰
2.可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量
package com.dreamy.day04; /** * @author dreamy * */ class Outer{ int x=3; void method(final int a) { final int y=4; class Inner{ void function() { System.out.println(a); } } new Inner().function(); } } public class InnerClassDemo01 { /** * @param args */ public static void main(String[] args) { Outer out=new Outer(); out.method(7); out.method(8); } }
匿名内部类:
1.匿名内部类其实就是内部类的简写格式。
2.定义匿名内部类的前提:
内部类必须是继承一个类或者实现接口。
3.匿名内部类的格式:new 父类或者接口(){ 定义子类的内容 };
4.其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。
package com.dreamy.day04; /** * @author dreamy * */ abstract class AbsDemo{ abstract void show(); } class Outer{ int x=3; /* class Inner extends AbsDemo{ void show() { System.out.println("show:"+x); } } */ public void function() { //new Inner().show(); /*匿名内部类1: new AbsDemo() { void show() { System.out.println("show:"+x); } }; */ //匿名内部类2: //new Inner().show(); new AbsDemo() { @Override void show() { System.out.println("x==="+x); } }.show(); } } public class InnerClassDemo01 { /** * @param args */ public static void main(String[] args) { new Outer().function(); } }
5.匿名内部类中定义的方法最好不要超过3个
package com.dreamy.day04; /** * @author dreamy * */ abstract class AbsDemo{ abstract void show(); } class Outer{ int x=3; /* class Inner extends AbsDemo{ void show() { System.out.println("show:"+x); } } */ public void function() { //new Inner().show(); /*匿名内部类1: new AbsDemo() { void show() { System.out.println("show:"+x); } void abc(){ System.out.println("haha"); } }; */ //匿名内部类2: //new Inner().show(); new AbsDemo() { @Override void show() { System.out.println("x==="+x); } void abc() { System.out.println("haha"); } }.abc(); } } public class InnerClassDemo01 { /** * @param args */ public static void main(String[] args) { // new Outer().function(); //AbsDemo a=new Inner(); AbsDemo d=new AbsDemo() { @Override void show() { System.out.println("x==="+x); } void abc() { System.out.println("haha"); } }; d.show(); //d.abc();/编译失败,因为父类没有这个方法。 } }
package com.dreamy.day04; /** * @author dreamy * */ abstract class AbsDemo{ abstract void show(); } class Outer{ int x=3; public void function() { //new Inner().show(); /*匿名内部类1: new AbsDemo() { int num=9; void show() { System.out.println("num:"+num); } void abc(){ System.out.println("haha"); } }; */ //匿名内部类2: //new Inner().show(); new AbsDemo() { int num=90; @Override void show() { System.out.println("x==="+num); } void abc() { System.out.println("haha"); } }.show(); } } public class InnerClassDemo01 { /** * @param args */ public static void main(String[] args) { new Outer().function(); //AbsDemo a=new Inner(); AbsDemo d=new AbsDemo() { int num=9; @Override void show() { System.out.println("num==="+num); } void abc() { System.out.println("haha"); } }; d.show(); //d.abc();/编译失败,因为父类没有这个方法。 } }