——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
听老师说Android里匿名内部类很常用,在做APP时,对各种事件的监听,例如点击、拖拽、按下松开等都需要用匿名内部类。所以匿名内部类一定要好好掌握!
Java 语言中,类的定义可以相互嵌套,即在一个类的定义中嵌套定义另一个类,被嵌套在内部的类称为内部类,匿名内部类就是没有名字的内部类。由于无名可用,所以不可能用匿名类声明对象,却可以直接用匿名类创建一个对象。Java 匿名内部类是在接口和抽象类的应用上发展起来的,所以匿名内部类的声明要么是基于继承的,要么是基于实现接口的。
/*
匿名内部类,没有类名
使用匿名内部类,前提,有继承父类,或者实现接口
匿名内部类,只能写方法中
匿名内部类,是一种简化形式,简化的是,类继承类或者实现接口,重写抽象方法,建立子类对象
格式
new 父类或者接口{
重写抽象方法
}.抽象方法
*/
interface MyInter
{
public abstract void show();
}
class MyInterImpl implements MyInter
{
public void show(){
}
}
/*
以上代码,是实现类,实现接口,重写方法
main中建立实现类对象
MyInterImpl my = new MyInterImpl();
my.show();
使用匿名内部类,对以上代码进行简化,一步完成
*/
class Outer
{
public void outer(){
//使用匿名内部类,实现接口,重写方法,建立对象,调用重写方法,一步实现
new MyInter(){
public void show(){
System.out.println("匿名内部类重写方法show");
}
}.show();
//以上从new开始,到分号结束,叫做匿名内部类
//看成是接口MyInter的实现类,并且还创建出实现类对象
}
}
class NiMingDemo
{
public static void main(String[] args)
{
Outer o = new Outer();
o.outer();
//System.out.println("Hello World!");
}
}
以上代码成功使用了匿名内部类调用了重写的接口中的方法,但是如果我地接口中有两个抽象方法呢?该怎么调用?
有人说把代码复制一下,在调用另一个方法不就好了。
可是这样做在编译后会产生两个内部类对象,怎么用一个匿名内部类调用2个方法呢?
/*
匿名内部类,简化实现类的书写
*/
interface MyInter
{
public abstract void show();
public abstract void show2();
}
class Outer
{
public void outer(){
//下面new开始,都是接口的实现类对象。多态
//接口引用指向自己的实现类对象==实现类是一个匿名内部类
MyInter my = new MyInter(){
public void show(){
System.out.println("匿名内部类,重写show方法");
}
public void show2(){
System.out.println("匿名内部类,重写show2....方法");
}
};
my.show();
my.show2();
}
}
class NiMingDemo1
{
public static void main(String[] args)
{
new Outer().outer();
}
}
没错,答案就是多态调用。
用接口引用指向自己的实现类对象(实现类是一个匿名内部类)。