新关键字在Java中的作用

Pra*_*gla 5 java

我不确定new关键字在Java中的行为.是否可以确保每次使用new关键字时,都会在堆上创建一个新的Object?

当我在学习以下示例时,我对此产生了怀疑

class Mixer {
  Mixer() { }
  Mixer(Mixer m) { m1 = m; }
  Mixer m1;
  public static void main(String[] args) {
    Mixer m2 = new Mixer();
    Mixer m3 = new Mixer(m2); // Does it create any new mixer object?
    m3.go();
    Mixer m4 = m3.m1;          m4.go(); 
    Mixer m5 = m2.m1;          m5.go();
  }
  void go() { System.out.print("hi "); }
}
Run Code Online (Sandbox Code Playgroud)

该行Mixer m3 = new Mixer(m2);调用一个不创建任何新对象的构造函数.那么,是不是没有创建新对象?

另外,哪个变量指的是程序末尾的哪个对象,即直到我们得到NullPointerExcetion变量m5.

Mic*_*rry 10

是 - 每次使用new(作为关键字)时,都会创建一个新对象.在这种情况下:

Mixer m3 = new Mixer(m2);
Run Code Online (Sandbox Code Playgroud)

线混合器m3 =新混合器(m2); 调用不创建任何新对象的构造函数.

你的推理是完全错误的.Mixer正在使用m2作为参数创建新的.通常这表示一个复制构造函数 - 创建一个具有与旧属性相同的属性的新混合器(但它始终是一个新的,不同的对象,并且在技术上不必复制传入的对象的属性.)


Joe*_*ade 2

new 总是创建一个新实例(因此总是保留堆内存等)。

这应该说明一下。请注意,实例上的 == 会告诉您它是同一个实例(对象)还是不同的实例。(这就是为什么你应该总是使用 equals,除非这是你想要做的)

我添加了一个与字符串有关的有趣的事情。“abc”不会创建新实例,而是重用现有实例。但是当你在 String 类上调用 new 时,它就会发生。

public class Test {
    private String value;

    public String getValue() {
        return value;
    }

    public Test() {
        value = "default";
    }
    public Test(Test t) {
        this.value = t.getValue();
    }

    public Test(String value) {
        this.value = value;
    }

    public static void main(String[] argv) {
        Test t1 = new Test();
        Test t2 = new Test(t1);

        if (t1 == t2) {
            System.out.println("t1 == t2. should not happen");
        } else {
            System.out.println("t1 is a different instance from t2");
        }

        String s1 = "test";
        String s2 = "test";

        if (s1 == s2) {
            System.out.println("s1 == s2. strings initialized with quotes don't always get a new instance.");
        } else {
            System.out.println("s1 is a different instance from s2. should not happen");
        }

        String s3 = new String("test");
        String s4 = new String(s3);

        if (s3 == s4) {
            System.out.println("s3 == s4. should not happen.");
        } else {
            System.out.println("s3 is a different instance from s4, as they were newed.");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)