2014-11-02 4 views
4

По какой-то причине, следующий код не будет работать при попытке создать объект из различных подклассов на основе результата Условный другое заявление:Как создать/создать экземпляр объекта из инструкции if-else?

if (option == 1) { 

    UndergradTA student = new UndergradTA(); 
    student.setIsUnderGrad(true); 

} else if (option == 2) { 

    GradTA student = new GradTA(); 
    student.setIsGrad(true); 
} 

Когда я затем попытаться использовать методы на «студента «класс позже в основном методе он мне не позволит, говоря:« Студент не может быть разрешен ».

+2

чтения: [Variable Scope] (http://www.java-made-easy.com/variable-scope.html) – Reimeus

ответ

5

изменить код, чтобы:

UndergradTA student = null; 
GradTA stud = null; 

if (option == 1) { 

    student = new UndergradTA(); 
    student.setIsUnderGrad(true); 

} else if (option == 2) { 

    stud = new GradTA(); 
    stud.setIsGrad(true); 
} 
+0

Хорошо, но теперь предположим, что хочу называть объекты в кучу методов, и я хочу сделать то же самое для любого объекта, который создается, мне нужно вызвать методы для студентов UndergradTA и GradTA stud отдельно? – Test

+0

if (student! = Null) {student.callyourmethods()} if (stud! = Null) {stud.callyourmethods()} – AsSiDe

2

student переменная объявляется в пределах if/else, а не снаружи, поэтому вы не можете использовать ее за пределами этих блоков кода.

Если UndergradTA и GradTA имеют общий суперкласс или интерфейс, а затем объявить переменную вне и использовать его соответствующим образом:

Student student = null; 
if (option==1) { 
    student = new UndergradTA(); 
    //cumbersome 
    student.setIsUnderGrad(true); 
} else if(option==2) { 
    student = new GradTA(); 
    //cumbersome 
    student.setIsGrad(true); 
} 
student.someMEthod(...); 
+0

Заменил бы оператор if-else оператором switch исправить это или все еще будет только в области действия оператора switch? – Test

+0

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

+2

@RameenRastan Второй. Кроме того, зачем вам явно устанавливать булевский флаг, когда тип объекта должен быть достаточным, чтобы определить, является ли «Студент» undergrad или gradta? –