P416 匿名内部类

基于接口的匿名内部类 

package com.InnerClass;

public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer01 outer01 = new Outer01();
        outer01.method();
    }
}
interface IA{
    public void cry();
}
class Outer01{
    public void method(){
        //传统方法是写一个类,实现接口IA,再创建该类的对象
        //匿名内部类是创建类的同时创建一个实例对象,类只能使用一次,
        //但创建的实例对象可以一直使用。
        //tiger的编译类型 左边的IA
        //tiger的运行类型 就是匿名内部类,类名Outer01$1(系统命名)
        IA tiger = new IA() {//基于接口的匿名内部类
            @Override
            public void cry() {
                System.out.println("老虎在叫...");
            }
        };
        //打印匿名内部类类名
        System.out.println("tiger的运行类型="+tiger.getClass());
        tiger.cry();
    }
}

基于类的匿名内部类 

package com.InnerClass;

public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer01 outer01 = new Outer01();
        outer01.method();
    }
}
interface IA{
    public void cry();
}
class Outer01{
    public void method(){
        //传统方法是写一个类,实现接口IA,再创建该类的对象
        //匿名内部类是创建类的同时创建一个实例对象,类只能使用一次,
        //但创建的实例对象可以一直使用。
        //tiger的编译类型 左边的IA
        //tiger的运行类型 就是匿名内部类,类名Outer01$1(系统命名)
        IA tiger = new IA() {//基于接口的匿名内部类
            @Override
            public void cry() {
                System.out.println("老虎在叫...");
            }
        };
        //打印匿名内部类类名
        System.out.println("tiger的运行类型="+tiger.getClass());
        tiger.cry();
        //...........
        //如果是new Father("jack");这是创建一个Father类的对象
        //father编译类型 Father
        //father运行类型 匿名内部类,类名Outer01$2
        Father father = new Father("jack"){//基于类的匿名内部类,有参数列表
            @Override
            void test() {
                System.out.println("匿名内部类重写了test方法");
            }
        };
        father.test();
    }
}
class Father{
    public Father(String name){//构造器

    }
    void test(){

    }
}

匿名内部类使用细节 

细节1)

//比如上面的接口示例

IA tiger = new IA() {//基于接口的匿名内部类

        @Override

        public void cry() {

                System.out.println("老虎在叫...");

        }

};

tiger.cry(); //动态绑定

//也可以写成

new IA() {//基于接口的匿名内部类

        @Override

        public void cry() {

                System.out.println("老虎在叫...");

        }

}.cry(); //动态绑定

细节2)

package com.InnerClass;

public class InnerClassExercise {
    public static void main(String[] args) {
        CellPhone cellPhone = new CellPhone();
        cellPhone.alarmClock(new Bell() {//以匿名内部类作为运行类型创建的对象,
            @Override                      // 编译类型为Bell
            public void ring() {
                System.out.println("懒猪起床了");
            }
        });
        cellPhone.alarmClock(new Bell() {
            @Override
            public void ring() {
                System.out.println("小伙伴起床了");
            }
        });
    }
}
interface Bell{
    void ring();
}
class CellPhone{//CellPhone类中含有方法alarmClock
    public void alarmClock(Bell bell){//方法alarmClock的参数为接口类型
        bell.ring();//方法动态绑定机制,自动绑定到上面重写了的ring方法
    }
}

细节3)

//使用静态方法

package com.InnerClass;

public class InnerClassExercise {
    public static void main(String[] args) {
        alarmClock(new Bell() {
            @Override
            public void ring() {
                System.out.println("闹铃响了");
            }
        });
    }
    //静态方法
    public static void alarmClock(Bell bell){
        bell.ring(); //方法动态绑定机制,自动绑定到上面重写了的ring方法
    }
}
interface Bell{
    void ring();
}
  • 43
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值