Java 重载相同参数的构造函数

Java 重载相同参数的构造函数,java,constructor,overloading,Java,Constructor,Overloading,假设我的类有两个字段:x和y,类型为double。是否可以定义2个构造函数,以便constructor1将创建对象,将其x属性设置为构造函数中的参数,将y设置为默认值,反之亦然 public class Test { private int x; private int y; public Test(int x) { this.x = x; } public Test(int y) { this.y = y;

假设我的类有两个字段:x和y,类型为
double
。是否可以定义2个构造函数,以便constructor1将创建对象,将其
x
属性设置为构造函数中的参数,将
y
设置为默认值,反之亦然

public class Test {

    private int x;
    private int y;

    public Test(int x) {
        this.x = x;
    }

    public Test(int y) {
        this.y = y;
    }
}

我正在尝试类似的东西,我知道它不会工作,因为重载规则不,你不能这样做。通常,您会执行以下操作:

private Test(int x, int y) {
    this.x = x;
    this.y = y;
}

public static Test fromX(int x) {
    return new Test(x, 0);
}

public static Test fromY(int y) {
    return new Test(0, y);
}

你可能想考虑这个模式(公共静态工厂方法,反过来称为私有构造函数),即使当你没有超载问题时,它也清楚你传递的值的含义是什么。

< P>不,你不能有两个具有相同签名的方法或构造函数。你能做的就是命名静态工厂

public class Test {

    private int x;
    private int y;

    private Test(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public static Test x(int x) { return new Test(x, 0); }
    public static Test y(int y) { return new Test(0, y); }
}

Test x1 = Test.x(1);
Test y2 = Test.y(2);

否,x和y具有相同的类型,因此两个构造函数都具有相同的类型签名,并且方法解析基于参数类型,而不是名称;编译器没有区分的方法

不管参数的名称是什么,编译器都会查找“Test.Test(int)”

该语言需要添加额外的功能,如命名参数,以完成您想要的操作

如果Java获得了类似于C#的语法来进行属性初始化,那么您就可以使用这种习惯用法,使用默认的无参数构造函数

除了使用显式工厂方法之外,您还可以为参数传入一个HashMap

 public Test(HashMap<string,int> args) {
      if(args.containsKey("x"))
         x = args.get("x");
      if(args.containsKey("y"))
         y = args.get("y");
 }
公共测试(HashMap参数){
if(参数containsKey(“x”))
x=参数获取(“x”);
如果(参数为“y”)
y=参数获取(“y”);
}

但是静态工厂方法在大多数情况下更干净。如果你需要更多,你可能需要考虑为什么你首先需要这样一个成语,并修改你的类设计。

你可以做到这一点,但是你需要一些第二个参数来区分重载。此时,您可能只需要设置两个参数
x
y