java 匿名内部类
程序员文章站
2022-06-07 16:46:41
...
匿名内部类的结构有以下2种:
需要注意的地方:
匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法:
1,如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。
2,将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。
3,在这个匿名内部类中使用初始化代码块
使用内部类的优点:
1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。即内部类实例对包含它的哪个类的实例来说,是特权的。
2.对于同一个包中的其他类来说,内部类能够隐藏起来,换句话说,内部类不管方法的可见性如何,那怕是public,除了包容类,其他类都无法使用它。
3.匿名内部类可以很方便的定义回调。
4.使用内部类可以非常方便的编写事件驱动程序。
例子:
一个Animal接口
一个Dog类
测试类
new interfacename(){......}; new superclassname(){......};
需要注意的地方:
匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法:
1,如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。
2,将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。
3,在这个匿名内部类中使用初始化代码块
使用内部类的优点:
1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。即内部类实例对包含它的哪个类的实例来说,是特权的。
2.对于同一个包中的其他类来说,内部类能够隐藏起来,换句话说,内部类不管方法的可见性如何,那怕是public,除了包容类,其他类都无法使用它。
3.匿名内部类可以很方便的定义回调。
4.使用内部类可以非常方便的编写事件驱动程序。
例子:
一个Animal接口
public interface Animal { public String getCry(); public String getName(); }
一个Dog类
public class Dog { private String name; public Dog(String str){ this.name=str; } public String getDogName(){ return this.name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
测试类
public class AnonymousTest { private String x="喵喵~~"; private String y="cat"; public static void main(String[] args) { AnonymousTest t=new AnonymousTest(); Animal animal= t.CreateAnimalByInterface(); System.out.println(animal.getCry()); System.out.println(animal.getName()); Dog d=t.CreateAnimalByClass("boyu"); System.out.println(d.getDogName()); } public Animal CreateAnimalByInterface(){ //new interfacename(){......}; return new Animal(){ //任何外部类都无法条用该方法,除非在接口或继承类中实现 public String top(){ String top="匿名类内参数~~"; return top; } @Override public String getCry() { return getX(); } @Override public String getName() { return getY(); } }; } public Dog CreateAnimalByClass(String x){ // new superclassname(){......}; return new Dog(x){ @Override public void setName(String str) { super.setName(str); } @Override public String getDogName() { return super.getName(); } }; } public String getX() { return x; } public void setX(String x) { this.x = x; } public String getY() { return y; } public void setY(String y) { this.y = y; } }
上一篇: php登陆问题[txt保存数据]