Java匿名内部类

Pragma mark — NO.1 匿名内部类
public class Main {

    public static void main(String[] args) {

      Outer o = new Outer();
      o.print();
      o.method1();

    }
}
/*
* 匿名内部类
* 就是内部类的简化写法
* 前提:存在一个类或者接口
* 这里的类可以是具体类也可以是抽象类
* 格式:
* new 类名或者接口名() {
*   重写方法;
* };
*本质是:
* 是一个继承了该类或者是实现了该接口的子类匿名对象
* */

//创建一个接口
interface  Inter {
    public  void method();
}

//先用有名字的内部类实现外部接口
class  Outer {
    //内部类实现外部接口
    class Inner implements Inter {
        public void method(){
            System.out.println("这是一个内部类实现接口");
        }
    }

    //再整个方法
    public void print(){
        Inner i = new Inner();
        i.method();
    }

    //匿名内部其实是局部内部类,必须放在方法中
    public void method1 (){

        //注意匿名内部类的书写格式
        //new 后面如果是类名就是继承自父类的名字
        //如果是接口名,就是这个类要实现的接口
        //整个这个代表子类对象,那么可以调用这个重写后的method方法。要好好理解下
        new Inter () {//实现Inter接口
            public void method(){
                System.out.println("我是一个匿名内部类");
            }
        }.method();//这后面这个分号不能丢了
    }
}
Pragma mark — NO.2 匿名内部类调用多个重写方法
public class Nimingneibulei1 {
    public static void main (String[] args){
        Test1 t = new Test1();
        t.method();
    }

}
//匿名内部类中重写多个方法调用

interface Inter1 {

    public void show1();
    public void show2();
}

class Test1 {
//通过如下例子我们就建议匿名内部类就用在只调用一个方法的情况
    public void method(){
        //匿名内部类
//        new Inter1() {
//
//            public void show1(){
//
//                System.out.println("这是show1方法");
//            }
//            public void show2(){
//                System.out.println("这是show2方法");
//            }
//
//        }.show1();
//
//        new Inter1() {
//
//            public void show1(){
//
//                System.out.println("这是show1方法");
//            }
//            public void show2(){
//                System.out.println("这是show2方法");
//            }
//
//        }.show2();

        //换个简单点的写法
       Inter1 i =  new Inter1() {

            public void show1(){

                System.out.println("这是show1方法");
            }
            public void show2(){
                System.out.println("这是show2方法");
            }
       };
       i.show1();
       i.show2();
    }
}
Pragma mark — NO.3 匿名内部类的应用
public class Nimingneibulei2 {
    public static void main (String[] args){
        //我们要求是调用PersonDemo中的method方法
        PersonDemo pd = new PersonDemo();
        //这里要求我们传一个抽象类对象,但是抽象类对象不能够初始化。
        //所以要我们传一个匿名内部类进去,这里不能直接传抽象类对象,我们可以
        //传两种,要么传有名的子类对象,要么传匿名内部对象
//        Person p = new Student();
//        pd.method(p);

        //我们用匿名内部类来做一下--匿名内部类当做参数传递,把匿名内部类当做一个对象
        pd.method(new Person(){
              //重写show()方法
            public void show(){
                System.out.println("匿名内部类实现");
            }
        });

    }
}

//写个抽象类
abstract  class  Person{
    public  abstract void show();
}

//普通类
class PersonDemo {
    public  void method(Person p){
        p.show();
    }
}
//再创建个子类对象去继承抽象类
class Student extends Person {
    public void show(){
        System.out.println("我是一个有名的子类");
    }
}

你可能感兴趣的:(Java匿名内部类)