匿名内部类也就是没有名字的内部类
使用匿名内部类有个前提条件:必须继承一个父类或实现一个接口。
例1:不使用匿名内部类来实现抽象方法
可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用。
例2:匿名内部类的基本实现
例3:在接口上使用匿名内部类
匿名内部类最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或者实现Runnable接口。
例4:Thread类的匿名内部类实现
例5:Runnable接口的匿名内部类实现
在使用匿名内部类时,要记住以下几个原则:
· 匿名内部类不能有构造方法。 (因为匿名内部类是没有类名的)
· 匿名内部类不能定义任何静态成员、方法和类。
· 匿名内部类不能是抽象类。(因为在创建匿名内部类的时候,会立即创建匿名内部类的对象。从而也可知匿名内部类必须实现它的抽象父类或者接口里包含的所有抽象方法)
· 匿名内部类不能是public,protected,private,static。
· 只能创建匿名内部类的一个实例。
· 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
· 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
· 内部类只能访问外部类的静态变量或静态方法。
匿名类和内部类中的中的this :
有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。
关于内部类的作用:
一个内部类对象可以访问创建它的外部类对象的内容, 甚至包括私有变量!Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。
如果内部类里的一个成员变量与外部类的一个成员变量同名,也即外部类的同名成员变量被屏蔽了,怎么办?没事,Java里用如下格式表达外部类的引用:
外部类名.this