辨析匿名内部类,这一篇就够了!!!!

1.匿名内部类

在java中,如果该方法的参数 是一个接口类型,除了可以传入一个参数接口的实现类,还可以使用匿名内部类来作为该方法的参数,匿名内部类其实就是没有名称的内部类,在调用包含参数接口类型的方法时,通常为了简化代码,不会创建一个接口的实现类作为方法的传入,而是直接通过匿名内部类的形式传入一个接口类型参数

2.语法格式 

new 父接口(){

//匿名内部类实现部分; 

 (1)不使用匿名内部类的写法

package pack;

interface Anmail {
	void shout();
}

class Mycat implements Anmail {
	String name = "小花";
	@Override
	public void shout() {
		// TODO Auto-generated method stub
		System.out.println(name + "喵喵喵");
	}

}

public class Example01 {
	public static void main(String[] args) {

		anmailshout(new Mycat());
	}

	private static void anmailshout(Anmail an) {
		// TODO Auto-generated method stub
		an.shout();
	}
}

 

public class Example01 {
    public static void main(String[] args) {

        anmailshout(new Mycat());
    }

    private static void anmailshout(Anmail an) {
        // TODO Auto-generated method stub
        an.shout();
    }
}
这一块代码定义了anmailshout的方法,该方法是静态方法,随着类的加载而加载,当该方法的参数是接口类型,这是我们就应该思考,如何对这个接口类型参数实例化,因为学习接口的时候我们已经了解到,接口里面是抽象方法,接口是不能直接实例化的,即

Anmail an=new  Anmail();是错误的

所以我们需要一个类实现接口,然后创建这个类的对象作为参数,

Anmail an=new Mycat();当然这个里面也涉及了一个多态方面的向上转型问题。

如果写代码未免会有点太过于繁琐,所以我们引出了匿名内部类。 

package pack;

interface Anmail {
	void shout();
}

public class Example01 {
	public static void main(String[] args) {
		String name = "小花";
		anmailshout(new Anmail() {
			@Override
			public void shout() {
				// TODO Auto-generated method stub
				System.out.println(name + "喵喵喵");
			}
		});
	}

	private static void anmailshout(Anmail an) {
		// TODO Auto-generated method stub
		an.shout();
	}
}

所以大家不要把new Anmail()看做接口对象的实例化,其实这只是匿名内部类的一种写法。 

其实代码还可以进一步简化,下一次给大家整理Lambda表达式 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值