局部内部类:
1、 局部内部类(在外部类方法里)仅在该方法有效。不能使用访问控制符和static修饰符修饰。
匿名内部类:
定义匿名内部类格式:
new 父类构造器(实参列表)|实现接口()
{
匿名内部类类体部分
}
1、创建匿名内部类时会立刻创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类或是实现一个接口。
例:
- 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)
- {
- AnomymousTest ta = new AnomymousTest();
- //调用test方法时,需要传入一个Product参数,此处传入其匿名内部类的实例
- ta.test(new Product()
- {
- public double getPrince()
- {
- return 567.8;
- }
- public String getName()
- {
- return "AGP 显示";
- }
- })
- }
- }
定义匿名内部类不需要class关键字,而是在定义匿名内部类时直接生成该匿名内部类的对象。
*匿名内部类必须实现它的抽象父类或者接口里所包含的所有抽象方法。*
匿名内部类不能使抽象的,不能定义构造器。
匿名内部类只有一个隐式的构造器,顾new接口后的括号里不能传入参数值。
但继承父类创建匿名内部类时,此匿名内部类具有与父类相同的参数列表
例:
- abstract class Device
- {
- private String name;
- public abstract double getPrice();
- public Device(){}
- public Device(String name)
- {
- this.name = name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public String getName()
- {
- return name;
- }
- }
- public class AnnoymousInner
- {
- public void test(Device d)
- {
- System.out.println("购买了一个 " + d.getName() + ",花费了 " + d.Price())
- }
- public static void main(String[] args)
- {
- AnnoymousInner ai = new AnnoymousInner();
- //调用有参数的构造器创建Device匿名实现类的对象
- ai.test(new Device("电子示波器")
- {
- public double getPrince()
- {
- return 67.8;
- }
- });
- //调用无参数的构造器创建Device匿名实现类的对象
- Device d = new Device()
- {
- //初始化块
- {
- System.out.println("匿名内部类的初始化块。。。");
- }
- //实现抽象方法
- public double getPrince()
- {
- return 56.2;
- }
- //重写父类的实例方法
- public String getName()
- {
- return "键盘";
- }
- };
- ai.test(d);
- }
- }