JAVASE-匿名对象和匿名内部类-2019.10.25

124 阅读1分钟

1、匿名对象:是一个对象,但没有名字,而且在栈内存中没有值指向这个匿名对象,易于垃圾回收。

举例:

//定义一个Student类

Class Student {
      public void method() {
        System.out.println("GOOD GOOD STUDY")
    }
 }
 
 //常规方法创建对象并调用方法
 Student s1 = new Student();
 s1.method();
 
 //创建匿名对象并调用方法
 new Student().method();

2、匿名内部类:本质上是一个抽象类的子类对象或者接口的实现类对象

格式:

new 类名/接口名 (){重写方法}

举例:

interface Inter{ void method(); }
public class Test{
    public static void main(String[] args){ 
        new Inter(){ 
            @Override 
            public void method(){
                System.out.println("我是匿名内部类"); 
             } 
        }.method(); // 直接调用方法
    }
}

匿名内部类面试题: 按照要求,补齐代码

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

思路:

1:在main方法中,Outer.method()可以看出,method()应该是一个静态方法;
2:在main方法中,Outer.method().show()可以看出:
    1)method()方法的返回值是一个对象;
    2)又由于接口Inter中有一个show()方,所以可以认为method()方法的返回值是一个接口的实现类对象;
    3)但是题目没有定义类去实现接口Inter,所以只能是利用匿名内部类的方法作为接口的实现类对象;
    4)又因为在调用show()方法时要输出HelloWorld,所以要把show()方法在匿名内部类中重写。

//补齐的代码部分:

class Outer {
    public static Inter method() {
       return new Inter() {
           public void show() {
               System.out.println("HelloWorld");
           }
        };
    }
}