#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");}
теперь в mainFruit 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