【问题标题】:How does the relationship between a constructor and a class work?构造函数和类之间的关系如何工作?
【发布时间】:2017-03-20 20:38:35
【问题描述】:

我已经开始学习 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 + "." ) ;

}

【问题讨论】:

  • 构造函数用于构造类的实例。当你说new Pets 时,它会调用构造函数来创建一个实例。
  • 构造函数不是一个单独的实体。它是在实例化该类的对象类型时调用的类的特定方法。它不会“将我们的班级与程序的其余部分隔离开来”。
  • “它会将信息传递给类吗?” 是的,它会。您应该使用它将其参数分配给实例变量和/或超级构造函数。构造函数不应该做任何其他事情(除了基本验证)。特别是它不应该实例化其他类(使用new 运算符)或调用传入对象的方法。
  • 这就是我要找的蒂莫西。我不明白为什么我的问题被标记为关闭,只是说明构造函数的目的并没有描述信息的使用方式。

标签: java oop constructor


【解决方案1】:

构造函数不是使用实例的一种方式,而是它们在使用之前应该启动的方式。

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

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

最后,这些方法用于提供计算和处理。

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

为什么?因为这样,您可以检查数据的有效性,如果它们对您的班级不利,则可以拒绝它们。这是一个例子:

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) ;
}

这样你的代码会更健壮,你会看到更少的错误!公平地说,您应该使用 Exceptions 来告诉这种错误(例如 ArgumentNullException),但这是另一个问题。

了解默认构造函数通常出于多种原因使用,这一点很重要。然后,我就有了尽可能添加默认构造函数的习惯。

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

祝你有美好的一天!

【讨论】:

  • 我们在第 2 课中学到了这一点,他们只是想介绍基础知识,我来自 C 背景,我想准确了解内存中发生的情况。
  • 有时,您需要停止过多地关心内存,因为 JVM 会根据机器的不同做一些不同的事情......但我理解您为什么会问这个问题。只要记住垃圾收集器,如果可以的话,尽量不要使用过多的资源来编写,你会没事的
  • 对于我对 OOP 工作原理的理解更是如此,我认为从 C 开始更好的原因之一是您了解正在发生的事情,我的大部分课程都可以用 Java 编程,但他们不知道实际发生了什么,比如当我们讨论数组时,他们不明白如何像我一样在内存中处理它。不需要理解概念,但必须掌握概念。
  • @Ninja2k:一个有趣的观察 r.e.较低层次的理解。我本来打算谈谈你可以从“用 C 编写对象样式的代码”中学到什么,但这是 stackoverflow,所以当然已经有了一个很棒的答案:stackoverflow.com/questions/351733/…
  • 在这里,我为你找到了,也许它可以回答你的问题:stackoverflow.com/questions/40480/…
【解决方案2】:

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

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

在声明时有一些规则要跟进

  1. 构造函数名必须与其类名相同
  2. 构造函数不能有明确的返回类型

你可以重载它来为你的实例指定不同的初始化

【讨论】:

  • 构造函数不是“一种特殊类型的方法”,因为它不是任何类型的方法。
  • 我说的是一种特殊类型的方法,因为它在所有东西中都像方法,但没有返回类型尝试修改承包商的文档
  • 您说构造函数“是一种特殊的方法”。它不是。它不像“在一切中”的方法。构造函数在完成时建立内存屏障;一个方法没有。构造函数初始化一个对象;一个方法没有。构造函数可以访问部分初始化的状态;除非从构造函数调用的方法不会。方法有返回类型,构造函数没有。构造函数必须出现在new 之后,方法不能出现。它们在 JLS 中有完全不同的目的、语义和主要部分。它们根本不一样。否则是错误的。
  • 你能检查一下http://www.javatpoint.com/constructor它和我说的一样吗:)
  • 我会坚持 Java 语言规范所说的,因为它实际上定义了语言。
【解决方案3】:

“我知道通过使用构造函数我们可以将我们的类与程序的其余部分隔离开来”是不正确的。构造函数的存在并不是为了“屏蔽”任何东西,无论这意味着什么。

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

不要将业务逻辑放在构造函数中。业务逻辑应仅适用于完全构造的对象。在构造函数中进入它是产生奇怪的、昂贵的错误的秘诀。在涉及线程的情况下,这完全正确。先构建,后操作。

构造函数不是为了“复制我的类”,而是为了初始化类的一个实例。

【讨论】:

  • 这是对构造函数的一般解释,但它没有描述数据实际发生的情况,Timothy Truckles 的答案是我正在寻找的,它确实传递信息而不是复制类变量。
  • 嗯,它从它的参数中获取值,这些值可能是指向与传递的相同对象的指针。我不知道“复制类 [原文] 变量”是什么意思。它不是“中介”,正如我所说,它不会“复制一个类”。此外,正如我所说,它可以接受数据。我只能回答你实际提出的问题。
【解决方案4】:

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

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

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

【讨论】:

  • 构造函数没有“创建类的实例”; new 就是这样做的。构造函数在创建实例后初始化实例。
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2019-02-16
  • 2011-01-26
  • 2018-09-23
  • 2017-02-07
  • 1970-01-01
  • 2012-08-25
相关资源
最近更新 更多