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

Java字符串的行为不像对象?

Java字符串的行为不像对象?,java,string,Java,String,据我所知,Java中的字符串不是原语,而是对象。Java还提供了一些快捷方式,使使用字符串更容易,因此我们不必使用newstring()或使用+操作符连接两个字符串 因此,我编写了以下小测试: package programming.project.test; public class JavaStringTests { public static void main(String[] args) { String test1 = new String("uno do

据我所知,Java中的字符串不是原语,而是对象。Java还提供了一些快捷方式,使使用字符串更容易,因此我们不必使用
newstring()
或使用
+
操作符连接两个字符串

因此,我编写了以下小测试:

package programming.project.test;

public class JavaStringTests {

    public static void main(String[] args) {
        String test1 = new String("uno dos ");
        MyString test2 = new MyString("uno dos ");  

        System.out.println(test1);
        System.out.println(test2);

        extendMe(test1);
        extendMe(test2);

        //primitive-like behavior?
        System.out.println("(String) -> " + test1);

        //expected if String is not a primitive
        System.out.println("(MyString) -> " + test2);
    }


    private static void extendMe(MyString blubb) {
        blubb.add("tres ");
    }

    private static void extendMe(String blubb) {
        blubb = blubb + "tres ";
    }
}
MyString类:

public class MyString {

    String str;

    public MyString(String str) {
        this.str = str;
    }

    public String toString() {
        return str;
    }

    public void add(String addme) {
        str += addme;
    }

}
生成以下输出:

uno dos 
uno dos 
(String) -> uno dos 
(MyString) -> uno dos tres

如果String是一个对象,为什么它会在作为参数传递时自动创建它的新实例?字符串是一种类似于对象的基本体,是介于基本体和对象之间的东西吗?

extendDME不会做您认为它会做的事情。字符串是不可变的,不能更改。String.concat()不会更改字符串,它会返回一个新实例,您可以在代码中丢弃它。

extendMe不会执行您认为它会执行的操作。字符串是不可变的,不能更改。concat()不会更改字符串,它会返回一个新实例,您可以在代码中丢弃它

 private static void extendMe(String blubb) {
        blubb.concat("tres ");
  }
这里String.concat返回一个新的字符串和concated值

何处为

private static void extendMe(MyString blubb) {
        blubb.concat("tres ");
}
在这里,您正在将concated值添加到内部str状态

这里String.concat返回一个新的字符串和concated值

何处为

private static void extendMe(MyString blubb) {
        blubb.concat("tres ");
}
在这里,您正在将concated值添加到内部str状态