2014-10-28 4 views
0

Мне было интересно, можно ли вызывать несколько конструкторов и инициализировать через них один объект. Я искал ответ на этот вопрос, но я его не нашел; позвольте мне показать вам код, и спасибо за вашу помощь заранее:Несколько конструкторов, инициализирующих один объект

int MAX_VALUE; // Field variable 
    boolean[] elements = new boolean[10000]; // Field variable 

    public IntegerSet(int maxValue) { 
     this.MAX_VALUE = maxValue; 
    } 
    public IntegerSet(boolean[] tmp) { 
     int i = 0; 

     for(i = 0; i < tmp.length; ++i) 
      this.elements[i] = tmp[i]; 

     this.elements = Arrays.copyOf(this.elements, tmp.length); 
    } 

/*In main:*/ 

    // I just want to have one object, s1, and I want to be able 
    // to access MAX_VALUE and elements by s1.MAX_VALUE and s1.elements 
    IntegerSet s1 = new IntegerSet(50); 
    /* SOMETHING that uses second constructor with object s1*/ 
+1

Вы можете вызвать конструктор из другого конструктора по телефону 'this (args)' – Kon

+0

Почему бы не использовать сеттер? – aa333

+0

Да, но если я вызываю конструктор2 из конструктора 1, то мне нужно, чтобы аргументы конструктора были переданы как аргументы конструктору1. И я не хочу этого делать. –

ответ

2

Вы не можете назвать несколько конструкторов, чтобы создать один экземпляр класса. Каждый вызов создавал бы новый экземпляр, который будет совершенно иным, чем другой. Для того, чтобы установить как int поле и массив с помощью конструктора, значения должны быть переданы в самом конструкторе:

public IntegerSet(boolean[] tmp, int maxValue) { 
    this.MAX_VALUE = maxValue; 
    int i = 0; 

    for(i = 0; i < tmp.length; ++i) 
     this.elements[i] = tmp[i]; 

    this.elements = Arrays.copyOf(this.elements, tmp.length); 
} 

Это эквивалентно

public IntegerSet(boolean[] tmp, int maxValue) { 
    this(maxValue); // will call the constructor that takes one parameter 
    int i = 0; 

    for(i = 0; i < tmp.length; ++i) 
     this.elements[i] = tmp[i]; 

    this.elements = Arrays.copyOf(this.elements, tmp.length); 
} 
+0

Да, я полностью согласен, так я бы это сделал, хотя четко указано, что я должен использовать 2 конструктора, а не 1. –

+0

@Sandkar. Единственный способ использовать два конструктора в вашем классе для создания одного экземпляра - это иметь один конструктор вызывает другой. Но все же вам понадобится два параметра для первого конструктора. – manouti