我注意到构造函数和类的简单方法做同样的工作。创建类的构造的确切原因是什么?如果我创建MyClass(){}
构造函数和MyClassMethod(){}
方法,它将执行与编写这些方法和构造函数的正文部分相同的工作。那么构建的需要是什么?它有什么特殊用途吗?
答案 0 :(得分:5)
有些观点:
1)构造函数是设置final
实例变量的唯一方法。
public class SomeType {
final int x ;
SomeType(int y){
x=y;
}
}
2)具有private
构造函数的类不能被分类。
3)如果您的类是子类而基类没有默认构造函数,那么您需要在类中使用构造函数来调用超类构造函数。
答案 1 :(得分:5)
构造函数和方法是两回事。您可以在其中编写相同或类似的代码这一事实无关紧要。
创建新对象时,将调用构造函数。如果您没有指定,编译器将为您创建一个默认值。这是对象字段的初始化发生并为对象分配内存的地方。这是所有面向对象语言都具有的概念。必须以某种方式初始化新对象。需要分配内存。在Java中,您不自己管理内存(至少不是直接管理内存),因此这是构造函数的目的。请注意,由于始终会执行构造函数,因此只要您调用此行为就会强制执行。 Person p = new Person();
。
现在由于总是在调用构造函数,所以你在这里有一个选项:你是让执行默认构造函数还是自己创建一个?也许有些字段需要以非默认值的方式进行初始化。或者您可能不需要在不提供某些值的情况下创建对象。如果您自己定义构造函数,则编译器不会为您创建默认构造函数。因此,如果我有public Person(String firstName, String lastName) {}
,那么我创建了一个由系统再次强制执行的特定规则:除非您提供名字和姓氏,否则无法创建类Person的新对象:
Person p = new Person(); // this would give a compile error
Person p = new Person("John", "Smith"); // this is the only way to create an object now
使用方法无法强制执行此操作。使用你的班级的程序员可能会调用你的方法。构造函数是对象的生命周期的一部分。方法定义对象的行为
答案 2 :(得分:4)
在方法上使用构造函数的好处之一是可以确保调用构造函数并执行构造函数中的工作。
该语言指定构造对象必须调用构造函数。因此,如果使用自定义方法来建立对象的初始状态,则需要首先调用默认构造函数。为什么在一次调用构造函数时可以执行两次方法调用并确保对象已正确初始化?
public class Test(){
private Integer x;
public Test(){
}
public Test(Integer x){
this.x = x;
}
public void setX(Integer x){
this.x = x;
}
public void doSomethingWithX(){
this.x.toString();
}
}
Test test = new Test(8);
test.doSomethingWithX(); //I know x has been declared and assigned
Test test = new Test();
test.doSomethingWithX(); //X has not been assigned results in NPE
答案 3 :(得分:4)
如果您创建一个MyClass
的新对象,它将自动调用构造函数 - 您可以初始化其中的所有成员,并确保此对象的成员都已初始化。
<强>一般强>
当您创建此类的新对象时,构造函数始终称为 ,并且不能手动调用它。
并且不在构造函数中执行“真正的”工作,因为它会减慢此类对象的创建速度 - 只在那里初始化您的类/成员。
您也可以根据需要使用不同的构造函数 - 但是如果您创建构造函数,则不再有默认构造函数!
示例:强>
public MyClass {
int score;
public MyClass(int sc) { // already know the score
score = sc;
}
public MyClass() { // don´t know the score yet
score = 1;
}
public void addScore() {
score += 5; // i know for sure that score is not zero
}
}
答案 4 :(得分:3)
本质上,构造函数只是一个隐式返回其包含类型的对象的特殊方法。您通常应该使用构造函数来创建对象 - 这是人们期望看到的。
然而,有一个有用的成语factory method
(更多信息在this link),其实质上是使用静态方法来构造一个对象,关键优势是
答案 5 :(得分:1)
您可以在构造函数中设置final
字段而不使用初始值设定项。这有助于构建immutable
个实例:
class Number extends Expr {
private final int n;
public Number(int n) {
this.n = n;
}
public int getValue() {
return this.n;
}
}
因此,在这样的构造函数之后,您可以依赖于实例完全初始化的事实(在这种情况下,它的值是 immutable / constant )。
答案 6 :(得分:1)
构造函数不像简单的方法。每次创建该特定类的对象时都会调用它。您无需明确调用它。
在创建对象时,我们需要立即执行某些操作,例如,当您创建GUI类型的事物时,您希望在创建时设置许多属性,如窗口大小等。 构造函数的另一个好处是类的安全性。除非您知道构造函数的正确周长,否则无法创建对象。
更多详情:http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
答案 7 :(得分:1)
构造函数是面向对象编程中的类或结构的特殊方法,用于初始化该类型的对象。
有些观点:
1. A constructor eliminates placing the default values.
2. A constructor eliminates calling the normal method implicitly.