new 父类构造器(参数列表)|实现接口(){ //匿名内部类的类体部分}
匿名类分类
匿名类由于是一个new的结果,所以其实可以赋值给一个父类对象。因此可以分为两种匿名类,成员匿名类和局部匿名类(作为函数参数)。
使用匿名内部类前提条件
必须继承一个父类或实现一个接口当然也仅能只继承一个父类或者实现接口。同时它也是没有class关键字,这是因为匿名内部类是直接使用new来生成一个对象的引用。当然这个引用是隐式
匿名内部类使用的注意事项
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。同时要实现父类或接口中所有抽象方法,可以改写父类中的方法,添加自定义方法。
2、匿名内部类因为没有类名,可知匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内类生效。
5、因为在创建匿名内部类的时候,会立即创建它的实例,匿名内部类不能是抽象的,它必须要实现继承的类或者实现接口的类的所有抽象方法。
6、匿名内部类和外部类有同名变量方法)时,默认访问的是匿名内部类的变量(方法),要访问外部类的变量(方法)则需要加上外部类的类名。匿名内部类访问外部类成员变量或成员方法必须用static修饰
匿名内部类的使用
package com.vg.demo04;//不使用匿名内部类来实现抽象方法abstract class Person{public abstract void eat();}class Child extends Person{public void eat() {System.out.println("eat something");}}public class TestDemoniming {public static void main(String[] args) {Person p = new Child();p.eat();}}
package com.vg.demo04;//匿名内部类的基本实现abstract class Person{public abstract void eat();}public class TestDemoniming {public static void main(String[] args) {Person p = new Person() {public void eat() {System.out.println("eat something");}};p.eat();}}
package com.vg.demo04;//在接口上使用匿名内部类interface Person{public abstract void eat();}public class TestDemoniming {public static void main(String[] args) {Person p = new Person() {public void eat() {System.out.println("eat something");}};p.eat();}}
package com.vg.demo04;//Thread类的匿名内部类实现public class TestDemoniming {public static void main(String[] args) {Thread t = new Thread() {public void run () {for(int i = 1;i<=5;i ) {System.out.println(i " ");}}};t.start();}}
package com.vg.demo04;//Runnable接口的匿名内部类实现public class TestDemoniming {public static void main(String[] args) {Runnable r = new Runnable() {public void run () {for(int i = 1;i<=5;i ) {System.out.println(i " ");}}};Thread t = new Thread(r);t.start();}}
来源:https://www.icode9.com/content-4-733401.html
联系客服