【Java】匿名内部类及与接口和抽象类的关系

匿名内部类是什么

定义在外部类的内部,比如方法中,并且没有类名(由系统直接分配,若用debug查看变量,显示的是外部类名.$数组)
匿名内部类可以访问外部类的私有属性和私有方法,不能添加修饰符

public class Anonymous {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.tiger.cry();
        outer.dog();
    }
}
interface IA{
    void cry();
}

class Outer{
    //如果要使用IA接口,并创建对象,传统方式是写一个类实现接口并创建对象
    //但是这个类只需要使用一次所以使用匿名内部类来简化开发
    //匿名内部类的名字由系统自动分配,需要使用对象.getclass
    //接口其实是无法new的,但是这里通过大括号并实现其中的方法,是的其可以创建并且将地址传递给tiger
    //匿名内部类只能使用一次,但是已经创建的tiger可以多次使用
    IA tiger=new IA() {
        @Override
        public void cry() {
            System.out.println("老虎狂啸");
        }
    };

    public void dog() {
        IA dog = new IA() {
            @Override
            public void cry() {
                System.out.println("小狗汪汪");
            }
        };
    }
    new Father(){
      @Override
      publi void ih(){
        sop("匿名内部类调用了hi方法")
      }
    }.hi();//这样甚至都不用创建变量,直接调用
    //体现了匿名内部类的对象的特征
    
    Father father=new Father("jack"){
        //匿名内部类中不能重写构造器,不能创建特有方法
        //运行类型是Outer$3
        //这里可以重写father的方法
        //这里相当于继承了一个类,省去了创建不必要的新的子类
        @Override
        public void test() {
            super.test();
        }
    };//这里有大括号,所有是匿名内部类
//    Father father=new Father("jack");这里是直接创建father对象
}


class Father{
    String name;
    public Father(String name){
        this.name=name;
    }
    public void test(){
        System.out.println("name="+name);
    }
}

匿名内部类可以当成实参直接传递

```Java
class m{
  public static voie main(String[] args){
    f1(new IL(){//注意这里的用法,原本接口时无法new的,但是这里使用了{}并实现了方法
      @Override
      public void show(){
        sop("这是一副名画");
      }//当作实参直接传入,否则就需要用一个类继承接口在new之后调用,
      });  
  }
  publc static void f1(IL il){
    il.show();
  }
  interface IL{
    void show();
  }
}
  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣渣高不会写Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值