2017-05-30 29 views
-6
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();”并且构造函数没有任何错误地执行,怎么样??这段代码如何编译并运行?

+5

“我们知道,如果没有使用引用变量的类,我们不能单独使用new操作符” - 也许我们_don't_知道 – khelwood

+1

它不是必需的存储对象'在new'回报变量。 – Jesper

+1

请让我们知道什么愚蠢的网站说,你不能单独使用'new'算子,所以我们都可以耻辱它存在。 – Andreas

回答

3

你说:

我们知道,如果没有使用引用变量的类,我们不能单独使用 新的运营商

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

1

您可以尽可能多地做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对象是匿名的创建和传递给格式化方法...

0

只是因为你没有把你的new Animal()分配给一个变量,这并不意味着它不会被初始化。

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

+2

除非它在全局内存中存储对自身的引用(坏主意,但有人可能在某个时候做过)。 – Andreas