Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中创建构造函数的额外好处是什么?_Java_Methods_Constructor - Fatal编程技术网

在java中创建构造函数的额外好处是什么?

在java中创建构造函数的额外好处是什么?,java,methods,constructor,Java,Methods,Constructor,我注意到一件事,一个构造函数和一个类的简单方法做同样的工作。创建类构造的确切原因是什么?如果我创建MyClass(){}constructor和MyClassMethod(){}方法,它将完成与我编写这些方法和构造函数的主体部分相同的工作。那么,建设的需要是什么呢?它有什么特殊用途吗 与方法相比,使用构造函数的好处之一是可以确保调用了构造函数并执行了构造函数中的工作 该语言指定要构造对象,必须调用构造函数。因此,如果使用自定义方法来建立对象的初始状态,则需要首先调用默认构造函数。当您可以在一次调

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

与方法相比,使用构造函数的好处之一是可以确保调用了构造函数并执行了构造函数中的工作

该语言指定要构造对象,必须调用构造函数。因此,如果使用自定义方法来建立对象的初始状态,则需要首先调用默认构造函数。当您可以在一次调用构造函数中执行工作并确保对象已正确初始化时,为什么要进行两次方法调用

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

如果您创建一个新的
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 
   }

}
有几点:

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

public class SomeType {
   final int x ;
   SomeType(int y){
     x=y;
   }
}
2) 具有
private
构造函数的类不能进行子类划分


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

您可以在构造函数中设置
final
字段,而无需初始值设定项。这有助于构建不可变的实例:

class Number extends Expr {
    private final int n;

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

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

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

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

然而,有一个很有用的习惯用法称为工厂方法(更多信息请参见),它本质上是使用静态方法来构造对象,其主要优点是

  • 您可以给工厂方法一个更具描述性的名称(当然,标准构造函数必须以包含的类命名)
  • 它们不必返回对象,因此具有更大的灵活性
  • 它们可以返回类的子类型

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


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



更多细节:

构造函数和方法是两码事。您可以在它们内部编写相同或类似的代码这一事实是无关紧要的

创建新对象时,将调用构造函数。如果不指定一个,编译器将为您创建一个默认值。这是初始化对象字段并为对象分配内存的地方。这是所有面向对象语言都有的概念。新对象必须以某种方式初始化。内存需要分配。在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
使用方法无法强制执行此操作。使用您的类的程序员可能会调用或不调用您的方法。构造函数是对象生命周期的一部分。方法定义对象的行为

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

一些要点:

1. A constructor eliminates placing the default values.
2. A constructor eliminates calling the normal method implicitly.

除了包含可执行功能外,构造函数还有很多用途!这些方法不是称为
静态构造函数,而是称为工厂方法。我的理解是,如果它返回其包含类的类型,则称为静态构造函数,否则称为工厂方法(例如,它属于专用工厂类)。然而,谷歌的一点建议,工厂方法是这两种情况下的共同名称,将更新我的答案。谢谢为什么不将x传递到doSomethingWithX()中,在那里初始化它呢