Java 构造函数和类之间的关系是如何工作的?

Java 构造函数和类之间的关系是如何工作的?,java,oop,constructor,Java,Oop,Constructor,我已经开始学习OOP,我理解了类的概念,我理解通过使用构造函数,我们可以将类与程序的其余部分隔离开来,但是我想了解更多关于类与其构造函数之间的关系 当我设置构造函数时,它正在初始化我的实例变量,但它是否复制了我的类,然后我只处理构造函数,还是它被用作我的类和我的程序的其余部分之间的中介,即它是否将信息传递到类中 下面是我上周制作的一个程序的示例 class Pets { private String breed ; private String coat ; private String t

我已经开始学习OOP,我理解了类的概念,我理解通过使用构造函数,我们可以将类与程序的其余部分隔离开来,但是我想了解更多关于类与其构造函数之间的关系

当我设置构造函数时,它正在初始化我的实例变量,但它是否复制了我的类,然后我只处理构造函数,还是它被用作我的类和我的程序的其余部分之间的中介,即它是否将信息传递到类中

下面是我上周制作的一个程序的示例

class Pets

{

private String breed ;
private String coat ;
private String temperment ;

//constructors with 3 parameters and 3 instance variables.
public Pets ( String aBreed, String aCoat, String aTemperment )

{

breed = aBreed ;
coat = aCoat ;
temperment = aTemperment ;

}

//Setters
public void setBreed ( String aBreed ) { breed = aBreed ; }
public void setCoat ( String aCoat ) { coat = aCoat ; }
public void setTemperment ( String aTemperment ) { temperment = aTemperment ; }


//Getters
public String getBreed() { return breed ; }
public String getCoat() { return coat ; }
public String getTemperment() { return temperment ; }

//petDisplay - A method to print information about pets.
public void petDisplay()

{

System.out.println ( "This pet is a " + breed + ", it has a " + coat + " coat and is " + temperment + "." ) ;

}

java中的构造函数是一种特殊类型的方法,用于初始化对象

Java构造函数在对象创建时被调用。它构造值,即为对象提供数据,这就是它被称为构造函数的原因

它在声明时有一些规则要遵循

  • 构造函数名称必须与其类名相同
  • 构造函数不能有显式的返回类型
  • 您可以重载它来为实例指定不同的初始化“我理解,通过使用构造函数,我们可以将类与程序的其余部分隔离开来”是不正确的。构造函数的存在并不是为了“屏蔽”任何东西,不管这意味着什么

    构造函数是初始值设定项;它们的存在是为了设置对象的初始状态。您可以将数据传递给构造函数,但不要犯传递操作数据的错误;传递设置初始状态所需的数据

    不要将业务逻辑放在构造函数中。业务逻辑应该只应用于完全构造的对象。在构造函数中使用它会产生奇怪的、昂贵的bug。这在涉及线程的情况下十分正确。先建设,后运营


    构造函数不是用于“复制我的类”,而是用于初始化该类的实例。

    如前所述,构造函数用于创建该类的实例。看看你的代码,你有一个方法来打印关于宠物的信息,因为所有的类都是对象类的子类,你可以使用toString方法来打印你的类的信息。您可以针对您的宠物课程执行以下操作:

    @Override
    public String toString() {
      return ( "This pet is a " + getBreed() + ", it has a " + getCoat() + " coat and is " + getTemperment() + "." );
    }
    

    注意:@Override不需要在那里,但可以是一种良好的做法。

    构造函数不是使用实例的方法,而是在使用实例之前应该启动的方法

    例如,在你的代码中,你对所有将来使用你的类的程序员说的是,如果他们想要一只宠物,他们必须提供一个品种、一件外套和一种气质。这是一种确保类不会被错误使用的方法

    然后,您就有了用于访问类属性的getter和setter

    最后,使用这些方法进行计算和处理

    现在是真正好的部分:因为您可以随心所欲地编写构造函数,所以不应该直接分配属性,而是尽可能使用setter

    public Pets()
    {
      this("Breedless","Grey","WhateverIsATemperment");
    }
    
    为什么??因为这样,您可以检查数据的有效性,如果它们对您的类不好,您可以拒绝它们。以下是一个例子:

    public void setBreed(String aBreed)
    {
      if(aBreed == null)
      {
        System.out.print("You should give a breed !");
      }
      else
      {
        breed = aBreed;
      }
    }
    
    您的构造函数将成为

    public Pets ( String aBreed, String aCoat, String aTemperment )
    {
      setBreed(aBreed) ;
      setCoat(aCoat) ;
      setTemperment(aTemperment) ;
    }
    
    这样,您的代码将更加健壮,您将看到更少的错误!公平地说,您应该使用异常来说明此类错误(例如ArgumentNullException),但这是另一个问题

    重要的是要知道,由于各种原因,经常使用默认构造函数。然后,我习惯于尽可能添加默认构造函数

    public Pets()
    {
      this("Breedless","Grey","WhateverIsATemperment");
    }
    

    祝你今天愉快

    构造函数用于构造类的实例。当你说
    newpets
    时,它调用构造函数来创建一个实例。构造函数不是一个单独的实体。它是类的特定方法,在实例化该类的对象类型时调用该类。它不会“保护我们的班级不受程序的影响”,“它会将信息传递给班级吗?”是的,它会。您应该使用它将其参数分配给实例变量和/或超级构造函数。构造函数不应执行任何其他操作(基本验证除外)。特别是,它不应该实例化其他类(使用
    new
    操作符)或对传入的对象调用方法。我不明白为什么我的问题被标记为闭包,仅仅说明构造函数的用途并不能说明信息是如何使用的。构造函数不是“一种特殊类型的方法”,因为它不是任何类型的方法。我说的是一种特殊类型的方法,因为它在所有方面都像方法,但没有返回类型。试着修改承包商的文档。你说构造函数“是一种特殊类型的方法”。事实并非如此。它不像一种“万事皆有”的方法。构造函数在完成时建立一个内存屏障;一个方法不需要。构造函数初始化一个对象;一个方法不需要。构造函数可以访问部分初始化状态;除非从构造函数调用,否则方法不会。方法有返回类型,构造函数没有。构造函数必须出现在
    new
    之后,方法不能出现。它们在JLS中有完全不同的目的、语义和主要部分。它们完全不同。不这样说是不对的。你能检查一下
    http://www.javatpoint.com/constructor
    这和我说的一样:)我将坚持Java语言规范所说的,因为它实际上定义了语言。这是对构造函数的一般解释,但它没有描述数据的实际情况,Timothy Truckles的答案就是我想要的,它传递信息而不是复制类变量。它从参数中提取值,这些值可能是指向传递的相同对象的指针。我不知道是什么