【问题标题】:Why Java class default constructor is not called upon declaration?为什么在声明时不调用 Java 类默认构造函数?
【发布时间】:2012-09-30 19:53:42
【问题描述】:

Java 具有默认构造函数,但与 C++ 的功能不同。

在 C++ 中,在声明对象时会隐式调用默认构造函数,因此无需显式“新建”它。但在 Java 中,必须显式初始化对象。有什么特别的原因吗?对此有任何功能要求吗?

【问题讨论】:

  • 你能举例说明你的意思吗?也就是说,除了“Java 不是 C++,它以它的工作方式工作”之外,我不确定这里是否有任何答案

标签: java


【解决方案1】:

仅当 C++ 声明在堆栈上创建对象时。所有 Java 对象都是基于堆的,所以这不是一个选项。在这两种语言中,构造函数都会在创建新对象时调用。

// C++
Obj obj;  // stack
Obj* pObj = new Obj;  // heap

// Java
Obj obj = new Obj();  // heap (stack not possible)

【讨论】:

  • 没错。在 Java 中,您不声明对象,而是声明对对象的引用。
  • 我认为 C++ 对象也有点像堆上的引用?也许我错了,但你能解释一下吗?
  • 后者是指向堆上对象的指针,而前者是栈上的对象。
  • @texasbruce 甚至没有接近。指向对象的 C++ 指针可以被认为是一种引用(不要与常规 C++ 引用混淆),但它可以指向堆或以前堆栈分配的对象。你可以做class Foo { Bar _bar; } ... Foo *foo = new Foo();,其中Foo分配在堆上,但bar将使用Bar的默认构造函数进行初始化。所以堆栈分配和堆分配之间的区别并不真正相关。是处理对象指针还是对象值(Java 没有)。
  • 所以 Java 引用总是在堆上分配,而 C++ 对象是在栈上分配的(比如结构?)而指针在堆上?
【解决方案2】:

技术上,

在 C++ 中,在声明对象时会隐式调用默认构造函数

不正确,但不完整。如果一个对象有一个用户定义的默认构造函数,你不能只声明它。声明点也是定义和初始化。

在 Java 中,引用可以是 null,而在 C++ 中则不能。在 C++ 中,只有指针可以是 NULL。所以有不同的语义。

JavaObject o = null; //valid Java
                     //invalid C++

【讨论】:

    【解决方案3】:

    Java 构造:

    MyClass myObject;
    

    等价于(-ish)以下 C++:

    MyClass *myObject;
    

    不要:

    MyClass myObject;
    

    没有与后者等效的 Java。

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      相关资源
      最近更新 更多