Java,如何检查使用哪个构造函数?

时间:2015-01-26 06:29:22

标签: java constructor

我不太确定我所描述的事物的名称是否称为构造函数?但是,我想要做的是查看用于创建对象的构造函数。

Class Classname{

  private int a, b, c;

  public Classname(int a, int b){
     this.a = a;
     this.b = b;
  }

  public Classname(int a, int b, int c){
     this.a = a;
     this.b = b;
     this.c = c;
  }
}

如果我们创建对象:

Classname testobject = new Classname(1, 2);

我需要的是因为我需要获取对象中的可变数量以及这些变量的值。我们说以下是:

classname[] multiple = new classname[10]

那有" classname" - 来自两个构造函数的对象,我需要将这些对象写入字符串,所以我认为我必须以某种方式获得正确的构造函数,如果它是第一个

public static String getStringform(Classname classname){
String stringform;
if(constructor == 1)
  stringform = String.valueOf(classname.a) +String.valueOf(classname.b);
else
  stringform = String.valueOf(classname.a) +String.valueOf(classname.b) +String.valueOf(classname.c);
}

编辑:正如评论中所建议的那样,我制作了这样的新构造函数:

private int type;
private int a, b;

public Classname(int a, int b){
  this.type = 1;
  this.a = a;
  this.b = b;
}

但即使是那种构造函数,当我试图获得"类型"在另一个班级制作的物品,我没有得到正确的类型..?使用followin时我得到 java.lang.NullPointerException

public static String toString(Classname object){
if(object.type == 1) //<-- There's the exception

5 个答案:

答案 0 :(得分:1)

只需在每个构造函数中添加打印消息或使用调试器

答案 1 :(得分:1)

您可以添加&#34;标记&#34;到您的班级(或使用Integer并检查c无效):

class Classname{

  private int constructor; // the flag
  private int a, b, c;

  private Classname(int a, int b){
     this.constructor = 1;
     this.a = a;
     this.b = b;
  }

  private Classname(int a, int b, int c){
     this.constructor = 2;
     this.a = a;
     this.b = b;
     this.c = c;
  }
}

然后使用此标志:

public static String getStringform(Classname classname){
    String stringform;
    if(classname.constructor == 1) {
       stringform = "" + classname.a + classname.b;
    } else {
       stringform = "" + classname.a +classname.b +classname.c;
    }
    return stringForm;
}

注意:我在""中添加了getStringForm,大括号和return语句,但仍然存在 问题(访问私有成员,私有构造函数,...... )

答案 2 :(得分:0)

答案很简单,如果在给定的类中没有指定构造函数,则使用默认构造函数,即没有像private Classname(){...}这样的参数的构造函数,现在你有2个构造函数可以将它称为C1 private Classname(arg1, arg2){...}和C2为private Classname(arg1, arg2, arg3){...}因此,如果你创建的对象在创建对象时传递了2个整数,那么将使用C1,并且在传递3个整数时,C2将被调用。

在这里做一个注释,因为你已经创建了C1和C2所以默认构造函数不再适用于这个类。如果你想使用它也创建那个构造函数。

答案 3 :(得分:0)

您可能会遇到建模问题。

我只会有两个不同的类,这里是伪代码:

public class ClassWithTwoFields {
  public final Object field1;
  public final Object field2;

  public ClassWithTwoFields(final Object f1, final Object f2) {
    field1 = f1;
    field2 = f2;
  }

  public String getStringform() {
    return field1 + field2;
  }

}

public class ClassWithThreeFields extends ClassWithTwoFields {
  public final Object field3;

  public ClassWithThreeFields(final Object f1, final Object f2, final Object f3) {
    super(f1, f2);
    field3 = f3;
  }

  public String getStringform() {
    return field1 + field2 + field3;
  }
}

答案 4 :(得分:0)

使用当前类,每个成员字段将(在构造函数运行之前)初始化为0(int字段的默认值)。因此,如果构造函数未初始化c,则它将为零。

现在,这可能是c的有效值,可以传递到设置c的3参数构造函数中,因此您无法简单地检查c是否为c 0

您可以通过多种方式解决此问题。有意义的将取决于字段的实际含义。但实质上它归结为记录boolean是否已设置为有效值。

这可以简单到定义名为cIsValid的{​​{1}}字段,并在构造函数中设置true时将其设置为cfalse