【问题标题】:How this code Compile and Run?这段代码如何编译和运行?
【发布时间】:2017-10-31 06:21:27
【问题描述】:
class test {

    public static void main(String[] args) throws java.lang.Exception {
        new Animal();
    }
}

class Animal {

    Animal() {
        System.out.println("sound! sound!");
    }
}

这段代码如何编译得很好,因为我们知道如果不使用类的引用变量,我们不能单独使用 new 运算符,这里我只是提到“new Animal();”并且构造函数正在执行而没有任何错误,如何? ?

【问题讨论】:

  • “我们知道,如果不使用类的引用变量,我们不能单独使用 new 运算符”——也许我们知道
  • 不需要将new返回的对象存储在变量中。
  • 请告诉我们哪个愚蠢的网站说你不能单独使用new运算符,所以我们都可以羞辱它。

标签: java object constructor


【解决方案1】:

你说:

我们知道,如果不使用类的引用变量,我们就无法使用 单独的新运算符

你可以。结果对象引用根本没有分配给任何东西,并且无法进一步访问分配/实例化的对象。请注意,如果没有持有引用,您实例化的 Animal 对象将成为立即垃圾回收的候选对象(尽管在您的示例中 main() 将立即退出)

【讨论】:

    【解决方案2】:

    你可以随心所欲地做new Animal();,唯一的事情是你创建了对象,但没有你以后可以用来处理对象的引用......

    所以这个:

    public static void main(String[] args)  {
        new Animal();
    }
    

    没问题,编译运行没问题


    这里只是一个取自 JDK 的例子:

    来自DateFormat

    public final String format(Date date)
    {
        return format(date, new StringBuffer(),
                      DontCareFieldPosition.INSTANCE).toString();
    }
    

    一个StringBuffer对象被匿名创建并传递给format方法...

    【讨论】:

      【解决方案3】:

      您正在创建一个匿名对象。构造函数执行后; GC 会清理这个对象。

      https://www.quora.com/What-is-anonymous-object-instantiation

      【讨论】:

        【解决方案4】:

        仅仅因为您没有将 new Animal() 分配给变量,并不意味着它不会被初始化。

        你只是不能使用它或再次引用它。

        【讨论】:

        • 除非它将对自身的引用存储在全局内存中(坏主意,但有人可能在某个时候这样做了)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多