Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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 - Fatal编程技术网

Java 构造器是变异子吗?

Java 构造器是变异子吗?,java,Java,我有一个任务,我需要添加2个构造函数,并从中分离出来,还列出了变异子。然而,我认为大多数构造函数都是变异的:从这里可以看出。所以我很困惑,对于mutator方法,我需要做什么?我目前为施工人员提供以下服务: //Constructors public Species() { speciesName = "Balaenoptera musculus"; population = 15000; growthRATE = -0.12; if (endangered(gr

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

//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(boolean)不适用于参数 (无效)

主要在这一行:

        Species O5 = O1;
    System.out.print(O5.changeSpeciesName("Gorilla beringei"));
方法如下所示:

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

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

另一方面,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;
}

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

不。构造函数不是一个变异子。那么,变异子的例子是什么呢?因为我在我链接的帖子中找到的唯一类似的例子是一个构造函数@ElliottFrischYou链接到了另一篇帖子,但你真的阅读了接受的答案吗?可能重复的变体会改变现有对象,构造函数会初始化新对象。我在问题中添加了信息您收到的新错误是因为您试图打印一个
void
。请记住,您将
changeSpeciesName()
定义为
void
,这意味着它不会返回任何内容。然后,您正在调用
print(changeSpeciesName(…)
;print函数正在查找要打印的内容-从
chanceSpeciesName()
返回的内容-但是没有返回任何内容,因此没有要打印的内容。这就是错误所在。@ModusTollens这是一个很好的观点。我认为我对这个主题的了解不够详细,无法很好地阐明这一点——你介意建议对我的答案进行编辑吗?@GreenCoveGuy欣然:)。我添加了一些文字,但请仔细看一下,因为英语不是我的第一语言,我对它不是很有信心!