Дочерний класс как возвращаемый тип родительского класса

#java

#java

Вопрос:

В Test классе Object используется с show методом. Если мы напишем Object с show помощью метода xyz class , это будет неправильно. Меня смущает, что Object является родительским классом всех классов. Может ли он использоваться где угодно.

 class Test{
        Object show(){
        System.out.println("1");
        }
    }
    class xyz extends Test{
        String show(){
        System.out.println("2");
        }
    }
  

Если я напишу приведенный выше код как

 class Test{
        String show(){
        System.out.println("1");
        }
    }
    class xyz extends Test{
        Object show(){
        System.out.println("2");
        }
    }
  

Если объект содержит все классы или объект является parent классом всех классов, так имеет ли значение, где мы его используем?

Комментарии:

1. Я новичок в Java, пожалуйста, дайте мне примеры.

2. Этот код не будет компилироваться.

3. Мой главный вопрос заключается в том, почему в классе xyz используется строка

4. Я знаю, что Object является родительским классом всего класса, но в классе xyz почему другие типы данных не используются

Ответ №1:

Начиная с Java 5, переопределение метода допускает одновременные типы возвращаемых значений, что означает, что переопределенный метод подкласса может возвращать тип, который является более конкретным, но все же присваивается типу возвращаемого родительского метода.

В этом случае, поскольку родительский метод возвращает Object дочерний метод, он может фактически возвращать a String , который является подклассом Object и может быть назначен ему.

Из спецификаций JLS:

Возвращаемые типы могут различаться среди методов, которые переопределяют друг друга, если возвращаемые типы являются ссылочными типами. Понятие заменяемости возвращаемого типа поддерживает ковариантные возвраты, то есть специализацию возвращаемого типа на подтипе.

Если вы попробуете это с CharSequence помощью метода родительского класса и скажете Integer в методе дочернего класса, он не будет компилироваться:

 class Test{
    CharSequence show(){
        System.out.println("1");
        return null;
    }
}
class xyz extends Test{
    Integer show(){  //won't compile
        System.out.println("2");
        return null;
    }
}
  

Но замена Integer на String него будет компилироваться как String implements / является типом CharSequence :

 class Test{
    CharSequence show(){
        System.out.println("1");
        return null;
    }
}
class xyz extends Test{
    String show(){
        System.out.println("2");
        return null;
    }
}