Почему я не могу назначить родительский класс переменной типа подкласса?

Почему ссылочная переменная дочернего класса не может указывать на объект родителя? т.е.

Child obj = new Parent();

Однако мы можем сделать наоборот. Пожалуйста, ответ с представлением памяти (куча)

2 ответа

Нет причины, которая имеет отношение к памяти. Это намного проще. Подкласс может расширить поведение своего суперкласса, добавив новые методы. Пока не дано, что у суперкласса есть все методы его подклассов. Возьмите следующий пример:

public class Parent {
    public void parentMethod() {}
}

public class Child extends Parent {
    public void childMethod() {}
}

Теперь давайте подумаем о том, что произойдет, если вы могли бы назначить экземпляр Parent к переменной типа Child,

Child c = new Parent(); //compiler error

поскольку c имеет тип Childразрешено вызывать метод childMethod(), Но так как это действительно Parent Экземпляр, который не имеет этого метода, может вызвать проблемы компилятора или времени выполнения (в зависимости от того, когда проверка выполнена).

Обратный путь - не проблема, так как вы не можете удалить методы путем расширения класса.

Parent p = new Child(); //allowed

Child это подкласс Parent и, таким образом, наследует parentMethod(), Таким образом, вы можете вызвать этот метод безопасно.

Ответ слишком запоздал.

Я считаю, что мы можем объяснить это с точки зрения памяти. Может быть, я ошибаюсь, но это то, что я думаю об этом сценарии.

      // Assume, Required 2KB for execution
public class Parent {
    public void display(){      
        System.out.println("From Parent");
    }
}

// Total memory required for execution : 4bk
public class Child extends Parent {
    @Override
    public void display() {     
        super.display(); // 2KB
    }
    
    public void sayHello() {     
        System.out.println("From Child - Hello"); // 2KB
    }
}



   //2KB expect    //4KB assigned
     Parent parent = new Child();
        
   //4KB expect    //Only 2KB is assigning
     Child child = new Parent();

Здесь переменная класса CHILD ожидает 4 КБ памяти, но мы пытаемся назначить ей объекты класса 2 КБ «Родительский». Таким образом, компилятор выдает исключение.

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