• 【3】匿名内部类


    1.什么是匿名类

    匿名类,就是没有名称的类,其名称由Java编译器给出,一般是形如:

    ​ 外部类名称+$+匿名类顺序,没有名称也就是其他地方就不能引用,不能实例化,只用一次,当然也就不能有构造器。

    • 匿名类就是利用父类的构造函数和自身类体构造成一个类
    • 格式:new 父类{}{子类内容};
    2.为什么要使用匿名类

    匿名类指的是在声明一个类的同时实例化它,使代码更加简洁精练

    3.匿名类怎么使用
    package charactor;
      
    public abstract class Hero {
        String name; //姓名
             
        float hp; //血量
             
        float armor; //护甲
             
        int moveSpeed; //移动速度
         
        public abstract void attack();
         
        public static void main(String[] args) {
             
            ADHero adh=new ADHero();
            //通过打印adh,可以看到adh这个对象属于ADHero类
            adh.attack();
            System.out.println(adh);
             
            Hero h = new Hero(){
                //当场实现attack方法
                public void attack() {
                    System.out.println("新的进攻手段");
                }
            };
            h.attack();
            //通过打印h,可以看到h这个对象属于Hero$1这么一个系统自动分配的类名
             
            System.out.println(h);
        }
         
    }
    
    
    4.注意事项

    在匿名类中使用外部的局部变量,外部的局部变量必须修饰为final

    package charactor;
       
    public abstract class Hero {
     
        public abstract void attack();
          
        public static void main(String[] args) {
     
            //在匿名类中使用外部的局部变量damage 必须修饰为final
            int damage = 5;
             
            //这里使用本地类AnonymousHero来模拟匿名类的隐藏属性机制
             
            //事实上的匿名类,会在匿名类里声明一个damage属性,并且使用构造方法初始化该属性的值
            //在attack中使用的damage,真正使用的是这个内部damage,而非外部damage
             
            //假设外部属性不需要声明为final
            //那么在attack中修改damage的值,就会被暗示为修改了外部变量damage的值
             
            //但是他们俩是不同的变量,是不可能修改外部变量damage的
            //所以为了避免产生误导,外部的damage必须声明为final,"看上去"就不能修改了
            class AnonymousHero extends Hero{
                int damage;
                public AnonymousHero(int damage){
                    this.damage = damage;
                }
                public void attack() {
                    damage = 10;
                    System.out.printf("新的进攻手段,造成%d点伤害",this.damage );
                }
            }
             
            Hero h = new AnonymousHero(damage);
             
        }
          
    }
    
    不破不立,怕啥怼啥!
  • 相关阅读:
    .net framework 3.5 dotNetFx35setup 能不需要网络支持吗? 
    Android API Differences Report
    Android用户版本分布更新 2.1版领先
    Adobe升级Flash回击批评:流畅播放手机视频
    iPhone OS4.0,Android 2.1和WP7对比分析
    Android 2.2数据共享功能开启与否将由运营商自主决定
    谷歌 Android 3.0计划四季度推出:代号姜饼
    谷歌称Android设备日激活量已达10万台
    iPod Touch也将支持运行Android系统
    Android2.2 SDK正式提供下载
  • 原文地址:https://www.cnblogs.com/yslu/p/13277421.html
Copyright © 2020-2023  润新知