【内部类】匿名内部类及应用

特点

  • 是没有名称的内部类,没有办法引用它们。必须在创建时,用new语句的一部分来声明并创建他们的实例
  • 必须继承一个类(抽象的,非抽象的都可以)或者实现一个接口。如果父类或接口是抽象类,匿名内部类必须实现其所有的抽象方法
  • 在匿名内部类中可以定义代码块,用于实例的初始化,但是不能定义静态代码块

语法

  • new interface/ superclass(){ 类体 }
  • 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展。或者实现一个给定的接口,并同时创建该匿名类的一个新的实例

应用

public class AnonymousInner {

     public static void main(String[] args) {
          Person p=new Person();
          //如果dog对象我们只使用一下下,那么给他创建一个引用是划不来的
/*        Animal dog=new Dog();
          p.feed(dog);*/
          //使用匿名内部类,创建Animal的子类对象,直接在子对象中实现需要的方法
          p.feed(new Animal(){
              public void eat(){
                   System.out.println("eating bones");
              }
          });
          //多次调用匿名内部类的话把匿名内部类对象赋值给引用变量
          Animal cat=new Animal(){
              public void eat(){
                   System.out.println("eating fish");
              }
          };

          p.feed(cat);

          //匿名内部类对象可以调用自身的方法,
          //下面的代码除了实现父类Animal的eat方法,还拥有自己的show方法,在创建了之后,就可以直接调用。
          new Animal(){
              private String name="cat";
              //匿名内部类可以有非静态代码块
              {
                   name="Tiger";
              }
              public void eat(){
                   System.out.println("eating fish");
              }
              public void show(){
                   System.out.println(name);
              }
          }.show();
     }
}
class Person{
     public void feed(Animal animal){
          animal.eat();
     }
}

abstract class Animal{
     public abstract void eat();
}

//使用了匿名内部类,这个子类也就没有必要单独建了,
//如果子类只使用一次,建议不要创建子类,而是通过匿名内部类实现父类或接口的方法来完成。
/*class Dog extends Animal{
     public void eat(){
          System.out.println("eating bones");
     }
}*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值