关于Java中的构造函数

时间:2012-07-02 14:11:43

标签: java constructor

我正在做研究,其中我发现了以下内容:

假设我有一个类如下所示的类,具有以下构造函数:

public class Triangle implements Shape {

    public String  type;
    public String height;

    public Triangle(String type) {
        super();
        this.type = type;
    }

    public Triangle(String height) {
        super();
        this.height = height;
    }

    public Triangle(String type, String height) {
        super();
        this.type = type;
        this.height = height;
    }
}

这给了我一个编译时错误。但是,如果我将heightString更改为int,一切正常。以下是更改的代码:

public class Triangle implements Shape {

    public String  type;
    public int height;

    public Triangle(String type) {
        super();
        this.type = type;
    }

    public Triangle(int height) {
        super();
        this.height = height;
    }

    public Triangle(String type, int height) {
        super();
        this.type = type;
        this.height = height;
    }
}

现在问题是:假设我希望Stringheight,就像我的第一个案例一样;为什么失败了?请解释一下。

5 个答案:

答案 0 :(得分:9)

不允许重载具有相同签名的构造函数

<强>为什么吗

虽然解析方法/构造函数来调用JVM需要一些唯一标识方法的东西(返回类型不够),所以构造函数/方法的参数不能相同


查看

答案 1 :(得分:9)

您有两个具有相同参数的构造函数。他们都把一个String作为参数。

如果我打电话Triangle tri = new Triangle("blah");无法判断“blah”是高度还是类型。您可以通过查看来判断,但JVM不能。每个构造函数都必须有唯一的参数。

答案 2 :(得分:1)

第一种情况下编译错误的原因是,当你通过传递字符串参数初始化类Triangle的对象时,编译器如何知道要调用哪个构造函数;初始化类型的那个或初始化高度的那个。 这是编译器的模糊代码,因此会抛出错误。 就像我说的那样;

Triangle t = new Triangle("xyz");

没有人能分辨出哪个变量会被初始化;类型或高度。

答案 3 :(得分:1)

或者您可以为您的班级添加静态工厂

public class Triangle implements Shape {

...

private Triangle(int height) {
  // initialize here
}

private Triangle(String type) {
  // initialize here
}

private Triangle(String type, int height) {
  // initialize here
}

public static createByHeight(String height) {
  return Triangle(Integer.parseInt(height);
}

public static createByType(String type) {
  return Triangle(type);
}

public static createByTypeAndHeight(String type, String height) {
  return Triangle(type, Integer.parseInt(height);
}

}

答案 4 :(得分:0)

如果您想为构造函数使用两个字符串,则可以将字符串转换为Value对象。

http://c2.com/cgi/wiki?ValueObject

例如:

class Height {
   private String height;

   public Height(String height){
       this.height = height;
   }

   public String value(){
       return this.height;
   } 

   @Override
   public String toString(){
      return height;
   }

   @Override
   public boolean equals(Object other){
        return this.height.equals((Height)other).value()); // Let your IDE create this method, this is just an example
       // For example I have missed any null checks
   }
}

然后,如果你对Type做了同样的事情,你可以有两个构造函数:

public Triangle(Type type) {
    this.type = type;
}

public Triangle(Height height) {
    this.height = height;
}

同样类型听起来好像是enum