Java String的行为不像对象?

时间:2016-03-17 20:42:22

标签: java string

据我所知,Java中的String不是原始的而是对象。 Java还有一些快捷方式,可以更轻松地使用字符串,因此我们不必使用new String()或使用+运算符连接两个字符串。

所以我写了以下小测试:

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是一个对象,为什么它作为参数传递时会自动创建它的新实例? String是某种类似原始的对象,是原始对象和对象之间的东西吗?

2 个答案:

答案 0 :(得分:2)

extendMe不会按照您的想法行事。字符串是不可变的,它们是不可更改的。 String.concat()不会更改字符串,它会返回一个新实例,您可以在代码中放弃该实例。

答案 1 :(得分:0)

 private static void extendMe(String blubb) {
        blubb.concat("tres ");
  }

这里String.concat返回一个带有连接值的新String。

在哪里

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

在这里,您将为内部str状态添加连接值。