内部类和匿名类

来源:互联网 发布:桃源网络硬盘怎么架设 编辑:程序博客网 时间:2024/06/01 14:25

内部类:

编译器生成XXXX$XXXX这样的class文件


使用

1.类名前要加以外部类的名字

2.使用new创建内部类时,也要在new前面冠以对象变量


public class TestInnerClass { public static void main(String[] args) { Parcel p = new Parcel(); p.testShip(); Parcel.Contents contents = p.new Contents(33); /* 在Parcel外部使用Parcel内部类。。*/ Parcel.Destination d = p.new Destination("Hawai");  p.setProperty(contents, d); p.ship(); }}public class Parcel {private Contents c;private Destination d;class Contents{private int i;Contents(int i){this.i = i;}int value(){return i;}}class Destination{private String label;Destination(String whereTo){label = whereTo;}String readLabel(){return label;}}void setProperty(Contents c,Destination d){this.c = c;this.d = d;}void ship(){System.out.println("move "+ c.value() + " to " + d.readLabel());}public void testShip(){c = new Contents(22);d = new Destination("BeiJing");ship();}}

内部类可以直接访问外部类的字段和方法(即时private也可以)

若与外部类有同名的字段或者方法 则可用外部类名.this.字段及方法

内部类也是外部类的成员:

所以访问控制符可以有:public protected默认以及private.

final(不可继承的) abstract(抽象的)

static修饰内部类 则表明该内部类实际上是一种外部类

1.实例化staic类时 不需要在new前面加上对象实例变量

2. static不能访问非static

局部类

在一个方法中也可以定义类,这种类叫做局部类。

1.跟局部变量一样 不能用public,private static等等修饰 可以用 final abstract

2.可以访问外部类的成员

3.不能够访问该方法的局部变量 除非是final局部变量

public class Outer {private int size = 5;public Object makeTheInner(int localVar) {final int finalLocalVar = 99;class Inner {public String toString() {return ("InnerSize " + size + "" + " finalLocalVar:" + finalLocalVar);}}return new Inner();}public static void main(String[] args) {Outer outer = new Outer();System.out.println(outer.makeTheInner(2).toString());/*多态的体现。。 * 输出:InnerSize 5 finalLocalVar:99 * */}}


匿名内部类

顾名思义,是一种特殊的内部类

1.没有类名,定义该对象的同时就生成该对象的一个实例

2.“一次性使用”的类

匿名类的使用

1.不取名字,直接采用父类或接口的名字

2.编译器生成XXXX$1之类的名字

3.类定义的时候就创建实例

即 new 类名或接口名

4.在构造对象时使用父类的构造方法(不能定义构造方法 要带参数的话 只能使用父类构造方法的参数)

匿名类的应用

1.用到界面的时间处理(事件监听处理 )

2.作为方法的参数 (如作为一个比较大小的接口)

import java.util.Arrays;import java.util.Comparator;public class SortTest {public static void main(String[] args) {Integer arrays[] = {5,4,6,1,2};     Arrays.<Integer>sort(arrays,new Comparator<Integer>(){ /*实现Comparator接口的匿名内部类*/@Overridepublic int compare(Integer o1, Integer o2) {// TODO Auto-generated method stubreturn o1-o2;}     });     for (Integer integer : arrays) {System.out.println(integer+" ");}}}


0 0
原创粉丝点击