以下代码用于在变量中创建类的对象:
ClassName obj = new ClassName();
但是如果我们不创建任何变量,只键入以下内容呢?
new ClassName();
当我使用它时,没有错误。但是当没有变量被创建时它实际上做了什么呢?
wbrvyc0a1#
new ClassName() 调用一个名为构造函数的特殊方法,与任何方法一样,它返回一个value1。它返回的值是 ClassName . 您可以选择将该值赋给变量,也可以不赋,就像您可以对任何方法的返回值所做的那样。因此,您只需决定是否需要将返回值赋给变量。如果你这样做了,那么你需要第一个陈述,即:
new ClassName()
ClassName
如果不需要将返回值赋给变量,则可以使用:
1-方法可以返回void,这意味着它实际上不返回值
ohtdti5x2#
两个方法都创建一个对象,但第二个方法没有名称。创建类名的示例时,第一个方法和第二个方法的区别在于,对于第一个方法,实际上可以访问类中的变量和方法。例如,
ClassName obj = new ClassName(); System.out.println(obj.x);
其中classname
class ClassName { public static int x = 2; }
这种方法的好处是可以访问类中的变量。如果使用第二种方法,则示例将没有名称,因此无法访问变量。
yws3nbqq3#
为了回答您的问题,我认为了解jvm在执行期间如何管理对象很有用。所有java对象都驻留在一个名为heap的jvm区域中,并且可以由一个或多个变量指向(注意这不是必需的)。保存对对象引用的变量驻留在jvm的另一个区域stack上。每次像这样的指令 new SomeClass(); 在该区域上分配新对象。当堆区域已满时,将收集垃圾,并在垃圾收集期间清除不再由变量指向的对象,以便为新对象释放堆上的空间。你的两个指示有什么不同?1- ClassName obj = new ClassName(); 它在堆上分配一个由堆栈上的obj变量指向的新对象。2- new ClassName(); 它只是在堆上分配一个新对象,而堆栈上没有指向它的变量。什么时候使用第二种方法有用?根据这一点,如果您只想在堆上分配一个新对象,而不想通过变量使用它(例如,测试程序的内存管理),那么使用第二种方法可能很有用。实际上,第二种方法用于创建“一次性”对象,并在同一条指令中使用该对象的方法或变量,以提高垃圾收集器的效率,并避免意外地出现outofmemoryerror异常,如:使用一次对象变量:
new SomeClass();
System.out.println(new ClassName().x)
或执行一次对象方法:
new ClassName().evaluateResult();
注意:在这种特定情况下,您可能可以通过求值在类上生成一个静态方法。另一种用法是在集合中放置新元素,如下所示:
final List<ClassName> objectList = new ArrayList<>(); for(int i=0; i<10; i++){ objectList.add(new ClassName()); }
您可能会问:对于至少由一个变量指向的对象(如使用第一种方法创建的对象),会发生什么情况?当变量超出作用域时,保存在变量中的所有引用都会被自然删除,这样它们就有资格自动进行垃圾收集(根据它们的作用域在代码中的管理方式)。
3条答案
按热度按时间wbrvyc0a1#
new ClassName()
调用一个名为构造函数的特殊方法,与任何方法一样,它返回一个value1。它返回的值是ClassName
. 您可以选择将该值赋给变量,也可以不赋,就像您可以对任何方法的返回值所做的那样。因此,您只需决定是否需要将返回值赋给变量。如果你这样做了,那么你需要第一个陈述,即:如果不需要将返回值赋给变量,则可以使用:
1-方法可以返回void,这意味着它实际上不返回值
ohtdti5x2#
两个方法都创建一个对象,但第二个方法没有名称。
创建类名的示例时,第一个方法和第二个方法的区别在于,对于第一个方法,实际上可以访问类中的变量和方法。
例如,
其中classname
这种方法的好处是可以访问类中的变量。如果使用第二种方法,则示例将没有名称,因此无法访问变量。
yws3nbqq3#
为了回答您的问题,我认为了解jvm在执行期间如何管理对象很有用。
所有java对象都驻留在一个名为heap的jvm区域中,并且可以由一个或多个变量指向(注意这不是必需的)。保存对对象引用的变量驻留在jvm的另一个区域stack上。
每次像这样的指令
new SomeClass();
在该区域上分配新对象。当堆区域已满时,将收集垃圾,并在垃圾收集期间清除不再由变量指向的对象,以便为新对象释放堆上的空间。你的两个指示有什么不同?
1-
ClassName obj = new ClassName();
它在堆上分配一个由堆栈上的obj变量指向的新对象。2-
new ClassName();
它只是在堆上分配一个新对象,而堆栈上没有指向它的变量。什么时候使用第二种方法有用?
根据这一点,如果您只想在堆上分配一个新对象,而不想通过变量使用它(例如,测试程序的内存管理),那么使用第二种方法可能很有用。实际上,第二种方法用于创建“一次性”对象,并在同一条指令中使用该对象的方法或变量,以提高垃圾收集器的效率,并避免意外地出现outofmemoryerror异常,如:
使用一次对象变量:
或
执行一次对象方法:
注意:在这种特定情况下,您可能可以通过求值在类上生成一个静态方法。
另一种用法是在集合中放置新元素,如下所示:
您可能会问:对于至少由一个变量指向的对象(如使用第一种方法创建的对象),会发生什么情况?
当变量超出作用域时,保存在变量中的所有引用都会被自然删除,这样它们就有资格自动进行垃圾收集(根据它们的作用域在代码中的管理方式)。