0

鉴于此代码:

public class Example
{

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

public someMethod()
  {
    //some code
  }
}

在 java 中,当您声明一个新的(对象或实例)时:

Example foo = new Example("jo");

这里实际发生了什么?我的问题是:

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

  2. 新对象会在大括号内包含构造函数和数据成员的所有参数吗?

4

3 回答 3

1

鉴于您的代码没有default constructor

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

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

于 2013-02-17T18:17:30.673 回答
1

正如 Rohit 所说,由于未指定默认 ctor,您将遇到编译器错误。

但是,假设您确实有一个默认 ctor:会发生什么是创建数据成员,即为每个 非静态实例成员分配内存。

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

如果构造函数体执行到一个完成,即没有例外,它返回一个对新创建对象的引用。

所以:

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

  2. 构造函数只初始化数据。使用构造函数体中定义的数据,或构造函数调用者提供的参数。这些参数不会创建对象,它们提供可能对对象有用的数据。

于 2013-02-17T18:17:59.100 回答
1

这不会编译。如果您不包含构造函数,Java 会自动为您定义一个构造函数。它不包括参数。因此,如果您从代码中取出公共示例片段,或者添加到无参数构造函数中,Java 将编译它。

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

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

    String input;

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

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

编辑:现在您已经更改了代码以包含参数的传递,只要您在课堂上的回答中声明字符串输入,它将编译。

于 2013-02-17T18:20:36.460 回答