匿名对象和匿名类

Posted qq1312583369

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了匿名对象和匿名类相关的知识,希望对你有一定的参考价值。

一、匿名对象

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

 匿名对象的特征:

    •            创建的匿名类的对象只能够调用一次
    •            匿名对象只在堆内存中开辟空间,而不存在栈内存的引用
    •            每次创建匿名对象都是不同的对象 
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.匿名类:比如我们需要一个监听类,并且在实例化这个监听类的时候才需要实现这个监听类内部的方法,那么使用匿名类就最方便了

以上是关于匿名对象和匿名类的主要内容,如果未能解决你的问题,请参考以下文章

2020/7/8 匿名对象 内部类 包 修饰符 代码块

Java学习(匿名对象内部类包import代码块)

如何启动匿名线程类

匿名对象和匿名类

匿名内部类创建线程,简化线程创建代码

java 类的匿名类和封装