前言
什么是对象?万事万物皆可以是对象,对象是类的实例化 。其中,类是对一类事物的描述,是抽象的、概念上的定义,而对象则是实际存在的该类事物的每个个体。比如,人就是一个类,而我们每一个人就是一个对象。
1、对象在内存中的简化结构
我们知道在内存中,栈用来存放局部变量,堆用来存放new出来的数组或对象,不懂的可以看我的另一篇文章了解一下 : Java中一维、二维数组在内存中的结构
现在我们设计一个Person类,该类含有name、age 和 isMale 三个属性。
class Person{
String name;
int age;
boolean isMale;
}
当我们创建一个对象时,即是在堆中开辟了一个空间,该空间存放一个对象,含有对象的所有属性与方法。
// 创建了一个对象 p1
Person p1 = new Person();
如图所示,我们创建了两个对象,分别将变量名 p1、p2 指向这两个对象,而 需要注意的是 p3,它并没有在堆中新建一个对象,而是将 p1 对象的地址赋给了 p3 而已,所以 p1 和 p3 指向的是同一个对象。
2、显式对象与匿名对象
好了,简单了解一下对象的内存解析,下面来了解一下什么是显式对象和匿名对象。(已定义了CommunApp 类)
public class AnonymousClass {
public static void main(String[] args) {
// 这是显式对象
CommunApp a = new CommunApp();
// 这是匿名对象,直接 new 不赋给某个变量即是匿名对象
new CommunApp();
}
}
可以看到,我们 new 完一个对象将该对象赋给一个变量名,则称该对象为显式对象。而 我们 new 完一个对象之后不赋给任何变量名即是匿名对象 。
需要注意的是,匿名对象只能调用一次属性或方法。为什么这么说呢?先来看看如下代码:
new CommunApp().videoCall();
new CommunApp().writeCommun();
当我们执行上面两条代码调用 CommunApp 类的不同方法时,实际上是创建了两个匿名对象。我们知道,每 new 一个对象即是在内存的堆中开辟一个空间,所以不难理解。也就是说,每匿名一个对象只能调用一次属性或方法。
那么如果想调用多次属性和方法又该怎么办呢?
3、匿名对象的多次调用
**若要使用多次调用,则需要新建一个类,然后声明一个方法,通过该方法将匿名对象作为实参传递给该方法,从而实现匿名对象的多次调用。**如下代码所示:
public class AnonymousClass {
public static void main(String[] args) {
/*
* 若要只匿名一个对象,但要调用多个属性或方法,可以采用以下方法,
* 其实这还是在栈中声明了一个变量,所以才能进行多次调用
*/
Wechat wc = new Wechat();
//将匿名对象作为实参传递给该 wc 对象的方法
wc.show(new CommunApp());
}
}
class Wechat {
public void show(CommunApp ca) {
ca.videoCall();
ca.writeCommun();
}
}
class CommunApp {
public void videoCall() {
System.out.println("可以视频通话!");
}
public void writeCommun() {
System.out.println("可以文字交流!");
}
}
以上帖子供大家学习交流,如有错误,欢迎指正!