解决Anonymity内部类的迷惑

本文通过对比两种实现方式,详细解析了Java中匿名内部类的工作原理及其执行过程。首先介绍了使用传统实现类的方法,随后展示了如何利用匿名内部类简化代码,并保持相同的功能。适合初学者理解和掌握匿名内部类的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有个朋友对这个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) 只是一个引用(形参),到这一步相信大家都明白了,为什么还是同样的结果!!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值