一、匿名对象
匿名对象是没有名字的实体,也就是该实体没有对应的变量名引用
匿名对象的特征:
- 创建的匿名类的对象只能够调用一次
- 匿名对象只在堆内存中开辟空间,而不存在栈内存的引用
- 每次创建匿名对象都是不同的对象
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.匿名类:比如我们需要一个监听类,并且在实例化这个监听类的时候才需要实现这个监听类内部的方法,那么使用匿名类就最方便了
原文地址:https://www.cnblogs.com/qq1312583369/p/10966603.html