匿名内部类必须extends类或implements接口,否则编译器不认识.它是没有类名的,在定义时显示的是它所继承的父类或 接口的名字.
一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。
例:
public class Parce16{
public Contents cont(){
return new Contents(){ //匿名内部类.
private int i = 11;
public int value(){return i;}
}; //这里有个分号
}
}
在匿名内部类末尾的分号,并不是用来标记内部类的结束,实际上,它标记的是表达式的结束,只不过这个表达式正巧包含了匿名类.在匿名类中不可能有命名构造器(因为它根本没有名字!),但通过实例初始化,就能够达到为匿名内部类创建一个构造器的效果.
例:
dest(final String dest,final float price){
return new Destination(){
private int cost;
{ //这里是一对独立的大括号表示实例初始化
cost = Math.round(price);
if(cost>100) System.out.println("Over budget!");
}
private String label = dest;
public String readLabel(){return label;}
};
}
对于匿名类而言,实例初始化的实际效果就是构造器.当然它受到了限制---你不能重载实例初始化方法,所以你仅有一个这样的构造器.
因其为局部内部类,那么局部内部类的所有限制都对其生效------(参看:内部类之局部变量)
当需要多个对象时使用局部内部类方可行,因为局部内部类有构造方法,可产生多个对象。匿名内部类中不能定义构造方法,它只有一个实例.
- package test;
- /**
- * 内部类之匿名内部类实例演示
- *
- * @author fhd001
- */
- public class InnerClassA {
- private String str1 = "abc";
- private int n = 35;
- private static String str2 = "MMM";
- public void show() {
- final int K = 54;
- InnerOne one = new InnerOne() {
- int n;
- {//实例初始化
- n = 60;
- System.out.println("这里是用一对大括号进行实例初始化");
- }
- // static String s = "name";内部类中不能定义static变量.
- public void aaa() {
- System.out.println("局部常量K的值为: " + K);
- System.out.println("外围类成员变量str1的值: " + str1);
- System.out.println("外围类成员变量n的值: " + InnerClassA.this.n);
- System.out.println("外围类成员变量str2的值: " + str2);
- System.out.println("内部类成员变量n的值: " + n);
- }
- };
- one.aaa();
- }
- public static void main(String[] args) {
- InnerClassA a = new InnerClassA();
- a.show();
- }
- }
- // 匿名内部类要实现的接口
- interface InnerOne {
- public void aaa();
- }
package test; /** * 内部类之匿名内部类实例演示 * * @author fhd001 */ public class InnerClassA { private String str1 = "abc"; private int n = 35; private static String str2 = "MMM"; public void show() { final int K = 54; InnerOne one = new InnerOne() { int n; {//实例初始化 n = 60; System.out.println("这里是用一对大括号进行实例初始化"); } // static String s = "name";内部类中不能定义static变量. public void aaa() { System.out.println("局部常量K的值为: " + K); System.out.println("外围类成员变量str1的值: " + str1); System.out.println("外围类成员变量n的值: " + InnerClassA.this.n); System.out.println("外围类成员变量str2的值: " + str2); System.out.println("内部类成员变量n的值: " + n); } }; one.aaa(); } public static void main(String[] args) { InnerClassA a = new InnerClassA(); a.show(); } } // 匿名内部类要实现的接口 interface InnerOne { public void aaa(); }
- 这里是用一对大括号进行实例初始化
- 局部常量K的值为: 54
- 外围类成员变量str1的值: abc
- 外围类成员变量n的值: 35
- 外围类成员变量str2的值: MMM
- 内部类成员变量n的值: 60