Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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_String_Object_Instance - Fatal编程技术网

Java 创建不可变对象,实例化时不使用新对象

Java 创建不可变对象,实例化时不使用新对象,java,string,object,instance,Java,String,Object,Instance,我是否可以创建一个只使用=操作符实例化的类,就像字符串那样?或者,Java中的“代码>字符串Stry< /Copy>类是特定的特性?< P>>强>否,不能创建创建一个仅用= /Cuth>运算符实例化的类,因为不能像Java或C++ java < /String >(参见)那样在java中加载运算符。 字符串仅当它们在内存中不存在时,才会在使用“某物”时被实例化,因此每次编写“某物”时,都会获得对相同的字符串对象的引用 例如,如果您这样做: String a=“某物”; 字符串b=“某物”; 然

我是否可以创建一个只使用
=
操作符实例化的类,就像
字符串那样?或者,Java中的“代码>字符串Stry< /Copy>类是特定的特性?

< P>>强>否,不能创建<或强>创建一个仅用= /Cuth>运算符实例化的类,因为<强>不能像Java或C++ java < /String >(参见)那样在java中加载运算符。
字符串
仅当它们在内存中不存在时,才会在使用
“某物”
时被实例化,因此每次编写
“某物”
时,都会获得对相同的
字符串
对象的引用

例如,如果您这样做:

String a=“某物”;
字符串b=“某物”;
然后

a==b;//这是真的。
您可以查看这些问题以了解有关
String
对象如何工作的更多信息:


因为Java不支持用户定义的运算符重载无法使用
=
运算符创建新实例

查看以了解更多信息

CodeString s=“Hello World!”不会创建新的字符串。它将字符串池中存在的
字符串的引用分配给
s
。如果字符串池中不存在
字符串
,则会在字符串池中创建一个新的
字符串
对象,但不能单独使用操作符
=

这将创建新的
字符串
对象:

String s1 = new String("Hello World!"); // new Object
String s2 = new String("Hello World!"); // new Object

System.out.println(s1 == s2); // false
这可能会也可能不会在字符串池中创建新的
String
对象:

String s1 = "Hello World!";
String s2 = "Hello World!";

System.out.println(s1 == s2); // true
您可以使用<代码> GETStaseNo.()/Cuth>模式来比较上面提到的行为,考虑如下:

public class Singleton {
  private Singleton(){}

  private static class SingletonHelper{
    private static final instance INSTANCE = new Singleton();
  }

  public static Singleton getInstance() {
    return SingletonHelper.INSTANCE;
  }
}
然后你可以使用:

Singleton s = Singleton.getInstance();

不,你不能。正如您所说,
位于Java
中,字符串不是用
=
实例化的。字符串常量是用
“…”
定义的,从这里开始它只会变得更复杂。所以,不,你不能。使用
new
。如果您不喜欢
new
,您可以将其隐藏在静态工厂方法或类似的方法后面。我的意思是,如果我的类或“+=”旁边有“=”的话,我可以告诉Java该怎么做。我给String类举了一个例子。不是字符串类的内部。我通过使用用户定义的运算符重载来获得答案。谢谢大家。@matthew-Java实际上并没有对带有字符串的“=”执行任何特殊操作(它对“+=”执行特殊操作,但这只是因为它对“+”)具有特殊行为。第一个代码段不一定在字符串池中创建新的
字符串
(由
新字符串(…)
创建的字符串不包含在该池中).@无论如何,你当然是对的,我的错,纠正了我的回答。