что произойдет, если объект подкласса приведен к суперклассу

1
class Base {
    void test() {
        System.out.println("base");
    }
}

public class Derived extends Base {
    void test() {
        System.out.println("derived");
    }

    public static void main(String args[]) {
        Derived d = new Derived();
        Base b = (Base) d;
        b.test();
    }
}

o/p: полученный

Зачем? Если я передам объект подкласса объекту суперкласса суперкласса, объект будет ссылаться только на объект подкласса?

Теги:
inheritance

4 ответа

5
Лучший ответ

Кастинг вообще не изменяет объект. Результат - это просто ссылка на тот же объект, но с другим типом времени компиляции. Приведение к супертипу не может потерпеть неудачу, оно может иметь значение только для типа времени компиляции, которое иногда может быть полезно для разрешения перегрузки.

Точно так же кастинг от выражения типа суперкласса к типу подкласса никогда не создаст новый объект - он просто проверяет, является ли актер действительным, а результат является ссылкой на тот же объект, что и раньше, но в выражении с типом подкласса. Это полезно чаще, чем приведение к суперклассу, поскольку оно дает вам доступ к большему количеству участников (обычно). Например:

String text1 = "hello";
System.out.println(text1.length());

Object object = (Object) text1; // Or just Object object = text1;
// object.length() would be invalid...

String text2 = (String) object;
// text2.length() is valid again
System.out.println(text2.length());

Значения text1, object и text2 все одинаковы: ссылка на единственный строковый объект, который используется во всем примере.

  • 0
    Спасибо, получил Джон Скит
1

Производный объект также является базовым объектом, когда вы его применяете, вы меняете только "представление". Я имею в виду: вы можете использовать каждый метод Base, но не Derived, потому что вы видите его как базовый объект, а не как производный объект. Когда вы вызываете метод, присвоенный базе, будет называться его методом, но это производный объект, а не базовый объект (в памяти он всегда является производным объектом), поэтому он увидит его метод.

Итак: в памяти у вас всегда будет объект Derived, вы просто увидите его как базовый объект, и вы ограничены базовыми методами (вы не можете использовать Derived-методы)

0

Тогда вы можете получить доступ только к методам суперкласса, а аналогичные методы (определенные в обоих) будут переопределены с помощью одного в подклассе.

0

Кастинг объекта не изменяет характер объекта. Вы пытались посмотреть этот пост? Вы можете найти ответы на свои вопросы.

О внесении подкласса в суперкласс в JAVA

Ещё вопросы

Сообщество Overcoder
Наверх
Меню