创建实例变量和在Java中创建新对象之间的区别?
我理解创建对象和创建变量之间的区别。 例如:
private int number; MyClass myObj = new MyClass();
但我的观点是,这两者之间有什么区别?
private MusicPlayer player; player = new MusicPlayer();
MusicPlayer
是一个类,但我们究竟在这做什么?
private MusicPlayer player;
在这里,您可以在不初始化的情况下创建MusicPlayer
类的引用变量(但不创建对象)。 所以你不能使用这个变量,因为它只是没有指向任何地方(它是null)。
例如,使用Point
类:
Point originOne;
可以这样表示:
player = new MusicPlayer();
在这里,您分配一个MusicPlayer
类型的对象,并将其存储在player
参考中,以便您可以使用它上面的所有function。
例如,使用Point
类,使用x
和y
坐标:
Point originOne = new Point(23, 94);
可以这样表示:
两条线的组合相当于:
private MusicPlayer player = new MusicPlayer();
private MusicPlayer player;
声明一个名为player
的实例变量,但不初始化它。
player = new MusicPlayer();
为已声明的字段分配值 。
private MusicPlayer player;
这是一个声明,这意味着要创建一个MusicPlayer的新引用变量,只是一个引用,并且不会创建任何实例。 你不能使用它,因为它指向null。
player = new MusicPlayer();
MusicPlayer()
调用MusicPlayer构造函数, new
创建一个MusicPlayer实例, =
将此实例分配给参考player
。
类是一种类型。 Java是一种强类型语言,因此大多数时候它需要知道它正在处理的事物的类型。
引用变量只是保存对象的引用。 因为Java是强类型的,所以它总是想知道变量所持有的引用的类型(即,因为类是一个类型,所以它想知道变量引用所指向的对象的类)。
whatEver object1 = new whatEver();
- 声明一个引用变量(object1),它的类型是什么
- 创建一个类型为what的new()对象
- 将新的任何对象的引用分配给引用变量对象1
- 赋值是有效的,因为对象的类型和变量的类型一致
接下来是……
private MusicPlayer player; player = new MusicPlayer();
以上实现了类似的结果,但是在多个步骤中。 第1行仅确定变量播放器将保持对MusicPlayer类型对象的引用。 Java总是希望在使用之前知道事物的类型。
第二行创建一个MusicPlayer类型的new()对象,并将其引用赋予变量player。 赋值再次有效,因为对象的类型和引用变量的类型一致。
private MusicPlayer player;
这为内存分配了一个4字节的空间(或者更多,在64位机器上),可能最终指向堆中的对象。 该对象未创建,因此它不存在,因此player
变量指向null
值….但这需要4个字节。 这基本上就像为你计划拥有的狗保留名称“Stinky”,但你还没有。
player = new MusicPlayer();
这个东西在堆中创建的空间与MusicPlayer
类型的对象所需的空间一样多。 该空间等于dunnow的标头多少字节,以指示该对象的类和存储其声明的实例变量所需的额外内存(意味着为声明为实例变量的每个对象引用另外4
或更多字节(如果为null) ,以及主要数据类型的附加字节。这基本上就像确保你有一只叫做“Stinky”的狗一样。
这个问题的答案在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运算符创建该类型的对象并返回对它的引用。