7

我注意到一个构造函数和一个类的简单方法做同样的工作。创建一个类的构造的确切原因是什么?如果我创建MyClass(){}构造函数和MyClassMethod(){}方法,它将完成与我编写这些方法和构造函数的主体部分相同的工作。那么建设的需要是什么?它有什么特殊用途吗?

4

8 回答 8

6

构造函数和方法是两个不同的东西。您可以在其中编写相同或相似的代码这一事实无关紧要。

当创建一个新对象时,会调用一个构造函数。如果您没有指定一个,编译器将为您创建一个默认值。这是初始化对象字段并为对象分配内存的地方。这是所有面向对象语言都有的概念。必须以某种方式初始化一个新对象。需要分配内存。在 Java 中,您不会自己管理内存(至少不是直接管理),所以这是构造函数的目的。请注意,由于始终执行构造函数,因此只要调用 eg 就会强制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

使用一种方法,您无法强制执行此操作。使用您的类的程序员可能会调用您的方法,也可能不会。构造函数是对象生命周期的一部分。方法定义对象的行为

于 2013-07-18T11:29:42.893 回答
5

几点:

1)构造函数是设置final实例变量的唯一方法。

public class SomeType {
   final int x ;
   SomeType(int y){
     x=y;
   }
}

2)private不能对具有构造函数的类进行子类化。

3)如果你的类是一个子类,而基类没有默认构造函数,那么你需要在你的类中有一个构造函数来调用超类的构造函数。

于 2013-07-18T10:51:53.550 回答
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 
   }

}
于 2013-07-18T10:51:36.390 回答
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
于 2013-07-18T10:47:53.943 回答
3

本质上,构造函数只是一种隐式返回其包含类型的对象的特殊方法。您通常应该使用构造函数来创建对象——这是人们期望看到的。

但是,有一个有用的习语叫做factory method(更多信息在这个链接),它本质上是使用静态方法来构造一个对象,主要优点是

  • 您可以给工厂方法一个更具描述性的名称(当然,标准构造函数必须以包含类的名称命名)。
  • 他们不必返回对象,从而提供更大的灵活性。
  • 它们可以返回类的子类型。
于 2013-07-18T10:53:22.773 回答
1

您可以final在构造函数中设置没有初始化程序的字段。这有助于构建immutable实例:

class Number extends Expr {
    private final int n;

    public Number(int n) {
        this.n = n;
    }

    public int getValue() {
        return this.n;
    }
}

因此,在这样的构造函数之后,您可以依赖实例已完全初始化的事实(在这种情况下,它的值是不可变/常量)。

于 2013-07-18T10:53:01.153 回答
1

构造函数不像简单的方法。每次创建该特定类的对象时都会调用它。您不需要显式调用它。


在创建对象时,我们需要立即做一些事情,例如,当您创建 GUI 类型的东西时,您希望在创建时设置许多属性,例如窗口大小等。构造函数的另一个好处是类的安全性. 除非您知道构造函数的正确周长,否则您无法创建对象。


更多细节:http ://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

于 2013-07-18T10:58:09.823 回答
1

构造函数是面向对象编程中类或结构的一种特殊方法,用于初始化该类型的对象。

几点:

1. A constructor eliminates placing the default values.
2. A constructor eliminates calling the normal method implicitly.
于 2017-04-23T12:36:46.137 回答