建设者澄清

时间:2013-02-17 18:14:54

标签: java constructor

鉴于此代码:

public class Example
{

public Example(String name)
  {
    input = name;
  }

public someMethod()
  {
    //some code
  }
}

在java中声明新的(对象或实例)时:

Example foo = new Example("jo");

这里到底发生了什么? 我的问题是:

  1. 是使用类构造函数的参数创建的新对象吗?

  2. 新对象是否具有括号内的构造函数和数据成员的所有参数?

3 个答案:

答案 0 :(得分:1)

鉴于您的代码没有default constructor

Example foo = new Example();将导致编译错误

默认构造函数默认定义为,除非添加带有参数的另一个构造函数。在这种情况下,您必须显式定义default constructor,否则您只能使用带参数的构造函数创建实例

答案 1 :(得分:1)

正如Rohit所说,由于没有指定默认的ctor,你会遇到编译器错误。

但是,假设你做了有一个默认的ctor:会发生什么是创建数据成员,也就是说,为每个非静态实例成员分配内存。 / p>

如果类扩展了任何类,则应在子类的构造函数体执行之前调用构造函数(parent的ctor),然后构造函数体使用局部变量或作为ctor参数传递的局部变量初始化数据成员。

如果构造函数体执行完成,这不是异常,它返回对新创建的对象的引用。

所以:

  1. new创建对象,如果一切顺利,则返回该对象的引用。

  2. 构造函数只初始化数据。使用中定义的数据 构造函数体,或者来自构造函数提供的参数 呼叫者。这些参数不会创建对象,而是提供数据 这可能对某个对象有用。

答案 2 :(得分:1)

这不会编译。如果您不包含构造函数,Java将自动为您定义构造函数。它不包括参数。因此,如果您从代码中获取公共示例部分,或者在无参数构造函数中添加Java,则会编译它。

您创建构造函数时代码将无法编译,然后尝试实例化该类的对象,而不给它任何属性(导致编译错误)。

此外,值得指出的是,您的代码无论如何都无法正常工作,因为您使用的input未在任何地方定义。它应该在公共示例之前定义,如:

    String input;

如果你这样做并且DID没有指定构造函数(即让Java为你创建它),那么Java将为输入保留值“null”。

任何声明为public且属于该类的实例变量都可由您创建的对象访问。

编辑:现在你已经修改了你的代码以包含一个参数的传递,只要你在类中的答案中声明了String输入,它就会编译。