构造函数重载相同的参数

时间:2014-07-01 19:58:44

标签: java constructor overloading

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

public class Test {

    private int x;
    private int y;

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

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

我正在尝试这样的事情,我知道因为超载规则而无法正常工作

3 个答案:

答案 0 :(得分:8)

不,你不能这样做。通常你会做类似的事情:

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);
}

你可能想要考虑那种模式(公共静态工厂方法反过来调用私有构造函数),即使你没有有重载问题 - 它也清楚地说明了你的价值意义是什么传递意味着。

答案 1 :(得分:2)

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

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);

答案 2 :(得分:0)

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

编译器查找" Test.Test(int)"无论参数的名称是什么。

语言需要添加额外的功能,例如命名参数,才能做到你想要的。

如果Java获得了类似C#的语法用于属性初始化,那么您将能够使用该惯用语,使用默认的no-args构造函数。

除了使用显式工厂方法的替代方法之外,您还可以为参数传入HashMap。

 public Test(HashMap<string,int> args) {
      if(args.containsKey("x"))
         x = args.get("x");
      if(args.containsKey("y"))
         y = args.get("y");
 }

但是大多数情况下静态工厂方法更清晰。如果您需要更多,您可能需要首先考虑为什么需要这样的习语,并修改您的课堂设计。