1.内部类:
1 /* 2 局部内部类: 在一个类 的方法内部定义另外一个类,那么另外一个类就称作为局部内部类。 3 4 局部内部类要注意的细节: 5 1. 如果局部 内部类访问了一个局部变量,那么该局部变量必须使用final修饰、 6 7 8 */ 9 class Outer{ 10 11 String name= "外部类的name"; 12 13 public void test(){ 14 //局部变量 15 final int y =100; // y 什么时候从内存中消失? 方法执行完毕之后y消失。 16 17 //局部内部类 18 class Inner{ /* 19 当test方法执行完毕之后,那么y马上从内存中消失,而Inner对象在方法 20 执行完毕的时候还没有从内存中消失,而inner对象的print方法还在访问着 21 y变量,这时候的y变量已经消失了,那么就给人感觉y的生命变量已经被延长了 22 . 23 24 解决方案: 如果一个局部内部类访问一个局部变量的时候,那么就让该局部内部类 25 访问这个局部 变量 的复制品。 26 */ 27 int x = 10; 28 29 public void print(){ 30 System.out.println("这个是局部内部类的print方法.."+y); 31 } 32 } 33 34 Inner inner = new Inner(); //这个inner对象什么时候消失? Inner对象的生命周期比局部变量y的生命周期要长。 35 inner.print(); 36 } 37 38 39 } 40 41 42 class Demo5 43 { 44 public static void main(String[] args) 45 { 46 Outer outer = new Outer(); 47 outer.test(); 48 } 49 }
注意特点:如果没有statice,那就要对内部类进行实例化,让其成为对象。如果有statice,那么就只用实例化外部类就可以了。内部类与外部类的方法是平级的。
2.匿名内部类:
1.继承下的的匿名内部类
1 /* 2 3 匿名内部类:没有类名的类就称作为匿名内部类。 4 5 匿名内部类的好处:简化书写。 6 7 匿名内部类的使用前提:必须存在继承或者实现关系才能使用。 8 9 10 匿名内部类一般是用于实参。 11 12 */ 13 14 abstract class Animal{ 15 16 public abstract Animal run(); 17 18 public abstract void sleep(); 19 } 20 21 class Outer{ 22 23 public void print(){ 24 //需求: 在方法内部定义一个类继承Animal类,然后调用run方法与sleep()。 25 26 /* 27 //局部内部类 28 class Dog extends Animal{ 29 30 public void run(){ 31 System.out.println("狗在跑.."); 32 } 33 34 public void sleep(){ 35 System.out.println("狗趴在睁开眼睛睡.."); 36 } 37 } 38 39 //创建对象 40 Dog d = new Dog(); 41 d.run(); 42 d.sleep(); 43 */ 44 //匿名内部类 :匿名内部类只是没有类名,其他的一概成员都是具备的。 45 // 匿名内部类与Animal是继承 的关系。 目前是创建Animal子类的对象. 46 Animal a = new Animal(){ //多态 47 48 //匿名内部的成员 49 public Animal run(){ 50 System.out.println("狗在跑.."); 51 return this; 52 } 53 54 public void sleep(){ 55 System.out.println("狗趴在睁开眼睛睡.."); 56 } 57 58 //特有的方法 59 public void bite(){ 60 System.out.println("狗在咬人.."); 61 } 62 63 }; 64 65 a.bite(); 66 a.run(); 67 a.sleep(); 68 69 } 70 } 71 72 class Demo6 73 { 74 public static void main(String[] args) 75 { 76 //System.out.println("Hello World!"); 77 78 Outer outer = new Outer(); 79 outer.print(); 80 81 } 82 }
2.接口实现下的匿名内部类
1 //实现关系下匿名内部类 2 interface Dao{ 3 4 public void add(); 5 } 6 class Outer{ 7 8 public void print(){ 9 //创建一个匿名内部类的对象 10 new Dao(){ //不是接口不能创建对象吗?怎么现在又可以了? 11 12 public void add(){ 13 System.out.println("添加成功"); 14 } 15 }.add(); 16 } 17 } 18 19 class Demo7 20 { 21 public static void main(String[] args) 22 { 23 test(new Dao(){ 24 25 public void add(){ 26 System.out.println("添加员工成功"); 27 } 28 }); 29 30 31 } 32 //调用这个方法... 33 public static void test(Dao d){ //形参类型是一个接口引用.. 34 d.add(); 35 } 36 }
原文:http://www.cnblogs.com/bequt/p/5040515.html