zoukankan      html  css  js  c++  java
  • 【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);
             
        }
          
    }
    
    不破不立,怕啥怼啥!
  • 相关阅读:
    State Management
    排序效率小PK
    ES,ZK,Mysql相关参数优化
    ES翻译之Function Score Query
    打算坚持学习技术的习惯
    面试——并发基础知识1
    码云的GIT操作
    CountDownLatch模拟高并发测试代码
    Bloom Filter的应用
    面试题1—选取同一个字符第一不重复的字符
  • 原文地址:https://www.cnblogs.com/yslu/p/13277421.html
Copyright © 2011-2022 走看看