1、匿名内部类的本质:
匿名内部类本质上是一个重写或实现了父类或接口的子类对象。
2、使用场景:
当类或接口类型作为参数传递时,可以直接使用匿名内部类方式创建对应的对象
3、匿名内部类嵌套使用
① 需求:按main方法中给出的调用方式补全Class InnerClass中的代码,使得在控制台中能够输出HelloWorld。
//需求:按照要求,补齐代码
abstract class Demo{
public abstract void show();
}
interface Inter{
Demo test();
}
class InnerClass{
//补齐代码
}
class NoNameInnerClassTest {
public static void main(String[] args) {
InnerClass.show().test().show();
}
}//要求在控制台输出”HelloWorld”
② 解题思路分析:
分析1:首先从main方法入手,通过InnerClass.show()可以看出InnerClass类中肯定存在一个静态show方法,而且该show方法的返回值能继续调用Inter接口中的test方法,那么show方法的返回值类型可以定下来,为Inter类型。不过问题来了,这个静态show方法的方法体应该是什么呢?
分析2:接着上面的分析,我们至少知道该静态show方法的方法体中需要有return语句,需要返回Inter类型的对象。而题目中又明显没有给出一个实现了Inter接口的实现类,没有现成的接口实现类对象可以返回。既然没有,那么就只有靠自己创造了,用匿名内部类创建一个实现了Inter接口的子类对象,给return去返回,问题解决。可是新的问题又来了,实现Inter接口的时候,需要重写Inter接口中的test方法,它里面的方法体又应该是什么呢?
分析3:同分析2的分析一样,从test方法的返回值类型中,我们至少可以知道该test方法的方法体中需要有return语句,需要返回Demo类型的对象。同样的,题目也没有给出继承了Demo抽象类的类,没有现成的继承了抽象类的类对象可以返回。既然没有,还是得自己创造。用匿名内部类创建Demo抽象类的对象,给return去返回,问题解决。同样,新的问题还是来了,继承Demo抽象类的时候,Demo中的show方法我们可以选择重写也可以选择不重写,那么到底是重写还是不重写呢?
分析4:其实分析3的新问题,在main方法中已经给出了答案!从main方法中的调用方式可以看到,最后是调用了show方法的,而且我们最后的目的是在控制台中能够输出HelloWorld,单单调用这个没有方法体的show方法显然是没戏的,因此在用匿名内部类创建Demo抽象类的子类对象时候,需要重写Demo抽象类中的show方法,方法体的内容就是我们最后需要实现的目的:打印HelloWorld,搞定!
③ 代码补全
public class NoNameInnerClassHomework {
public static void main(String[] args) {
InnerClass.show().test().show();// 要求在控制台输出”HelloWorld”
}
}
abstract class Demo {
public abstract void show();// 抽象方法,继承它的子类必然要重写这个方法,而且要输出”HelloWorld”
}
interface Inter {
Demo test();//Inter接口里的方法没有方法体,继承了它的子类肯定也要重写这个方法,返回值是Demo类型
}
class InnerClass {
//补齐代码
static Inter show() {//分析:InnerClass.show(),说明InnerClass里存在静态show方法,而且它的返回值能调用test方法,那么得是个Inter类的对象,而匿名内部类实质正好就是写在方法中的实现了重写的子类对象对象
return new Inter() {
public Demo test() {//实现Inter接口里的方法
return new Demo() {
public void show() {//重写Demo里的抽象方法
System.out.println("Hello,World");
}
};
}//test方法括号
};
}//show方法括号
}
举一反三:之后为了加深对匿名内部类的理解,将需求中的调用方式给更改为InnerClass.show();从而相应的代码补全也需要更改,分析方法与上面分析1、2、3、4类似,就不分析了。
//按照要求,补齐代码
abstract class Demo{
public abstract void show();
}
interface Inter{
void test();
}
class InnerClass{
//补齐代码
}
class NoNameInnerClassTest {
public static void main(String[] args) {
InnerClass.show();
}
}//要求在控制台输出”HelloWorld”
代码的补全:
class InnerClass {
static void show() {
new Inter() {
public void test() {
new Demo() {
public void show() {
System.out.println("Hello,World");
}
}.show();
}
}.test();
}
}