一 点睛

匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下:

new 父类构造器(实参列表) | 实现接口()

{
//匿名内部类的类体部分
}

从上面的定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。

两条规则。

匿名内部类不能是抽象类。

匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以初始化块,可以通过初始化块来完成构造器需要完成的工作。

1 点睛

最常用的创建匿名内部类的方式是创建某个接口类型的对象。

2 代码

interface Product
 {
 public double getPrice();
 public String getName();
 }
 public class AnonymousTest
 {
 public void test(Product p)
 {
 System.out.println(“购买了一个” + p.getName()
 + “,花掉了” + p.getPrice());
 }
 public static void main(String[] args)
 {
 AnonymousTest ta = new AnonymousTest();
 // 调用test()方法时,需要传入一个Product参数,
 // 此处传入其匿名内部类的实例
 ta.test(new Product()
 {
 public double getPrice()
 {
 return 567.8;
 }
 public String getName()
 {
 return “AGP显卡”;
 }
 });
 }
 }


3 运行

购买了一个AGP显卡,花掉了567.8

4 说明

定义匿名内部类无须class关键字,而是在定义匿名内部类时直接生成该匿名内部类的对象。

由于匿名内部类不能是抽象类,所以匿名内部类必须实现它的抽象父类或接口里包含的所有抽象方法。

三 实战

1 点睛

当通过接口来创建匿名内部类时,匿名内部类不能显示创建构造器,因此匿名内部类里只有一个隐式的无参构造器,故new接口名后的括号里不能传入参数值。

如果通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的构造器,此处的相似指的是拥有相同的形参列表。

2 代码

abstract class Device
 {
 private String name;
 public abstract double getPrice();
 public Device(){}
 public Device(String name)
 {
 this.name = name;
 }
 // 此处省略了name的setter和getter方法
 public void setName(String name)
 {
 this.name = name;
 }
 public String getName()
 {
 return this.name;
 }
 }
 public class AnonymousInner
 {
 public void test(Device d)
 {
 System.out.println(“购买了一个” + d.getName()
 + “,花掉了” + d.getPrice());
 }
 public static void main(String[] args)
 {
 AnonymousInner ai = new AnonymousInner();
 // 调用有参数的构造器创建Device匿名实现类的对象
 ai.test(new Device(“电子示波器”)
 {
 public double getPrice()
 {
 return 67.8;
 }
 });
 // 调用无参数的构造器创建Device匿名实现类的对象
 Device d = new Device()
 {
 // 初始化块
 {
 System.out.println(“匿名内部类的初始化块…”);
 }
 // 实现抽象方法
 public double getPrice()
 {
 return 56.2;
 }
 // 重写父类的实例方法
 public String getName()
 {
 return “键盘”;
 }
 };
 ai.test(d);
 }
 }


Java学习中目前遇到的问题及注意点
1.复用代码的两种方法

复用代码的窍门在使用类而不破坏现有程序代码。

①组合:在新的类中产生现有类的对象。

②继承:以现有类的形式添加新的代码。

2.继承类调用构造器

导出类在调用构造器时,会自动调用基类的构造器。导出类的对象包含了基类的子对象。

public class test1 {
public test1() {
	System.out.println("test1");
}
}
public class test2 extends test1{
 public test2() {
 System.out.println(“test2”);
 }
 }public class achieve {
 public static void main(String[] args) {
 test2 a = new test2();
 }
 }