Java 重载相同参数的构造函数
假设我的类有两个字段:x和y,类型为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;
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
。