zoukankan      html  css  js  c++  java
  • Java

    匿名内部类

    匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。下面这段代码是一段 Android 事件监听代码:

    scan_bt.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
             
        }
    });
     
    history_bt.setOnClickListener(new OnClickListener() {
         
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
             
        }
    });

    这段代码为两个按钮设置监听器,这里面就使用了匿名内部类。这段代码中的:

    new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
             
        }
    }

    就是匿名内部类的使用。代码中需要给按钮设置监听器对象,使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。当然像下面这种写法也是可以的,跟上面使用匿名内部类达到效果相同。

    private void setListener()
    {
        scan_bt.setOnClickListener(new Listener1());       
        history_bt.setOnClickListener(new Listener2());
    }
     
    class Listener1 implements View.OnClickListener{
        @Override
        public void onClick(View v) {
        // TODO Auto-generated method stub
                 
        }
    }
     
    class Listener2 implements View.OnClickListener{
        @Override
        public void onClick(View v) {
        // TODO Auto-generated method stub
                 
        }
    }

    这种写法虽然能达到一样的效果,但是既冗长又难以维护,所以一般使用匿名内部类的方法来编写事件监听代码。同样的,匿名内部类也是不能有访问修饰符和 static 修饰符的。

    匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为 Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

    那么 Java的:

    public class Main {
        public static void main(String[] args) {
            driveCar(new Car(){     //匿名内部类
                @Override
                public void drive() {
                    System.out.println("驾驶着BMW汽车");
                }
            });
        }
        public static void driveCar(Car car){
            car.drive();
        }
    }
    
    interface Car {
        void drive();
    }

    分析以上代码知道静态方法driveCar需要一个Car对象,我们通过实现接口创建一个匿名类对象传递过去。事实上还可以通过继承类来创建一个匿名内部类对象。
    注意事项:匿名内部类没有构造方法。也是唯一没有构造方法的内部类。匿名内部类和局部内部类只能访问外部类的final变量。

    匿名内部类还可以这样写:

    Thread thread1 = new Thread("优先级为1"){
               @Override
               public void run() {
                   super.run();
                   for(int i = 0;i < 100;i++){
                       System.out.println(getName());
                   }
               }
           };

    那么 此时的 thread1 线程对象就是 匿名内部类对象了。(即:匿名内部类 赋值  Thread对象)

    其实吧 就是即定即用的意思  重写了就用重写哪里的方法。

    本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14723938.html

  • 相关阅读:
    .net Api 接口调用 增删改查
    自学Java基础知识第十七天
    自学Java基础知识第十六天
    自学Java基础知识第十五天
    自学Java基础知识第十四天
    自学Java基础知识第十三天
    自学Java基础知识第十二天
    自学Java基础知识第十一天
    自学Java基础知识第十天
    自学Java基础知识第九天
  • 原文地址:https://www.cnblogs.com/bi-hu/p/14723938.html
Copyright © 2011-2022 走看看