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