• Java中,匿名内部类在开发中的使用以及匿名内部类的面试题


    匿名内部类在开发中的使用

      我们在开发的时候,会看到抽象类,或者接口作为方法的形式参数。
      而这个时候,我们知道实际需要的是一个子类的对象。
      如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式进行简化。

      Android开发中这种格式见得多,
      JavaEE开发中见得少。

      为什么呢?
      因为匿名内部类的好处是:
        匿名内部类用完之后就是垃圾(即只能用一次),就可以立即被垃圾回收器回收,
        栈内存没有东西指向你,Android的手机内存小,要及时让这个对象被回收。

    示例代码如下:

     1 /*
     2     匿名内部类在开发中的使用:
     3         Android开发中这种格式见得多,
     4         JavaEE开发中见得少。
     5         
     6         为什么呢?
     7         因为匿名内部类的好处是:
     8             匿名内部类用完之后就是垃圾(即只能用一次),就可以立即被垃圾回收器回收,
     9             栈内存没有东西指向你,Android的手机内存小,要及时让这个对象被回收。
    10 */    
    11 
    12 //定义一个接口
    13 interface Person {
    14     public abstract void study();
    15 }
    16 
    17 //定义具体类实现接口
    18 class Student implements Person {
    19     public void study() {
    20         System.out.println("好好学习,天天向上");
    21     }
    22 }
    23 
    24 //方法的形式参数为接口时,需要的是该接口的实现类的对象。
    25 class PersonDemo {
    26     //接口名作为方法的形式参数
    27     //其实这里需要的不是接口,而是该接口的实现类的对象
    28     public void method(Person p) {
    29         p.study();
    30     }
    31 }
    32 
    33 class InnerClassTest2 {
    34     public static void main(String[] args) {
    35         //法一:测试PersonDemo类中的method方法。
    36         PersonDemo pd = new PersonDemo();
    37         Person p = new Student();
    38         pd.method(p);
    39         System.out.println("--------------------");
    40         
    41         //法二:匿名内部类在开发中的使用:
    42         //匿名内部类的本质是该类的子类或者实现该接口的实现类(子类)的匿名对象。
    43         pd.method(new Person(){
    44             public void study() {
    45                 System.out.println("好好学习,天天向上");
    46             }
    47         });
    48     }
    49 }
    50 
    51 运行结果为:
    52 好好学习,天天向上
    53 --------------------
    54 好好学习,天天向上

    匿名内部类的面试题

      按照要求,补齐代码
        interface Inter {

           void show();

         }
        class Outer {
          //补齐代码
        }
        class OuterDemo {
          public static void main(String[] args) {
            Outer.method().show();
          }
        }
      要求在控制台输出”HelloWorld”

    示例代码如下:

     1 /*
     2 匿名内部类的面试题:
     3     按照要求,补齐代码
     4         interface Inter { 
     5             void show(); 
     6         }
     7         class Outer { 
     8             //补齐代码 
     9         }
    10         class OuterDemo {
    11             public static void main(String[] args) {
    12                   Outer.method().show();
    13               }
    14         }
    15         要求在控制台输出”HelloWorld”
    16 */
    17 interface Inter {
    18     void show();
    19     // public abstract
    20 }
    21 
    22 class Outer {
    23     // 补齐代码
    24     public static Inter method() {
    25         // 子类对象 -- 子类匿名对象是子类对象的一种
    26         return new Inter() {
    27             public void show() {
    28                 System.out.println("HelloWorld");
    29             }
    30         };
    31         
    32     }
    33 }
    34 
    35 class OuterDemo {
    36     public static void main(String[] args) {
    37         Outer.method().show();
    38         /*
    39          * 1:Outer.method()可以看出method()应该是Outer中的一个静态方法。
    40          * 2:Outer.method().show()可以看出method()方法的返回值是一个对象。
    41          *         又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。
    42          */
    43     }
    44 }
  • 相关阅读:
    (转)性能测试---并发用户理解
    (转)基于DDD的现代ASP.NET开发框架--ABP分层架构
    (转)Web自动化测试中的接口测试
    (转) 一致性Hash算法在Memcached中的应用
    Memcached工作原理及常见问题
    Memcached介绍及相关知识
    .net 面试题总结
    使用IDEA工具配置和运行vue项目(详细其中的坑)
    关于伪分布zookeeper集群启动出错(Error contacting service. It is probably not running.)
    常用查找和排序
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8454629.html
Copyright © 2020-2023  润新知