1 package Inner; 2 /** 3 * 测试内部类的使用 4 * @author 小王同学 5 * 1.成员内部类 ①非静态内部类 ②静态内部类 6 * 2.局部内部类 7 * 3.匿名内部类 8 * 总结: 内部类不只是普通的类,还可以是接口(Interface)默认static abstract修饰 ,抽象类(abstract) 9 * 使用方法内部类时,一定要在内部类中调用一下内部类中的方法否则无法使用. 列如:new Inner3().test(); 10 * 成员内部类就是类的一个成员变量. 11 * 静态内部类只能使用外部类的静态成员. 普通内部类可以调用外部类的任何方法和属性,私有的也可以. 12 * 普通内部类就是方法的方法的一个局部变量,作用域只限于方法体中. 13 * 匿名内部类就是用来实现抽象方法或者是接口的抽象方法的. 14 * 使用匿名内部类实现抽象类的方法时,必须要抽象类声明为静态的(static)才行,因为在main方法中不能直接调用非静态方法. 15 */ 16 public class Outer { 17 private String name; 18 private static int age; 19 //1.测试成员内部类 20 class Inner{ 21 } 22 static class Inner2{ 23 void run(){ 24 System.out.println(age);//静态内部类只能使用外部类的静态成员。 25 } 26 } 27 //2.测试方法内部类 28 void testxx(){ 29 int a =10; 30 class Inner3{ 31 public void test(){//内部累的方法,可以和外部类的方法重名. 32 System.out.println("这是方法内部类"); 33 System.out.println("这是外部方法的局部变量:a="+a); 34 System.out.println("这是外部方法的成员变量:age="+name); 35 } 36 37 } 38 39 new Inner3().test();//方法内部类在这里调用,不然在外界没有办法访问到 40 } 41 //3.测试匿名内部类 42 interface Inter { //接口和抽象方法也可以充当内部类使用 43 void show(); 44 } 45 static abstract class Inner4{ //这里不加static的话,在使用匿名内部类时,就无法 46 abstract void jump(); 47 } 48 public static void main(String[] args) { 49 //1.成员内部类 50 /**两种定义非静态内部类的方法 */ 51 Inner n1 =new Outer().new Inner(); 52 Outer o1 =new Outer(); 53 Inner n2 =o1.new Inner(); 54 /**定义静态类的方法 */ 55 Inner2 n3 =new Outer.Inner2();//直接使用new 外部类.内部类(); 56 //2.方法内部类 57 /**调用方法内部类的方法 */ 58 new Outer().testxx(); 59 //3.匿名内部类 60 /**这是实现接口的抽象方法*/ 61 Inter t1= new Inter(){ 62 @Override 63 public void show() { 64 System.out.println("这是匿名内部类噢噢噢噢"); 65 } 66 }; 67 t1.show(); //调用匿名内部类 68 /**实现抽象类的抽象方法 */ 69 Inner4 in4 =new Inner4() { 70 @Override 71 void jump() { 72 // TODO Auto-generated method stub 73 74 } 75 }; 76 } 77 }