У меня есть что-то непонятное относительно ссылки на ссылочную переменную в Java.Значение ссылочной переменной в Java
У меня есть два класса A и B. А супер класс B. Если у меня есть два объекта, а затем оператор печати:
A a = new A(); //superclass
B b = new B(); //subclass
System.out.println ((A)b);
то, что именно происходит, когда Println метод выполняется?
Я знаю, потому что B является подклассом А, я позволил сделать следующий бросок:
A a2 = (A)b;
Я также знаю, что когда Println принимает ссылочную переменную в качестве аргумента, то ToString() метод класса, который создал объект-аргумент, вызывается (неявно). Это так, потому что метод println() ищет аргумент типа String, а метод toString() представляет объект как строку. И даже если мы не будем писать toString(), метод вызывается - неявно. Таким образом, следующие два утверждения эквивалентны:
System.out.println (b);
System.out.println (b.toString());
Итак, мой вопрос: что неявное действие, предпринятое, когда мы имеем
System.out.println ((A)b);
?
Я полагаю, что тип ссылки переменной Ь автоматически изменяется от В к А. переменная должна еще быть, указывая на тот же объект - тот, созданный с
B b = new B();
но только типа б теперь будет изменено. Это верно? Другой вопрос: хотя я изменил тип b на тип суперкласса, являются ли методы переопределения в подклассе, который будет вызван, а не в суперклассе?
Большое спасибо.
С уважением
toString() не вызывается, если аргумент передан как String. В других случаях да. –
«System.out.println (XXX) принимает параметр строки типа« .... .Это утверждение неверно. Возможно, вам придется перефразировать его, чтобы сделать его правильным. –
Как отмечает Vinegar, System.out.println (XXX) в этом случае принимает параметр типа Object, который он затем внутренне вызывает toString on, перед передачей результата методу println (String). –