2012-07-02 3 views
2

Я проводил исследование, в котором я обнаружил следующее:Что касается конструкторов в Java

Давайте предположим, что у меня есть класс, как показано ниже, со следующими конструкторами:

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; 
    } 
} 

Это дает мне ошибка времени компиляции. Но если я изменю height от String до 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; 
    } 
} 

Теперь вопрос: Предположим, я хочу String в height как в моем первом случае; почему он терпел неудачу? Пожалуйста, объясни.

+0

может я спросить, какой IDE вы используете? –

+0

Вы всегда должны проектировать свой функциональный класс - так почему же высоту String? –

+0

Кстати, вам не нужно вводить вызовы в 'super()', Java автоматически сделает этот вызов, если вы не укажете какой-либо другой вызов конструктора. – Keppil

ответ

9

Вы не можете перегрузить конструктор, имеющий ту же сигнатуру

Почему?

Хотя решения метод/конструктор для вызова виртуальной машины Java нужно что-то однозначно идентифицирующий метод (тип возвращаемого значения не хватает), поэтому параметр конструктору/метод не должен быть таким же


См

+3

Это связано с тем, что когда вы вызываете новый треугольник («yourStringHere»), в вашем первом коде java не имеет способа узнать, какой конструктор использовать. –

8

вы должн два конструктора с одинаковыми аргументами. Они оба берут одну строку в качестве аргумента.

Если я звоню Triangle tri = new Triangle("blah"); Невозможно определить, должна ли «бла» быть высотой или типом. Вы можете сказать, посмотрев на него, но JVM не может. Каждый конструктор должен иметь уникальные аргументы.

+0

@Robers благодарит человека за идеальное объяснение – user1493927

1

Причина ошибки компиляции в первом случае заключается в том, что когда вы инициализируете объект класса Triangle путем передачи строкового параметра, как компилятор узнает, какой конструктор должен вызывать; тот, который инициализирует тип или тот, который инициализирует высоту. Это двусмысленный код для компилятора, и, следовательно, он вызывает ошибку. Так же, как если бы я сказал;

Triangle t = new Triangle("xyz"); 

Никто не может определить, какая переменная будет инициализирована; типа или высоты.

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 
    } 
} 

Тогда, если вы сделали то же самое для Типа, вы можете иметь два конструктора:

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

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

Также Введите звучит, как это может быть enum

1

Или вы можете добавить sta тики фабрика для вашего класса

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); 
} 

}

Смежные вопросы