看了本文章你将知道什么是匿名内部类,如何熟练掌握并使用匿名内部类。如果你已经是大牛可以跳过,没有看的必要。
什么是匿名内部类What
先说类,我们都知道类用于描述客观世界里某一类对象的共同特征,对象是其具体体现。类可以被被认为是一种自定义的数据类型,可以使用类来定义变量。也就是所说的类类型,是一种引用数据类型。
如果在一个类里面定义一个类,那么这个类就是内部类,外面的那个类就是外部类,这个很好理解。内部类就相当于外部类的一个成员,你可以把内部类看成一个整体。内部类分为:静态内部类,非静态内部类。匿名内部类是非静态内部类的一种特殊情况,匿名内部类没有类名,因此就不可能有构造函数,不能创建对象。除此之外还有局部内部类,就是定义在方法内的,这个一般不怎么用,不需要掌握,知道就好,本文主要说匿名内部类,其他内部类以后会说。
为什么会有匿名内部类
说白了,就是因为想偷懒,不想写太多代码。如果可以,程序员完全可以通过实现接口或者继承抽象类的方式来实现而不用创建匿名内部类。但是使用匿名内部类的优点是显而易见的,可以少些代码,而且代码更加简洁。
匿名内部类的定义
先看匿名内部类的定义的语法格式:
new 实现接口()
{
//匿名内部类类体部分
}
new 父类构造器(实参列表)
{
//匿名内部类类体部分
}
为什么匿名内部类的定义有这两种方式呢?这是因此这两种方式的定义分别对应两种方式,一种是接口,另一种是抽象类。
对于实现接口,由于接口是没有构造函数的,注意这里一定是空参数。
第二种是调用父类的构造器,注意此处可以是空参数,也可以传入参数。
如何使用匿名内部类
对于匿名内部类的使用,我将通过两个具体的例子进行说明,如果你看懂了这两个例子,就基本掌握了他的使用,建议多看几遍例子。
第一种情况:实现接口
interfance Product
{
public double getPrice();
public String getName();
}
上面代码定义一个接口,接口里面两个抽象方法
public class Anonymous
{
public void test (Product p)
{
System.out.println(p.getName()+"--------"+p.getPrice());
}
public static void main(String [ ] args )
{
Anonymous as= new Anonymous ();
as.test(new Product( )//此处实现接口并实现抽象方法
{
public double getPrice( )//实现方法
{
return 8888;
}
public String getName( )//实现方法
{
return "I can do it ";
}
});
}
}
上面代码很简单,就是定义了一个类Anonymous,在类里定义了一个test方法。然后就是创建Anonymous对象,调用他的实例方法test()。
不过调用test()方法时,要传入一个Product对象。但是由于Product是一个接口,无法创建对象,所以要实现该接口。因此此处采用匿名内部类的方式进行,并实现接口中全部的抽象方法!
作者:pmThinker_以默
链接:https://www.jianshu.com/p/0950c6787c7d
package com.lbj.javase22;
/**
* 匿名内部类:指的是类没有名字,直接在调用的类体里面重写实现继承过来的方法,达到不知名却知意的功能
*
*
* 优点:代码量减少,少定义一个类
* 缺点:复用性太低,没有名字可以进行重复使用
* @author 14811
*
*/
public class Test {
//首先定义一个静态方法
public static void t(CustomerService cs){
cs.logout();
}
//程序入口
public static void main(String[] args){
//如何调用t方法呢
//方法1
//编写一个类实现CustomerService接口
//调用t方法
//顺序main方法调用t方法,t方法调用logout方法,
//t(new CustomerServiceImpl());
//方法2
//使用匿名内部类的方法执行t方法
//整个new CustomerService(){} 就是匿名内部类
t(new CustomerService(){public void logout(){System.out.println("系统退出");}});
}
}
//定义一个接口
interface CustomerService{
//退出系统的抽象方法
void logout();
}
编写一个类实现CustomerService接口,在没有匿名内部类的时候还是写一个子类实现接口的方法,这时候我们再用方法2来看看怎么处理,怎么方便
//这种多定义一个类优点就是可以重复利用,而匿名内部类是不可以重复利用的
//class CustomerServiceImpl implements CustomerService{
// public void logout(){
// System.out.println("退出系统");
// }
//}
匿名内部类不能定义任何静态成员、方法。
匿名内部类中的方法不能是抽象的;
匿名内部类必须实现接口或抽象父类的所有抽象方法。
匿名内部类访问的外部类成员变量或成员方法必须用static修饰;
1、匿名内部类因为没有类名,可知匿名内部类不能定义构造器。
2、因为在创建匿名内部类的时候,会立即创建它的实例,可知匿名内部类不能是抽象类,必须实现接口或抽象父类的所有抽象方法。
3、匿名内部类会继承一个父类(有且只有一个)或实现一个接口(有且只有一个),实现父类或接口中所有抽象方法,可以改写父类中的方法,添加自定义方法。
5、当匿名内部类和外部类有同名变量(方法)时,默认访问的是匿名内部类的变量(方法),要访问外部类的变量(方法)则需要加上外部类的类名。