为什么只在java中动态创建类对象?

时间:2014-06-12 08:14:47

标签: java c++ dynamic static

这个问题已经问before但我从那里找不到可以理解的答案。 我实际上想知道, c ++ 类对象不能在 java 中创建静态为什么?静态创建java设计者想要防止发生的对象的主要缺点是什么?

感谢。

2 个答案:

答案 0 :(得分:4)

好问题。人们很想说这是因为 语言的作者比你知道哪些价值类型更好 你需要,并提供它们,并且不想让你定义 新的(例如复杂的)。肯定有一些 那:它还解释了缺少运算符重载。

但我怀疑这不是人们心目中的理由 Java作者。你需要动态分配和指针(什么 Java在某些情况下调用引用),例如多态时 参与,Java作者只是决定他们会 只支持这个成语,而不是让语言更多 通过支持几种不同的习语来复杂化。它的 当然,当你真正需要价值语义时,这是一种痛苦,但是 小心,你可以模拟它们(java.lang.String会 一个很好的例子)通过使用类final和不可变类来实现 返回新实例的“运算符”。

当然,C ++增加的表现力确实提供了更多 错误的可能性:很容易获取本地的地址 例如,变量,并以悬空指针结束。但 只是因为你可以做某事并不意味着你必须这样做; 在C ++中,一个不称职的程序员可以使程序崩溃 马上,在Java中,他通常会最终得到 错误的结果(尽管未被捕获的例外并不罕见 任一)。

答案 1 :(得分:2)

编辑:海报实际上可能会问为什么“对象”在Java中是静态的?在这种情况下,答案是"他们可以"我已将其添加到底部的答案中。但是,如果问题是为什么不能像在C ++中一样在堆栈上分配对象,那么这个答案的第一部分试图解决这个问题:


我想这可以归结为Java语言的设计目标。

因为java有垃圾收集器,所以

尝试使事情变得更简单,更安全,更熟悉,同时保持它们的快速性和一致性是Java语言设计者的设计目标。

从这里引用http://www.oracle.com/technetwork/java/simple-142339.html(重点是我的):

  

简单是Java最重要的设计目标之一。简单和   删除许多"功能"从C和C ++中可疑的价值   祖先保持Java相对较小并减少程序员   负担来制作可靠的应用程序。为此,Java设计   团队研究了"现代"的许多方面。 C和C ++语言   确定在现代背景下可以消除的特征   面向对象编程。

设计师决定的其中一个功能是“可疑的价值”#34; (或者语言或其垃圾收集过程不必要地复杂化)是堆栈分配的对象。

These online chapters深入介绍了Java语言的设计目标。


回顾评论我认为我可能误解了原始海报的问题,因为这个问题似乎混淆了在堆栈上分配对象的两个完全正交的概念静态分配的对象

  • 堆栈分配是指仅存在于当前范围内且占用堆栈空间的值对象。

  • 静态分配是指存在每个类的实例 - 在应用程序的生命周期内可以存在并在静态分配块中初始化的对象。< / p>

由于上述原因,Java不支持前一个概念(原始数据类型除外);但它确实支持后者。实例化属于类的静态Object是完全可以接受的Java代码。一个非常简单的静态类对象示例就是这段代码:

public class Foo {

    public static Integer integerValue = new Integer(32);

}

这将创建属于Foo类的Integer对象的单个公共实例。因为在这个例子中它是公共的,所以可以访问它并通过调用它来设置它:

Foo.integerValue = 57;

请注意,integerValue只存在一个(实际上是全局的)副本,而不管实例化了多少Foo个实例。

静态的常见用法是类常量(使用final修饰符声明),但Java中的static变量不必是常量:如果省略,则默认情况下它们是可变的final修饰符。在多线程应用程序中需要谨慎使用静态变量,但这是另一个故事。

有关java中静态变量的更多信息,可以在这里阅读:

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

在这里:

http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

希望有帮助。