• 匿名对象和匿名类


    一、匿名对象

           匿名对象是没有名字的实体,也就是该实体没有对应的变量名引用

     匿名对象的特征:

      •            创建的匿名类的对象只能够调用一次
      •            匿名对象只在堆内存中开辟空间,而不存在栈内存的引用
      •            每次创建匿名对象都是不同的对象 
    package com.yyx.pratice;
    
    public class AnonymousObject {
        public static void main(String[] args) {
            printStuInfo(new Student("张三", 2567));//传递匿名对象
        }
    
        public static void printStuInfo(Student student) {
            System.out.println(student.getStuName() + " " + student.getStuId());
        }
    }
    
    class Student {
        private String stuName;
        private Integer stuId;
    
        public Student(String stuName, Integer stuId) {
            super();
            this.stuName = stuName;
            this.stuId = stuId;
        }
    
        public String getStuName() {
            return stuName;
        }
    
        public void setStuName(String stuName) {
            this.stuName = stuName;
        }
    
        public Integer getStuId() {
            return stuId;
        }
    
        public void setStuId(Integer stuId) {
            this.stuId = stuId;
        }
    
    }

    二、匿名类

          匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。匿名类相当于在定义类的同时再新建这个类的实例

    定义匿名内部类的格式如下:

    new 父类构造器(参数列表)|实现接口() 
    { 
         //匿名内部类的类体部分 
    }

           这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。

    要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,

    这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。

          注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
    从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。
         如果要执行的任务需要一个对象,但却不值得创建全新的对象(原因可能是所需的类过于简单,或者是由于它只在一个方法内部使用),匿名类就显得非常有用

    匿名类特点:

    • 它必须继承一个类或者实现一个接口,而不能显示的使用extends或者implements,没有父类。
    • 匿名类没有构造方法。通过new<父类名> 创建对象,匿名类定义与创建对象是同时进行的。
    • 匿名类只能一次性的创建,并有父类句柄持有。
    • 匿名类不需要初始化,只有默认的构造方法

    匿名内部类还有如下两条规则:

    • 匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类定义成抽象类。
    • 匿名内部类不能定义构造器,因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,通过实例初始化块来完成构造器需要完成的事情。

    匿名类里面不可以有的东西:

    • 不能定义静态初始化代码块(Static Initializer)。事实上,内部类中不能定义任何静态的东西
    • 不能在匿名类里面定义接口。
    • 不能在匿名类中定义构造函数,因为匿名类没有名字,而构造函数需要把类名作为方法名才能看成构造函数

    匿名类中可以包含的东西有:

        •      字段
        •      方法
        •      实例初始化代码
        •      本地类  

    package com.yyx.pratice;
    
    public class AnonymousObject {
        public static void main(String[] args) {
            AllBehaviors allBehaviors = new AllBehaviors() {
    
                @Override
                public void walk() {
                    System.out.println("我在走路!");
    
                }
    
                @Override
                public void play() {
                    System.out.println("我在玩!");
    
                }
            };
            allBehaviors.play();
            allBehaviors.walk();
        }
    }
    
    interface AllBehaviors {
        void play();
    
        void walk();
    }

    三、匿名对象和匿名类区别

           1.匿名对象还是一个对象,它必须有已经写好的成员变量、属性、方法

           2.匿名类,在声明它的对象的时候,才对它进行代码的构造(封装它的成员变量、属性、方法等)

           3.匿名对象:一个对象只需要使用一次的时候,通常使用匿名对象

           4.匿名类:比如我们需要一个监听类,并且在实例化这个监听类的时候才需要实现这个监听类内部的方法,那么使用匿名类就最方便了

  • 相关阅读:
    iOS--GCD
    XMPP 常见错误:<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>
    The file “Info.plist” couldn’t be opened because there is no such file
    iOS--多线程
    进程与线程的一个简单解释
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    随机事件 概率 赌博 泊松分布
    “并发用户数”、“系统用户数”和“同时在线用户数”的计算公式
    查询Oracle正在执行和执行过的SQL语句
    数据仓库(七):Oracle Warehouse Builder(OWB)创建数据仓库
  • 原文地址:https://www.cnblogs.com/qq1312583369/p/10966603.html
Copyright © 2020-2023  润新知