论文导读::学习过JAVA的人都知道。什么是匿名类。匿名类与普通类子类的分析和比较。匿名类与接口实现类的分析和比较。
论文关键词:JAVA,匿名类,子类,接口
1.引言
什么是匿名类,很多教材和参考书把它解释为:匿名类是一个内部类,是一个没有类名的类,匿名类的优点是它可以使代码结合更加紧凑,使代码更加易于理解。
其实,这种解释并没有说明匿名类的实质子类,这是对匿名类的一种很肤浅的认识和理解。因此,很多JAVA的学习者尤其是初学者在接触到匿名类时常常是一头雾水,不知道匿名类到底是一个什么东西,以及在实际编程中如何去运用匿名类。学习过JAVA的人都知道,在JAVA GUI程序设计中会大量地运用到匿名类,很多学习者在编写这类程序时常常是模仿一些现成的实例,但并没有搞清楚为什么这样用,并且有很多此类程序由于匿名类的大量运用,使得这类代码变得难以理解,这其中一个很根本的原因就是没有搞清楚匿名类的实质。
本文的理解是:匿名类是一个内部类,匿名类实质也是一个类(普通类或抽象类)的子类或者是一个接口的一个实现类中国论文网。
下面就通过三个具体的实例来分析匿名类的实质。
2.匿名类与普通类子类的分析和比较
public class AnalyseAno
{
class TestClass
{
void sleep()
{
System.out.println ('this general class id sleeping');
}
void cry()
{
System.out.println ('this general class is crying');
}
}
class Son extends TestClass
{
void cry()
{
System.out.println('this general class'son is crying');
}
}
|
void test()
{
TestClass aa=new Son();
TestClass bb=new TestClass(){public void cry()
{ System.out.println ('this general class'son is crying'); } };
aa.cry();
bb.cry();
}
public static void main(String[] args)
{
AnalyseAno tt=new AnalyseAno();
tt.test();
}
}
|
表1 匿名类与普通类子类示例代码比较表
表一中的代码定义了两个内部类TestClass 和Son,其中Son是TestClass的子类子类,Son覆盖了TestClass中的cry方法。另外,在test方法中创建了两个实例,一个是Son的一个实例aa,另一个是TestClass的一个匿名类的一个实例bb,该匿名类的方法与Son中的方法相同,最后用这两个不同的实例分别调用相应的cry方法。其运行结果都为'this generalclass'son is crying'。这个实例说明::定义一个匿名类与定义一个一般类的一个子类,其内在含义和调用方法方式完全相同。
3.匿名类与抽象类子类的分析和比较
public class AnalyseAno
{
abstract class TestAbstract
{
void sleep()
{
System.out.println ('this abstract class id sleeping');
}
abstract void cry();
}
class Son extends TestAbstract
{
public void cry()
{
System.out.println ('this abstract class'son is crying');
}
}
|
void test()
{
TestAbstract aa=new Son();
TestAbstract bb=new TestAbstract()
{ public void cry()
{
System.out.println ('this abstract class'son is crying');
} };
aa.cry();
bb.cry();
}
public static void main(String[] args)
{
AnalyseAno tt=new AnalyseAno();
tt.test();
}
}
|
表2 匿名类与抽象类子类示例代码比较表
表二中的代码定义了两个内部类TestAbstract 和Son,其中Son是TestClass的子类,TestAbstract是一个抽象类,Son覆盖了TestAbstract中的cry抽象方法。另外,在test方法中创建了两个实例,一个是Son的一个实例aa子类,另一个是TestAbstract的一个匿名类的一个实例bb,该匿名类的方法与Son中的方法相同,最后用这个不同的实例分别调用相应的cry方法。其运行结果都为'this general abstractclass'son is crying'。这个实例说明::定义一个抽象匿名类与定义一个抽象类的一个子类(当然这个子类不能再是一个抽象类)其内在含义和调用方法方式完全相同。
4.匿名类与接口实现类的分析和比较
public class AnalyseAno
{
interface TestInterface
{
void sleep();
abstract void cry();
}
class Son implements TestInterface
{
public void cry()
{
System.out.println ('this interface' sonis crying');
}
public void sleep()
{
System.out.println ('this interface'son is sleeping ');
}
}
|
void test()
{
TestInterface aa=new Son();
TestInterface bb=new TestInterface()
{ public void cry()
{
System.out.println ('this interface' son is crying');
}
public void sleep()
{
System.out.println ('this interface'son is sleeping '); }};
aa.cry();
bb.cry();
}
public static void main(String[] args)
{
AnalyseAno tt=new AnalyseAno();
tt.test();
}
}
|
表3 匿名类与接口实现类示例代码比较表
表三中的代码定义了一个内部接口TestInterface 和实现这个内部接口的一个内部类Son, Son实现了接口TestInterface中的两抽象方法cry和sleep中国论文网。另外,在test方法中创建了两个实例,一个是Son的一个实例aa,另一个是TestInterface的一个匿名类的一个实例bb,该匿名类的方法与Son中的方法相同,最后用这个不同的实例分别调用相应的cry方法。其运行结果都为'this interface'son is crying'。这个实例说明::定义一个接口匿名类与定义一个接口的一个实现类(当然这个实现类不能是一个抽象类)其内在含义和调用方法方式完全相同。
5.结论:
匿名类可以理解为一个类(普通类或抽象类)的子类或者是一个接口的一个实现类,当这个匿名类是一个普通类的子类时,这个类中的方法必须要覆盖父类中的某些方法,否则没有任何意义;当这个匿名类是一个抽象类的子类时子类,这个类中的方法必须要实现父类中所有的抽象方法,当然也可以覆盖某些方法;当这个匿名类是一个接口的一个实现类时,这个类中的方法必须要实现这个接口中所有的抽象方法。总之,匿名类的定义原则和调用方式与类的子类以及接口实现类(这些子类或实现类不能是抽象类)的定义原则和调用方式完全相同,所不同的主要有两点:其一,若匿名类中定义的方法在父类或接口中没有定义或声明时,则这个方法无法调用,也就是说这个方法没有任何意义,但是在子类或实现类中却不存在这种情况;其二,匿名类的实例化是通过其父类或所实现的接口(如 new <父类名或接口名>()来实现来,匿名类没有类名所以也没有构造方法)。
参考文献
[1]李芝兴等.Java程序设计之网络编程.清华大学出版社,2009年8月第1版
[2]王森.Java深度历险,华中科技大学出版社,.2002年10月 第1版
[3]王克宏.Java技术教程(基础篇),清华大学出版社,2002年
|