Java匿名内部类,
分享于 点击 6902 次 点评:71
Java匿名内部类,
public class innerClass {
public static void main(String[] args) {
Imammal ma = new Imammal() {
public void move() {
System.out.println("swimming!");
}
public void jump() {
System.out.println("jumping!");
}
};
new Imammal() {
public void move() {
System.out.println("swimming!");
}
public void jump() {
System.out.println("jumping!");
}
}.jump();
Comparable str0 = new String("test");
String str = new String("test");
}
}
interface Imammal {
public abstract void move();
}
以java运行为例。
1.创建方式不同
匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类。
第一种,创建出的为类的子类。
new 父类构造器([参数列表]){
//匿名内部类类体
}
第二种,为接口的实现类。
new 接口(){
//匿名内部类类体
}
由接口的特性可知,第二种匿名内部类类体必须全部重写接口中的方法。
但第一种可以重写,也可以不重写。
两者都可以增加新的方法。
2.代码给出了匿名内部类的两种调用。
第一种为接口回调,类似于上转型对象(即父类声明,子类实例化)。
new Imammal(){}出来的已经是接口的实例化对象,前面的 Imammal 仍为接口。
类比下面的 Comparable str0 = new String("test");
Comparable 是一种接口,而String中实现了Comparable接口,相当于 Comparable 是父类,而String是子类。此时的str0是上转型对象,不可调用子类中新增的方法/属性。
第二种是非上转型对象方式创建的匿名内部类对象。
这个匿名内部类仍属于Imammal接口类,但它没有对象名,不可以通过 对象名.方法名/属性名 来调用其内方法属性。
同一个匿名内部类对象只能调用一个新增的属性或方法。
这两种创建方式均没有对象名,他们都没有构造方法。
相关文章
- 暂无相关文章
用户点评