今天有个朋友对这个Anonymity内部类不了解,整个执行过程究竟是什么样的
我在下面通过两个程序的对比来解析他们
1、先创建一个接口IPerson
package com.mars.Anonymity;
public interface IPerson {
public void say(String str);
}
2、接下来我们创建一个TomPersonImpl 的类
package com.mars.Anonymity;
public class TomPersonImpl implements IPerson {
public void say(String str) {
System.out.println("tom say:"+str);
}
}
3、我们来创建一个这样的测试类
package com.mars.Anonymity;
public class Test {
public void whoSay(){
tom(new TomPersonImpl());
}
public void tom(IPerson person){
person.say("I am Tom!!");
}
public static void main(String[] args) {
new Test().whoSay();
}
}
输出结果是:tom say:I am Tom!!
这样可以理解吧,通过父类的引用指向子类的对象,当我们执行whowSay()这个方法的时候,他就会执行他内部的相应的内容,这样tom(new TomPersonImpl())就被执行了,跳到了public void tom(IPerson person){}这一步了之后就不用我多说了吧!!我还没设计到Anonymity inside class的问题,在这里为下面打个基础。。。
好了我们继续:
我们对前面进行了替换
1、我们新建立一个abstract类AWhoSay:
package com.mars.Anonymity;
public abstract class AWhoSay {
public abstract void execute(IPerson person);
}
2、接下来我们对Test class进行了更换:
package com.mars.Anonymity;
public class Test extends AWhoSay{
public void whoSay(){
execute(new IPerson(){
public void say(String str) {
System.out.println("tom say:"+str);
}
});
}
@Override
public void execute(IPerson person) {
person.say("I am Tom ");
}
public static void main(String[] args) {
new Test().whoSay();
}
}
输出的结果是:tom say:I am Tom
还是一样的结果,有的人就在这里没理解清楚了!!其实是很简单的,就跟前面的一样,我们从程序的执行顺序来看,
1、当main方法中执行new Test().whoSay()的时候就跳到了public void whoSay()这个方法中来了
2、在whoSay方法中,肯定回执行execute()这个方法的,关键就在这里,首先表明的是接口不能被实例化,匿名类本身就是通过继承类或者接口来实现的。但是不能再显式的extends 或者implements了。 他创建了一个Anonymity的内部类传给public void execute(IPerson person) 只是一个引用(形参),到这一步相信大家都明白了,为什么还是同样的结果!!!