Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是在创建对象还是变量?_Java - Fatal编程技术网

Java 我是在创建对象还是变量?

Java 我是在创建对象还是变量?,java,Java,我正在读一本关于Java编程的书,作者使用了如下示例: import java.text.NumberFormat; public class NumberFormatTest { public static void main (String[] args){ NumberFormat currency = NumberFormat.getCurrencyInstance(); } } 我对这句话感到困惑: NumberFormat currency =

我正在读一本关于Java编程的书,作者使用了如下示例:

import java.text.NumberFormat; 
public class NumberFormatTest {
    public static void main (String[] args){
        NumberFormat currency = NumberFormat.getCurrencyInstance(); 

    }
}
我对这句话感到困惑:

NumberFormat currency = NumberFormat.getCurrencyInstance();
这是创建NumberFormat类的对象,还是创建变量?我意识到“新”语句没有用,所以我不认为它是一个对象。我很困惑。有人能解释一下这行代码中发生了什么吗


Kevin

是的,您正在创建NumberFormat类的对象(或者可能是该类的子类的对象)。您正在调用的方法-
NumberFormat.getCurrencyInstance()
-包含创建实例的
new
语句。它是一个工厂方法,用于创建类的实例并将对该实例的引用返回给调用方


然后,您的
currency
变量保存对
NumberFormat
对象的引用。

您正在创建一个变量,可能还有一个对象

这一行:

NumberFormat currency ...
创建一个局部变量。最好说您声明了一个局部变量,但将其视为创建变量并没有错。下一部分:

... NumberFormat.getCurrencyInstance()

可能会创建一个对象,但它也可能会返回在程序中其他位置创建的对象(例如,如果
getCurrencyInstance()
已在其他位置调用,它可能只会重用已创建的对象)。

您正在创建
变量和对象

NumberFormat currency = NumberFormat.getCurrencyInstance();
NumberFormat currency
,创建NumberFormat类型的
变量


NumberFormat.getCurrencyInstance()
,创建NumberFormat类型的
实例/对象
,并返回相同的值。

您有一个名为“currency”的变量,该变量被分配给NumberFormat类型的对象。java中唯一的非对象类型是基元类型—
int、long、float、boolean
等等,但是每个基元类型都有等价的对象

我认为混淆是因为NumberFormat使用静态方法来创建其对象,因此它在幕后为您执行
new


您的书可能会像这里所描述的那样深入了解对象与类:

明白了。。。因此
getCurrencyInstance()
方法包含的代码包含一个
new
语句,该语句创建实例,对吗?正确。像这样的方法通常会缓存它们创建的对象,因此它可能会首先检查静态字段是否为null,然后调用
new
,如果字段为null,则返回值(field或new)。从技术上讲,@markspace的答案更正确。您不知道
getCurrentyInstance()
正在创建任何内容。它可能返回对以前创建的实例的引用。在本例中,由于
NumberFormat
是可变的,因此它可能是一个新实例。在一般情况下,如果不检查实现,您就不知道。