匿名内部类

胡泽宇 2020年02月06日 90次浏览

匿名内部类

非常有用!
匿名内部类,没有名字的类,因此在定义类时要立即创建实例,以后不能复用该类。

语法

    new 父类构造器(参数) | 接口(){
        //类体部分:完全可以定义类的5大成员(但构造器不行,关键不知道构造器的名字)
        //但通常来说,类体部分只是去实现抽象方法
    };

从上面语法可以看出:

  • 匿名内部类必须要显式继承父类或实现一个接口,不能同时实现多个接口。
  • 匿名内部类不能是抽象类,因此必须实现抽象父类或接口所有抽象方法。

实例

  • 抽象类内部类:
    • 首先创建一个抽象方法:
    abstract class Animal{
        private double weight;
        public Animal(double weight){
            this.weight = weight;
        }
        public void move(){
            System.out.println("动物都可以移动");
        }
        public abstract void taste();
    }
    
    • 来创建匿名内部类:Animal an = new 父类构造器(参数) | 接口(){ // 类体部分};
    public class AnonymityClass {
        Animal an = new Animal(55.25) {
            //匿名类的类体,一般就是实现抽象方法
            @Override
            public void taste() {
                System.out.println("羊肉很香,非常好吃。");
            }
        };
        an.move(); //调用普通方法
        an.taste();//调用重写的taste()方法
    }
    
  • 实现接口的匿名内部类:
    • 首先定义一个接口:
    interface Printable{
    //下面两个方法前有: public abstract
    void print();
    void inputData();
    	}
    
    • 来创建实现接口的匿名内部类:
    public class AnonymityClass {
    public static void main(String[] args) {
        Printable p = new Printable() {
            //类体部分,通常只要实现抽象方法即可。
            @Override
            public void print() {
                System.out.println("打印数据");
            }
    
            @Override
            public void inputData() {
                System.out.println("输入数据");
            }
        };
        p.print();
        p.inputData();
    	}
    	}
    

问题:能不能在匿名内部类里面创建自己的方法呢?[典型的多态问题]

:可以但没必要,因为多态的特性,Animal是编译类型,匿名内部类是它的子类,如果要创建自己的方法就要调用这个方法。但是父类中没有这个方法就会报错,如果要调用只能强转类型,但是你都不知道它的名字怎么转呢🤭。

  • 测试代码:
public class AnonymityClass {
    //向上转型:用Animal子类的实例进行赋值
    Animal an = new Animal(55.25) {
        //匿名类的类体,一般就是实现抽象方法
        @Override
        public void taste() {
            System.out.println("羊肉很香,非常好吃。");
        }
        //自己定义一个方法
        public void selfish(){
            System.out.println("匿名内部类里添加的selfish()方法");
        }
    };
    //an的编译时类型时Animal,对于编译阶段而言,编译器认为an(Animal类型)没有selfish()方法
    an.selfish();//报错,找不到方法selfish()
}