关键字'this'带括号,用于接收Java中的参数'this(param1,param2)'。它可以用于制定者吗?

时间:2018-06-11 10:38:19

标签: java constructor this setter

Java允许将this.classVar = parameter; this.classVar2 = parameter2;表达式汇总到this(parameter, parameter2)。至少用在构造函数中。 但是当我从前一种方式(在代码中注释)改为后者在setter中时,这段代码不起作用:

class Client {
    String nombre, apellidos, residencia;
    double comision;
    void setClient(String nombre, String apellidos, String residencia, double comision){
        this(nombre, apellidos, residencia, comision);
        //this.nombre = nombre;
        //this.apellidos = apellidos;
        //this.residencia = residencia;
        //this.comision = comision; 
    }
}

错误说:

"call to this must be first statement in the constructor. 

Constructor in class Client cannot be applied to given types.

required: no arguments
<p>found: String, String, String, double
<p>reason: actual and formal argument list differ in length" (I haven't created one, just left the default). 

那么,这种使用'this'的方式只对构造函数有效,因此不适合setter吗?是否需要显式编码构造函数(如果是,为什么?)?

3 个答案:

答案 0 :(得分:3)

  

Java允许将this.classVar = parameter; this.classVar2 = parameter2;表达式汇总到this(parameter, parameter2)

不,它没有。您仍然需要在某处编码this.classVar = parameter; this.classVar2 = parameter2;。所有this(parameter, parameter2)都会调用构造函数(如果要将这些参数写入这些字段,则必须在其中包含this.classVar = parameter; this.classVar2 = parameter2;代码。)

您无法从setter调用构造函数。您只能从构造函数中调用构造函数。它用于在单个构造函数中合并逻辑,即使您有多个参数不同,例如:

public MyContainer(int size) {
    this.size = size;
}
public MyContainer() {
    this(16);
}

在那里,MyContainer构造函数的零参数版本调用单参数版本,并为16参数传递size

答案 1 :(得分:2)

<style> @import './static/css/style.css'; </style> 没有“总结”任何内容。

这只是一种从构造函数中调用类中另一个构造函数的方法。

没有办法“总结”任何事情

答案 2 :(得分:1)

this(/* zero or more args */);

这是一个构造函数调用。您可以在一个构造函数中使用它来引用另一个构造函数(缺少更好的名称,&#39; constructor chaining&#39;)。

你不能用普通方法做同样的事情。如果要在普通方法中创建对象,则使用与您使用该类的外部用户相同的语法:

new MyClass(/* args */);

从您的代码中看,这似乎不是您想采取的方法。