2013-02-17 152 views
0

鉴于此代码:构造澄清

public class Example 
{ 

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

public someMethod() 
    { 
    //some code 
    } 
} 

在java中,当你宣布一个新的(对象或实例)这样:

Example foo = new Example("jo"); 

什么是真正发生在这里? 我的问题是:

  1. 是正在与类构造函数的参数创建一个新的对象?

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

+3

该代码不会编译。请张贴实际编译的代码。 – 2013-02-17 18:17:14

回答

1

鉴于你的代码,不具有default constructor

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

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

1

由于Rohit表示由于没有指定默认ctor,因此会出现编译器错误。

但是,假设你有一个默认的构造函数:什么情况是,也就是内存分配给每个非静态实例成员成员创建的数据。

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

如果构造函数体执行完成,那不是例外,它会返回对新创建对象的引用。

所以:

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

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

1

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

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

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

String input; 

如果你这样做,并没有指定一个构造函数(即让Java的为您创建它),爪哇将持有输入值“空”。

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

编辑:现在你已经改变了你的代码来包含参数的传递,只要你在类中的回答中声明了字符串输入就可以编译它。