在java中使用new关键字而不定义变量

yb3bgrhw  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(479)

以下代码用于在变量中创建类的对象:

ClassName obj = new ClassName();

但是如果我们不创建任何变量,只键入以下内容呢?

new ClassName();

当我使用它时,没有错误。但是当没有变量被创建时它实际上做了什么呢?

wbrvyc0a

wbrvyc0a1#

new ClassName() 调用一个名为构造函数的特殊方法,与任何方法一样,它返回一个value1。它返回的值是 ClassName . 您可以选择将该值赋给变量,也可以不赋,就像您可以对任何方法的返回值所做的那样。因此,您只需决定是否需要将返回值赋给变量。如果你这样做了,那么你需要第一个陈述,即:

ClassName obj = new ClassName();

如果不需要将返回值赋给变量,则可以使用:

new ClassName();

1-方法可以返回void,这意味着它实际上不返回值

ohtdti5x

ohtdti5x2#

两个方法都创建一个对象,但第二个方法没有名称。
创建类名的示例时,第一个方法和第二个方法的区别在于,对于第一个方法,实际上可以访问类中的变量和方法。
例如,

ClassName obj = new ClassName();
System.out.println(obj.x);

其中classname

class ClassName {
    public static int x = 2;
}

这种方法的好处是可以访问类中的变量。如果使用第二种方法,则示例将没有名称,因此无法访问变量。

yws3nbqq

yws3nbqq3#

为了回答您的问题,我认为了解jvm在执行期间如何管理对象很有用。
所有java对象都驻留在一个名为heap的jvm区域中,并且可以由一个或多个变量指向(注意这不是必需的)。保存对对象引用的变量驻留在jvm的另一个区域stack上。
每次像这样的指令 new SomeClass(); 在该区域上分配新对象。当堆区域已满时,将收集垃圾,并在垃圾收集期间清除不再由变量指向的对象,以便为新对象释放堆上的空间。
你的两个指示有什么不同?

1- ClassName obj = new ClassName(); 它在堆上分配一个由堆栈上的obj变量指向的新对象。
2- new ClassName(); 它只是在堆上分配一个新对象,而堆栈上没有指向它的变量。
什么时候使用第二种方法有用?
根据这一点,如果您只想在堆上分配一个新对象,而不想通过变量使用它(例如,测试程序的内存管理),那么使用第二种方法可能很有用。实际上,第二种方法用于创建“一次性”对象,并在同一条指令中使用该对象的方法或变量,以提高垃圾收集器的效率,并避免意外地出现outofmemoryerror异常,如:
使用一次对象变量:

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());
}

您可能会问:对于至少由一个变量指向的对象(如使用第一种方法创建的对象),会发生什么情况?
当变量超出作用域时,保存在变量中的所有引用都会被自然删除,这样它们就有资格自动进行垃圾收集(根据它们的作用域在代码中的管理方式)。

相关问题