美文网首页
匿名内部类

匿名内部类

作者: 盼旺 | 来源:发表于2019-10-13 11:51 被阅读0次

    简介

    匿名内部类也就是没有名字的内部类
    正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
    但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

    当我们不使用匿名内部类来实现抽象方法的时候

    一个动物抽象类
    public abstract class Animal{
        public abstract void Name();
    }
    
    还需要定义一个类来继承这个动物类
    public class Dog extends Animal {
        @Override
        public void Name() {
            System.out.println("小狗狗");
        }
    }
    
    主函数实现一个Dog的实例,将其向上转型为Animal
    public class Main {
        public static void main(String[] args) {
            Animal dog = new Dog();
            dog.Name();
        }
    }
    

    如果此处的Dog类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

    使用匿名内部类来实现

    public abstract class Animal{
        public abstract void Name();
    }
    
    
    public class Main {
        public static void main(String[] args) {
            Animal animal = new Animal() {
                @Override
                public void Name() {
                    System.out.println("小狗狗");
                }
            };
            animal.Name();
        }
    }
    

    直接将抽象类Animal中的方法在大括号中实现了
    这样便可以省略一个类的书写
    并且,匿名内部类还能用于接口上

    在接口上使用匿名内部类

    public interface Food {
        public static final String name = "";
        public abstract double computePay();
        default void f() {
            System.out.println("start...");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Food food = new Food() {
                @Override
                public double computePay() {
                    return 100;
                }
            };
            food.f();
            System.out.println(food.computePay());
        }
    }
    

    只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
    最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口

    Thread类的匿名内部类实现

    public class Main {
        public static void main(String[] args) {
           Thread thread = new Thread(){
               @Override
               public void run() {
                   for(int i =0 ;i<5;i++){
                       System.out.print(i+" ");
                   }
               }
           };
           thread.start();
        }
    }
    

    Runnable接口的匿名内部类实现

    public class Main {
    
        public static void main(String[] args) {
           Runnable r = new Runnable() {
               @Override
               public void run() {
                   for (int i = 1; i <= 5; i++) {
                       System.out.print(i + " ");
                   }
               }
           };
           Thread thread = new Thread(r);
           thread.start();
        }
    }
    

    相关文章

      网友评论

          本文标题:匿名内部类

          本文链接:https://www.haomeiwen.com/subject/mufcmctx.html