匿名内部类

  • 匿名内部类尝试书写
package com.an.a;
//对匿名内部使用的测试
interface Swim{
    public abstract void swim();//抽象方法

}
public class TestA {
    public static void main(String[] args) {
        /*
        需要理解匿名内部类的格式而不是硬背:
        new 类名或接口名(){
          重写方法;
        };
         */
        new Swim(){
          public void swim(){
              System.out.println("重写了游泳的方法");
          }
        };
    }
}

关于匿名内部类书写格式的理解

以接口或抽象类的实现子类推导其匿名内部类的写法


对于匿名内部类的书写格式的理解可以 用javap反编译来加以验证
对于抽象类的匿名内部类也类似理解

匿名内部类的使用

package com.an.a;
//对匿名内部使用的测试
//抽象类
abstract class  Animal{
    public abstract void eat();
}
class Dog extends Animal{

    @Override
    public void eat() {
        System.out.println("小狗爱吃骨头");
    }
}

public class TestA {
    public static void main(String[] args) {
        /*
        需要理解匿名内部类的格式而不是硬背:
        new 类名或接口名(){
          重写方法;
        };
         */
        /*要在测试类中调用method方法
          该方法的参数为抽象类,则必须传递其实现子类的对象(接口也是同样的道理)
          但是如果我们的Dog类只要用一次,那么单独定义一个类那就太麻烦了
         */
        //方式一:直接传递其实现类的对象
        //Dog dog =new Dog();
        //method(dog);//小狗爱吃骨头
        //方式二:传递Animal的匿名内部子类的对象
        method(new Animal() {
            @Override
            public void eat() {
                System.out.println("小狗也爱吃肉");//小狗也爱吃肉
            }
        });
        //方法调用过程:传递其实现子类的对象,经过向上转型,父类调用eat调用重写后的eat
    }
    public static void method(Animal a){//Animal a=子类对象 多态
        a.eat();
    }
}

对于匿名内部类的拓展小点

package com.an.a;
//对匿名内部使用的测试
interface Swim{
    public abstract void   swim();
}

public class TestA {
    public static void main(String[] args) {
        /*
        需要理解匿名内部类的格式而不是硬背:
        new 类名或接口名(){
          重写方法;
        };
         */
        //理解点1:
        //写了一个实现了Swim的匿名内部子类
     //Swim s=  new Swim(){ //此时相当于向上转型

           //@Override
           //public void swim() {
             //  System.out.println("实现了游泳方法");
          // }
     //  };
    // s.swim();//父类调用被子类重写的方法
        //理解点2:
        new Swim() {
            @Override
            public void swim() {
                System.out.println("实现了游泳方法");
            }
        }.swim();//此时为一个匿名对象,可以调用自己的方法
    }

}

posted @ 2023-01-08 08:45  一往而深,  阅读(22)  评论(0编辑  收藏  举报