面向对象(匿名内部类与有名字内部类的比较)

A:匿名内部类

    就是内部类的简化写法

B:前提

    这里的类可以是具体类也可以是抽象类

C:格式

    new 类名或者接口(){       //表示继承这个类或实现这个接口
        重写方法
    }

D:本质是什么呢?

    是一个继承了该类或者实现了该接口的子类匿名对象

E:案例实现

按要求来写一个匿名内部类与一个有名字的内部类进行对比
    要求:创建一个Inter接口,接口里面有个抽象方法print,print这个抽象方法有个输出语句,输出  print ,然后分别用 **有名字的内部类**   跟  **匿名内部类**  这两种方式去实现。

一,有名字的内部类(Outer)

package Demo_nimingneibulei;

public class hasming {

    public static void main(String[] args) {
        Outer o =new Outer();               //创建对象
        o.method();                         //调用method()方法
    }

}

interface Inter{                            //定义接口
    public void print();                    //接口里面有一个print抽象方法
}

class Outer{                                //有名字的内部类去实现了Inter这个接口,然后重写Inter接口里面抽象方法print
    class Inner implements Inter{           //创建Inner这个类去实现Inter接口,Inner就是Inter的子类
        public void print(){                //重写Inter接口里面的方法
            System.out.println("print");
        }
    }
    public void method(){
①       Inner i = new Inner();
        i.print();

②       new Inner().print();                //new Inner() 代表着Inter的子类对象,然后   .print() 再调用Inner里面重写之后的print()方法
//①②两种方法是一样的想过,②是①的另外一种形式
//      new Inter();                        //创建Inter对象,是错误的,因为Inter是抽象的,无法去实例化
    }
}

二,匿名内部类(Outer1)

package Demo_nimingneibulei;

import Demo_nimingneibulei.Outer.Inner;

public class Noname {

    public static void main(String[] args) {
        Outer1 o = new Outer1();                    //创建Outer1该类的对象o
        o.method();                                 //调用Outer1里面的method方法
    }
}

interface Inter1 {
    public void print();
}

class Outer1{                                       //创建匿名内部类
    public void method(){                           //匿名内部类是局部内部类的一种,所以必须写在方法里面

//      new Inter();                                //直接创建Inter对象,不能这样写,因为Inter1是个接口是抽象的,无法实例化

        new Inter1(){                               //实现Inter接口,实现接口,必须重写Inter1接口里面的抽象方法print()
            public void print(){                    //重写Inter接口里面的print抽象方法
                System.out.println("print");
            }
        }.print();                                  //.之前的内容,代表在Inter1这个接口的子类对象,然后,我们就可以调用Inter1这个接口的子类对象里面的方法了,直接.print(),去调用该方法
    }
//匿名内部类与有名字的内部类相比,不用再写一个类名去实现接口或者去继承类了
}

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/81257710