2016-02-18 3 views
0

Предполагая, что у меня есть эти два класса, в отдельных файлах:Понимание Java компилятор

public class Text 
{ 
    public String _word; 

    public Text(String w) 
    { 
     _word = w; 
    } 

    public String getWord() 
    { 
     return _word; 
    } 

    public boolean equals (Text other) 
    { 
     return ((other!=null)&&(_word.equals(other._word))); 

    } 
    public boolean test (Text other) 
    { 
     return 1==1; 

    } 
} 

второго класса:

public class Sentence 
{ 
    public String _word; 

    public Sentence(String w) 
    { 
     _word = w; 
    } 

    public String getWord() 
    { 
     return _word; 
    } 

    public boolean equals (Object other) 
    { 
     return ((other!=null) && (other instanceof Sentence) 
       && (_word.equals(((Sentence) other)._word))); 
    } 
} 

И следующие основные:

public static void main(String[]args){ 

    Text y1 = new Text("abc"); 
    Sentence z1 = new Sentence ("abc"); 
    ** 
} 

Скажем, я бегу следующая команда, где **:

System.out.println (y1.equals(z1)); 

Все в порядке, и оно выводит «ложь».

Но, если я запускаю эту команду:

System.out.println (y1.test(z1)); 

Компилятор орет «Приговор не может быть преобразован в текст».

Два вопроса:

  1. Почему это работает на равных, но не для теста? y1 - это текст, поэтому вызов y1.equlas() вызывает equlas() внутри текста, и там он получает только текст как параметр.
  2. Если это работает, почему вывод ложный? оба «_word» установлены на «abc».

Спасибо!

+0

Поместите эту строку в свой метод 'Word.equals'' System.out.println («Word equals called»); 'и затем запустите тест. Посмотрите, что произойдет. –

ответ

3

Вы определили метод equals(Text) в Text. Однако он не отменяет существующий метод equals(Object), который он наследует от Object. Из-за этого ваш метод equals(Text) перегружает метод equals(Object) в Object. Следовательно, вы можете позвонить y1.equals(z1). Потому что z1 является Sentence, метод equals(Object) - это тот, который называется. Объект Sentence соответствует Object, но не Text. equals method in Object сравнивает ссылки на объекты, чтобы увидеть, идентичны ли они.

equals метод класса Object реализует наиболее разборчивого возможное отношение эквивалентности на объектах; то есть для любых непустых опорных значений x и y этот метод возвращает true тогда и только тогда, когда x и y относятся к одному и тому же объекту (x == y имеет значение true).

Это не так, поэтому он возвращает false.

Вы определили метод test(Text) в Text. Других перегрузок нет, и Sentence не совпадает с Text, поэтому компилятор жалуется.

Кстати, equals(Object) метод вы определили в Sentence является правильное переопределение equals, проверяя null и класс аргумента.

0

Я думаю, что в тексте.java вы хотели переопределить Object.equals(Object other), но вместо переопределения вы создали другой метод с тем же именем (equals(Text other)), но с другим типом параметра.

Именно поэтому System.out.println (y1.equals(z1)); компилирует: это равно совпадению с подписями equals(Object), какой метод Текст наследует от Object.

С другой стороны, System.out.println (y1.test(z1)); не удается скомпилировать, поскольку Text имеет только один метод с именем test, а его формальный тип параметра Text, который не соответствует типу фактического параметра (Sentence).

2

Согласно определению Object класса, вы унаследовали это во всех классах

общественных булевы равно (объект Object)

В вашем случае y1.equals(z1) фактически выполняется как y1.equals((Object) z1), действительный бросок, так как все объекты наследуют Object. Затем вы вызываете вышеупомянутый метод.

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