鉴于此代码:
public class Example
{
public Example(String name)
{
input = name;
}
public someMethod()
{
//some code
}
}
在java中声明新的(对象或实例)时:
Example foo = new Example("jo");
这里到底发生了什么? 我的问题是:
是使用类构造函数的参数创建的新对象吗?
新对象是否具有括号内的构造函数和数据成员的所有参数?
答案 0 :(得分:1)
鉴于您的代码没有default constructor
行Example foo = new Example();
将导致编译错误
默认构造函数默认定义为,除非添加带有参数的另一个构造函数。在这种情况下,您必须显式定义default constructor
,否则您只能使用带参数的构造函数创建实例
答案 1 :(得分:1)
正如Rohit所说,由于没有指定默认的ctor,你会遇到编译器错误。
但是,假设你做了有一个默认的ctor:会发生什么是创建数据成员,也就是说,为每个非静态实例成员分配内存。 / p>
如果类扩展了任何类,则应在子类的构造函数体执行之前调用构造函数(parent的ctor),然后构造函数体使用局部变量或作为ctor参数传递的局部变量初始化数据成员。
如果构造函数体执行完成,这不是异常,它返回对新创建的对象的引用。
所以:
new
创建对象,如果一切顺利,则返回该对象的引用。
构造函数只初始化数据。使用中定义的数据 构造函数体,或者来自构造函数提供的参数 呼叫者。这些参数不会创建对象,而是提供数据 这可能对某个对象有用。
答案 2 :(得分:1)
这不会编译。如果您不包含构造函数,Java将自动为您定义构造函数。它不包括参数。因此,如果您从代码中获取公共示例部分,或者在无参数构造函数中添加Java,则会编译它。
您创建构造函数时代码将无法编译,然后尝试实例化该类的对象,而不给它任何属性(导致编译错误)。
此外,值得指出的是,您的代码无论如何都无法正常工作,因为您使用的input
未在任何地方定义。它应该在公共示例之前定义,如:
String input;
如果你这样做并且DID没有指定构造函数(即让Java为你创建它),那么Java将为输入保留值“null”。
任何声明为public且属于该类的实例变量都可由您创建的对象访问。
编辑:现在你已经修改了你的代码以包含一个参数的传递,只要你在类中的答案中声明了String输入,它就会编译。