匿名内部类
- 匿名内部类尝试书写
package com.an.a;
//对匿名内部使用的测试
interface Swim{
public abstract void swim();//抽象方法
}
public class TestA {
public static void main(String[] args) {
/*
需要理解匿名内部类的格式而不是硬背:
new 类名或接口名(){
重写方法;
};
*/
new Swim(){
public void swim(){
System.out.println("重写了游泳的方法");
}
};
}
}
关于匿名内部类书写格式的理解
以接口或抽象类的实现子类推导其匿名内部类的写法
对于匿名内部类的书写格式的理解可以 用javap反编译来加以验证
对于抽象类的匿名内部类也类似理解
匿名内部类的使用
package com.an.a;
//对匿名内部使用的测试
//抽象类
abstract class Animal{
public abstract void eat();
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("小狗爱吃骨头");
}
}
public class TestA {
public static void main(String[] args) {
/*
需要理解匿名内部类的格式而不是硬背:
new 类名或接口名(){
重写方法;
};
*/
/*要在测试类中调用method方法
该方法的参数为抽象类,则必须传递其实现子类的对象(接口也是同样的道理)
但是如果我们的Dog类只要用一次,那么单独定义一个类那就太麻烦了
*/
//方式一:直接传递其实现类的对象
//Dog dog =new Dog();
//method(dog);//小狗爱吃骨头
//方式二:传递Animal的匿名内部子类的对象
method(new Animal() {
@Override
public void eat() {
System.out.println("小狗也爱吃肉");//小狗也爱吃肉
}
});
//方法调用过程:传递其实现子类的对象,经过向上转型,父类调用eat调用重写后的eat
}
public static void method(Animal a){//Animal a=子类对象 多态
a.eat();
}
}
对于匿名内部类的拓展小点
package com.an.a;
//对匿名内部使用的测试
interface Swim{
public abstract void swim();
}
public class TestA {
public static void main(String[] args) {
/*
需要理解匿名内部类的格式而不是硬背:
new 类名或接口名(){
重写方法;
};
*/
//理解点1:
//写了一个实现了Swim的匿名内部子类
//Swim s= new Swim(){ //此时相当于向上转型
//@Override
//public void swim() {
// System.out.println("实现了游泳方法");
// }
// };
// s.swim();//父类调用被子类重写的方法
//理解点2:
new Swim() {
@Override
public void swim() {
System.out.println("实现了游泳方法");
}
}.swim();//此时为一个匿名对象,可以调用自己的方法
}
}