面向对象(4):匿名对象
1、匿名对象:简单来说,就是没有名字的对象
用内存的形式解释:
之前,一直都是在堆内存中new对象,然后将地址值赋给栈里面的变量,这个变量也就是对象的名字;
而匿名对象,就说明没有栈中的变量引用。
2、匿名对象的使用场景
(1)当调用方法的时候,只能调用一次;调用多次的时候,不能使用匿名对象
匿名存在的意义:
某些情况下,我们就想使用一次某个对象中的功能,后续也不会使用它了,这时候,就可以使用
匿名对象,使用完之后,就被JVM认为是一个垃圾空间(栈里面没有引用指向它),等待被回收
(2)匿名对象可以在调用方法的时候被当作参数进行传递(前提是引用数据类型作为方法中参数的时候)
匿名对象使用场景(1):当调用方法的时候,只能调用一次
//Anonymous:匿名
//创建一个电脑类敲代码的方法
//先创建一个电脑类
class Computer {
//再创建敲代码的方法
public void coding(){
System.out.println("敲代码");
}
}
=========================================================
//创建一个测试类
public class Anonymous {
public static void main(String[] args) {
//创建电脑对象,用来调用其中的方法
Computer cc = new Computer();
//调用敲代码方法
cc.coding();
//创建电脑匿名对象
//new出来的是对象,匿名就是不给它名字,即new Computer();
//没有名字,所以不能以名字来调用方法了,那就直接调用
new Computer().coding();
//使用第一个对象再调一次方法
cc.coding();
//使用匿名对象不可再调一次方法
//再调一次,相当于又创建了一个匿名对象
//new Computer().coding();
}
}
执行结果为:
敲代码
敲代码
敲代码
Process finished with exit code 0
匿名对象使用场景(2):匿名对象可以在调用方法的时候被当作参数进行传递
1、在面向对象(3)中提到过参数问题,当引用数据类型作为方法中参数的时候,调用该方法的时候,要在该方法前面创建一个引用数
据类型对应的对象;当使用匿名对象的时候,就不需要创建引用数据类型对应的对象了,匿名对象可以当作参数进行传递
//创建一个电脑类敲代码的方法
//先创建一个电脑类
class Computer01 {
//再创建敲代码的方法
public void coding(){
System.out.println("敲代码");
}
}
//创建第二个类
class Demo01{
public void fun(Computer01 c){
c.coding();
}
}
//创建一个测试类
public class Anonymous01 {
public static void main(String[] args) {
//创建Demo01对象,用来调用其中的方法fun
Demo01 cc = new Demo01();
/*
不使用匿名对象的时候:
调用fun方法
因为参数是引用数据类型,所以在调用之前
要创建引用数据类型对应的对象
Computer01 x = new Computer01();
cc.fun(x);
*/
//调用fun方法,匿名对象当作参数进行传递
cc.fun(new Computer01());
}
}
执行结果如下:
敲代码
Process finished with exit code 0