我们知道在Java中可以使用内部类。 内部类将一个类的定义放在另一个类的定义内部,但匿名内部类没有特定的名称,该如何使用呢?
定义匿名内部类
公共接口内容
{
int value (;
}
公共类测试1
{
隐私内容内容(
{
返回新内容(
{
私密int I=11;
@Override
公共int value () )
{
返回I;
}
(;
}
publicstaticvoidmain (字符串[ ] args ) )。
{
Test1 test=new Test1 (;
Contents con=test.contents (;
系统. out.println (con.value ) );
}
}
如上所述,我们定义了实现Contents接口的匿名内部类。 new表达式返回的引用将自动向上转换为对Contents的引用,输出结果为11。 这是最基本的匿名内部类,只是输出了结果。 接下来,让我们看看使用外部对象的匿名内部类。
使用带参数的匿名内部类
公共接口目标
{
字符串读取标签(;
}
公共类测试2
{
私有目标目标(finalstringdest )。
{
返回新目标(
{
私有字符串标签=dest;
@Override
公共字符串读取标签(
{
返回标签;
}
(;
}
publicstaticvoidmain (字符串[ ] args ) )。
{
Test2 test2=new Test2(;
目的地d=test2.目的地(Wuhan );
system.out.println(d.readlabel );
}
}
上面的匿名内部类传递使用外部定义对象的参数时,编译器要求该参数引用为final。 但是,在JDK1.8中,即使未设置为final,也没有报告错误。
初始化匿名内部类
公共接口目标
{
字符串读取标签(;
}
公共类测试3
{
公共目标目标(finalstringdest,final float price ) )。
{
返回新目标(
{
隐私成本;
{
cost=math.round(price;
If (成本100 ) )。
{
System.out.println;
}
}
私有字符串标签=dest;
@Override
公共字符串读取标签(
{
返回标签;
}
(;
}
publicstaticvoidmain (字符串[ ] args ) )。
{
Test3 test3=new Test3(;
destination D3=test3. destination (' Wuhan ',101.1F );
system.out.println (D3 .读取标签);
}
}
这样,在该匿名内部类中初始化了cost,但由于匿名内部类没有名称,所以初始化方法当然也没有名称。
使用匿名内部类后,如果使用工厂方法,该方法将变得非常简洁和易于使用。
最后,说明为什么需要内部类。 最吸引人的原因之一是,每个内部类都可以独立地继承一个(接口的)实现,从而不影响内部类,无论外围类是否已经继承了某个(接口的)实现。 如上所述,使用匿名内部类时,匿名内部类提供了直接接口,在某些情况下也提供了便利。