我了解创建对象和创建变量之间的区别。例如:
private int number;
MyClass myObj = new MyClass();
但我的观点是这两者之间有什么区别?
private MusicPlayer player;
player = new MusicPlayer();
MusicPlayer
是一个类,但我们到底在做什么呢?
private MusicPlayer player;
在这里,您创建一个MusicPlayer
类的引用变量(但它不创建对象)而不初始化它。所以你不能使用这个变量,因为它只是不指向任何地方(它是空的)。
例如,使用一个Point
类:
Point originOne;
可以这样表示:
player = new MusicPlayer();
在这里,您分配一个类型为 的对象MusicPlayer
,并将其存储在player
引用中,以便您可以使用其上的所有功能。
例如,使用Point
带有x
和y
坐标的类:
Point originOne = new Point(23, 94);
可以这样表示:
这两行的组合相当于:
private MusicPlayer player = new MusicPlayer();
private MusicPlayer player;
这是一个声明,意思是新建一个MusicPlayer的引用变量,只是一个引用,不会创建实例。您不能使用它,因为它指向 null。
player = new MusicPlayer();
MusicPlayer()
调用 MusicPlayer 构造函数, new
创建 MusicPlayer 的实例,=
将此实例分配给引用player
。
类是一种类型。Java 是一种强类型语言,所以大多数时候它需要知道它正在处理的事物的类型。
引用变量只是保存对对象的引用。因为Java是强类型的,它总是想知道一个变量所持有的引用的类型(即,由于一个类是一个类型,它想知道一个变量的引用指向的对象的类)。
whatEver object1 = new whatEver();
接下来是...
private MusicPlayer player;
player = new MusicPlayer();
以上实现了类似的结果,但需要多个步骤。第一行仅确定变量 player 将持有对 MusicPlayer 类型对象的引用。Java总是想在使用之前知道事物的类型。
第二行创建一个 MusicPlayer 类型的 new() 对象并将其引用分配给变量 player。再次,赋值是有效的,因为对象的类型和引用变量的类型是一致的。
private MusicPlayer player;
这会在内存中分配一个 4 字节空间(或者在 64 位机器上可能更多),最终可以指向堆中的一个对象。那个对象没有被创建,所以它不存在,所以player
变量指向这个null
值……但这需要 4 个字节。这本质上就像为您计划拥有但您还没有的狗保留名称“Stinky”。
player = new MusicPlayer();
这个东西在堆中创建了一个类型对象存在所需的空间MusicPlayer
。该空间等于不知道多少字节的标头,以指示该对象的类和存储其声明的实例变量所需的额外内存(意味着4
声明为实例变量的每个对象引用的额外 - 或更多 - 字节(如果为空),和主要数据类型的附加字节。这基本上就像确保你有一只叫做“臭”的狗。
这个问题的答案在https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html中。
我将使用一个虚构的Fish类的示例。使用以下方法时,
Fish tuna;
该语句通知编译器您将使用 name 来引用其内容类型为type的数据。对于原始变量,此声明还为变量保留了适当的内存量。如果你像这样声明一个变量,它的值将是不确定的,直到一个对象被实际创建并分配给它。
当您编写以下语句时,
Fish tuna = new Fish();
new 运算符通过为新对象分配内存并返回对该内存的引用来实例化一个类。new 运算符还调用对象构造函数。
new 运算符返回对其创建的对象的引用。此引用通常分配给适当类型的变量。
因此,当你说,
Fish tuna = new Fish();
您正在创建一个 Fish 类型的变量,该变量可以包含 Fish 类型的对象,并使用 new 运算符创建该类型的对象并返回对它的引用。