Как здесь реализовано наследование?

#java

#java

Вопрос:

Это простой Java-код:

 public class JTest {
    public static void main(String []args) {
        Integer a = new Integer(2);
        Object b = a;
        System.out.print("r = "   b);
    }
}
  

Все объекты имеют родительский объект на Java.
Когда вы запустите эту программу, вы получите:
r = 2
Почему?
Если я сделаю то же самое с этим кодом:

 public class JTest {
    public static void main(String []args) {
        A a = new A();

        Object b = a;
        System.out.print("r = "   b);
    }
}
  

Где находится класс A:

 public class A {
    int a;
}
  

Результатом будет:
r = test.A@9304b1

Ответ №1:

Integer.toString() возвращает строку, содержащую значение целого числа.

Ваш класс не реализует свой собственный toString() , поэтому он использует реализацию по умолчанию Object.toString() , которая возвращает комбинацию класса объекта и его хэш-кода.

Ответ №2:

это вызовет toString() метод объекта, для которого был вызван метод. если его класс объектов не реализован, он предоставляет его по умолчанию.

Попробуйте переопределить его таким образом и проверьте результат

 public class A {
    int a;
    @Override 
    public Sring toString(){
         return "A has property a = " this.a;
    }
}
  

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

1. @Jigar Joshi Спасибо за ваш ответ, но возник еще один вопрос. В первом примере кода, как ссылка на Object, b , могла найти метод «toString» для своего целого числа-наследника? Я думаю, что существует собственная реализация метода «toString». Но, будучи ссылкой на объект, как он может определить, что вместо этого будет использоваться другой метод «toString»?

2. @maximus, я думаю, мне не совсем понятно, о чем вы спросили в этом комментарии, но я бы попробовал: метод будет выполнен на объекте .

3. @Jigar Joshi позвольте мне спросить по-другому. извините за это. В этой строке: System.out.print(«r = » b); должен быть вызван метод Integer.toString: a.toString(), верно? Но у нас там есть b. Который объявлен как: Object b = a; b — это ссылка на объект, у объекта есть свой собственный метод toString(). Я не могу понять, почему вызывается метод toString() a (Integer)?

4. Это потому, что вызывается метод object is of Integer object .

5. позвольте мне привести другой пример, class Fruit{ public void taste(){SOP("sweet");} class Grape extends Fruit{ public void taste(){SOP("sour");} теперь в main Fruit f = new Grape(); and if you invoke f.taste(); ` он вызовет версию Grape , поскольку у нас есть ссылка Fruit на объект grape. и Fruit содержит метод taste() и Grape является Fruit

Ответ №3:

В первом экземпляре b содержится экземпляр Integer , поэтому при печати вызывается toString() реализация Integer .

Во втором случае b содержится экземпляр A , поэтому вызывается toString() реализация A . Предположительно, A не переопределяет toString() , поэтому вы получаете реализацию по умолчанию из Object (package.Класс@hash).

РЕДАКТИРОВАТЬ (Поскольку вопрос изменился):

Класс A содержит только int поле, оно не расширяется int . Если вы измените A на переопределение toString (вы не можете расширять примитивные типы, подобные int ), вы можете получить то, что хотите:

 class A {
    Integer a;

    public A(int i) {
        a = i;
    }

    @Override
    public String toString() {
        return a.toString();
    }
}
  

Ответ №4:

Когда вы это сделаете, System.out.print("r = " b); Java вызовет b.toString() . Метод toString унаследован от Object . В первом случае класс Integer переопределяет toString возвращаемое целочисленное значение. В вашем A классе нет ovverride toString() , поэтому вы получаете только значение по умолчанию (класс объекта и хэш-код)

Ответ №5:

В качестве отступления, если вы хотите получить java.lang.Вывод в стиле объекта для типа, который переопределил toString(), вы можете использовать код, подобный этому:

 public static String toString(Object o) {
  if (o == null) return null;
  return o.getClass().getName()   "@"   Integer.toHexString(System.identityHashCode(o));
}
  

Ответ №6:

В первом экземпляре объект имеет метод toString, поэтому будет напечатано фактическое значение. Однако без метода toString, подобного вашей второй реализации, вы получаете что-то вроде идентификатора класса / объекта

Ответ №7:

В вашем первом случае класс Integer имеет метод ‘toString’, который при объединении с «r» b выдаст вам текстовое представление ‘a’, которое будет равно 2