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

Posted 写Bug的渣渣高

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了匿名内部类及与接口和抽象类的关系相关的知识,希望对你有一定的参考价值。

匿名内部类是什么

定义在外部类的内部,比如方法中,并且没有类名(由系统直接分配,若用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();
  

以上是关于匿名内部类及与接口和抽象类的关系的主要内容,如果未能解决你的问题,请参考以下文章

Java中的匿名内部类及内部类的二三事

Java匿名内部类的学习

Java面向对象 —— 抽象类接口内部类匿名内部类

lamada表达式和匿名内部类的区别

java抽象类及接口

JavaSE-22.1.7Lambda表达式和匿名内部类的区别