Присвоение подкласса классу и наоборот

У меня есть это упражнение:

public class TestClass{    
    public static void main(String args[]){       
        A[] a, a1;       
        B[] b;       
        a = new A[10]; 
        a1  = a;       
        b =  new B[20];       
        a = b;  // 1       
        b = (B[]) a;  // 2       
        b = (B[]) a1; // 3    
    } 
} 

class A { } 
class B extends A { } 

На мой взгляд, когда я пишу: a=b, я присваиваю объекту в b другую ссылку (a). На практике объект в b имеет две ссылки (a и b). Но для правила наследования подкласс также относится к типу суперкласса, но суперкласс не является также типом подкласса.

Как ссылка на суперкласс (а) может быть назначена типу подкласса (б)?
И это касается и последующего присвоения.

На мой взгляд, если бы я написал: b=a, то код компилировался бы без проблем, но для присваивания a=b должна быть ошибка компиляции.

Почему это задание правильное?

Вы не новичок - почему вы неправильно форматируете свой опубликованный код?

Hovercraft Full Of Eels 27.06.2019 16:58

Отформатировано для вас

Hovercraft Full Of Eels 27.06.2019 16:59
"In practice, the object in b has two references (a and b)" -- нет, это одна ссылка, содержащаяся в двух переменных
Hovercraft Full Of Eels 27.06.2019 17:00
b = (B[]) a1; // 3 это не удастся. Он скомпилируется, но выдаст исключение, поскольку вы пытаетесь преобразовать массив A в массив B.
Hovercraft Full Of Eels 27.06.2019 17:02
"How can a superclass reference (a) be assigned to a subclass type (b)?" -- этого не происходит, за исключением ошибочной строки кода.
Hovercraft Full Of Eels 27.06.2019 17:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предположим, что класс A — это класс Animal, а класс B — класс Dog. Вы можете создать животное, которое является собакой (a = b), потому что собаки — это животные (подкласс). Но это не работает наоборот (b = a), потому что животное может быть чем-то большим, чем собака, например кошка, поэтому вы не можете назначить кошку собакой. Итак, чтобы сделать это, вы должны были бы явно указать, что животное должно быть собакой (b = (собака) a).

посмотрите этот пример: Object []oo=new Object[1]; Строка []ss = новая строка [3]; оо=сс; //хорошо, потому что String тоже объект. сс=оо; // ошибка компиляции, потому что объект не является строкой

Sam 27.06.2019 17:21

ss = oo даст вам ошибку компиляции, потому что oo может быть не строковым объектом. Поэтому, если вы примените его: ss = (String []) oo, он скомпилируется нормально.

Mingxuan He 27.06.2019 17:26

Другие вопросы по теме