有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是一个构造函数还是一个变种人?

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

//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";
    }
}

根据评论:

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

The method print(boolean) in the type PrintStream is not applicable for the arguments (void)

在这条主线上:

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

方法如下:

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

共 (1) 个答案

  1. # 1 楼答案

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

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

    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来更改变量

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


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

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

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

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