我们在研究一个问题的时候通常分为四步,
是什么? -- 这个东西是什么
为什么? -- 为什么会有这个东西
怎么用? -- 这个东西怎么使用
总结
匿名对象是什么?通俗来讲,匿名对象就是没有名字的对象,只通过new开辟一块堆内存存储对象,而没有指向栈中的引用类型变量。
public class Test4_Nameless {
public static void main(String[] args) {
new Person(); //这是一个匿名对象
}
class Person{
String name;
int age;
}
在此之前,我们要搞清楚创建对象时,栈和堆内存中到底做了什么事:
1.Student s = new Student();
2.在栈内存中开辟空间存放引用类型的局部变量s(栈中数据的使用 -- 符合“先进后出”原则)
3.在堆内存中开辟空间存放对象,对象是类的实例,包含类的属性和功能
4.完成对象的初始化,将需要实例化的数据赋予默认值
5.给堆内存中对象分配唯一的地址值
6.把唯一的地址值交给栈中的引用类型变量s保存
7.此后调用对象的资源时只需要在栈中找到引用类型变量s,根据其保存的地址值在堆中找到对象调用
二、为什么会有匿名对象的存在?
匿名对象的好处就是只可以使用一次,使用完就被垃圾收集器回收,不像对象可以重复的使用,通常我们只调用一次类里的属性或方法时使用
public class Test4_Nameless {
public static void main(String[] args) {
new Person(); //这是一个匿名对象
System.out.printIn(new Person.name); //打印类的属性name
}
class Person{
String name;
int age;
}
怎么体现只使用一次,使用完就会被回收?
public class Test4_Nameless {
public static void main(String[] args) {
//创建对象
Person2 p = new Person2();
System.out.println(p.age + "\t" + p.name); //0 null
//创建匿名对象
System.out.println(new Person2().age + "\t" + new Person2().name); //0 null
//返回值相同,因此匿名对象其实就是对象,对象具有的功能匿名对象也具有
//创建多个匿名对象
System.out.println(new Person2()); //第一次创建,使用后被回收
//cn.tedu.review.Person2@1b6d3586
System.out.println(new Person2());
//cn.tedu.review.Person2@4554617c //重新创建,使用后同样被回收
//可以看出,打印两个匿名对象,地址值是不同的
}
}
class Person2{
String name;
int age;
}
总结:1.匿名对象就是没有名字的对象,和对象是一个东西
2.匿名对象只使用一次,使用完就会被回收,不像对象可以多次重复的使用