当前位置: 首页 > 知识库问答 >
问题:

构造函数是突变体吗?

宗政永望
2023-03-14

我有一个任务,我需要添加2个构造函数,并从中分离出来,还列出了变异子。然而,我认为大多数构造函数都是变种人:正如本文所示。所以我很困惑,对于变异子方法,我需要做什么?目前,我为施工人员提供以下服务:

//Constructors
public Species() {
    speciesName = "Balaenoptera musculus";
    population = 15000;
    growthRATE = -0.12;
    if (endangered(growthRATE) == true) {
        status = "endangered";
    } else {
        status = "not endangered";
    }
}

public Species(String name, int populationSize, double GR) {
    speciesName = name;
    population = populationSize;
    growthRATE = GR;
    if (endangered(GR) == true) {
        status = "endangered";
    } else {
        status = "not endangered";
    }
}

public Species(Species species) {
    speciesName = species.getSpeciesName();
    population = species.getPopulation();
    growthRATE = species.getGrowthRate();
    if (endangered(growthRATE) == true) {
        status = "endangered";
    } else {
        status = "not endangered";
    }
}

根据评论:

以下是我尝试过的,但它会导致以下错误

PrintStream类型中的print(布尔)方法不适用于参数(void)

在这条主线上:

        Species O5 = O1;
    System.out.print(O5.changeSpeciesName("Gorilla beringei"));

方法如下:

    public void changeSpeciesName(String newSpeciesName) {
    speciesName = newSpeciesName;
}

共有1个答案

施飞昂
2023-03-14

构造函数的全部要点是初始化实例,这需要设置字段——所以你会认为构造函数是一个变异子,对吗?这有点技术性,但是一个变种人会专门改变现有实例上字段的值,而构造函数会创建该实例。很多时候,构造函数确实“变异”了它正在创建的实例——但它是一个构造函数,而不是变异器。

另一方面,Mutators是专门用来更改实例属性的方法。例如:

public void setName(String name) {
    this.name = name;
}

我不知道你的任务是什么,但我有一种感觉,你被告知要编写mutator方法,然后在构造函数中调用它们。例如

speciesName = "Balaenoptera musculus";
speciesName = name;
speciesName = species.getSpeciesName();

你应该这么做

setName("Balaenoptera musculus");
setName(name);
setName(species.getSpeciesName());

基本上,与其让构造函数自己更改变量,不如调用类的mutator来更改变量。

人们会告诉你这样做的一般原因是出于对“如果我们改变名称的设置方式会怎么样”这样的问题的担忧这样,如果有什么改变,我们只需要在一个地方改变它:mutator函数setName()。否则,我们将不得不更改每个构造函数,这是两个额外的更改——我们可能会忘记其中一个,这将创建一个bug。

但是,在构造函数中使用方法调用时,请确保所调用的方法不能被派生类重写。这可能会导致不期望的行为,因为代码可能会使用部分初始化的对象。结果错误很难找到,因为代码看起来不错,但并没有达到预期的效果。

通过在方法声明中使用final,可以避免此类问题

public final void setName(String name) {
    this.name = name;
}

或者通过避免构造函数中的方法调用。

 类似资料:
  • 问题内容: 我有两个可以很好地编译的构造函数,但是我希望Java抱怨歧义的可能性。 是什么赋予了? 问题答案: Java允许这些方法存在,因为它有关于如果两种方法都适用将被调用的规则。具体来说,将选择固定arity方法(不带),而不是可变arity方法(带)。 的JLS,第15.12.2,确定这是选择方法时指出以下: 第一阶段(第15.12.2.2节)执行重载解析,不允许装箱或拆箱转换,也不允许使

  • JavaScript 中的构造函数和其它语言中的构造函数是不同的。 通过 new 关键字方式调用的函数都被认为是构造函数。 在构造函数内部 - 也就是被调用的函数内 - this 指向新创建的对象 Object。 这个新创建的对象的 prototype 被指向到构造函数的 prototype。 如果被调用的函数没有显式的 return 表达式,则隐式的会返回 this 对象 - 也就是新创建的对象

  • 如果我决定使用一个非线程安全的集合并同步它的访问,我是否需要同步构造函数中的任何突变?例如,在下面的代码中,我知道对列表的引用在构造后对所有线程都是可见的,因为它是最终的。但我不知道这是否构成安全发布,因为构造函数中的add没有同步,而且它正在ArrayList的elementData数组中添加一个引用,这是非最终的。

  • 问题内容: 我在一个Activity中有一个IntentService,当我尝试调用该服务时,它将引发此错误,我发现这很奇怪,因为如果我声明了空的构造函数。 错误: AndroidManifest.xml 活动: 问题答案: 你是一个内部阶级。如果要将其保留在内部,请将其更改为static: 您可能需要阅读不同类型的嵌套类。google的第一个链接:http : //docs.oracle.com

  • 本文向大家介绍请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?相关面试题,主要包含被问及请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA构造函数 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一

  • 主要内容:默认拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是 。 对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。 在 C++ 中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对