Java 构造函数和类之间的关系是如何工作的?
我已经开始学习OOP,我理解了类的概念,我理解通过使用构造函数,我们可以将类与程序的其余部分隔离开来,但是我想了解更多关于类与其构造函数之间的关系 当我设置构造函数时,它正在初始化我的实例变量,但它是否复制了我的类,然后我只处理构造函数,还是它被用作我的类和我的程序的其余部分之间的中介,即它是否将信息传递到类中 下面是我上周制作的一个程序的示例Java 构造函数和类之间的关系是如何工作的?,java,oop,constructor,Java,Oop,Constructor,我已经开始学习OOP,我理解了类的概念,我理解通过使用构造函数,我们可以将类与程序的其余部分隔离开来,但是我想了解更多关于类与其构造函数之间的关系 当我设置构造函数时,它正在初始化我的实例变量,但它是否复制了我的类,然后我只处理构造函数,还是它被用作我的类和我的程序的其余部分之间的中介,即它是否将信息传递到类中 下面是我上周制作的一个程序的示例 class Pets { private String breed ; private String coat ; private String t
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构造函数在对象创建时被调用。它构造值,即为对象提供数据,这就是它被称为构造函数的原因 它在声明时有一些规则要遵循
构造函数不是用于“复制我的类”,而是用于初始化该类的实例。如前所述,构造函数用于创建该类的实例。看看你的代码,你有一个方法来打印关于宠物的信息,因为所有的类都是对象类的子类,你可以使用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的答案就是我想要的,它传递信息而不是复制类变量。它从参数中提取值,这些值可能是指向传递的相同对象的指针。我不知道是什么