Наследование Java - PullRequest
       6

Наследование Java

11 голосов
/ 17 августа 2010

Почему печатается последнее «Я - детский класс».?

public class Parent
{
    String parentString;
    public Parent()
    {
        System.out.println("Parent Constructor.");
    }

    public Parent(String myString)
    {
        parentString = myString;
        System.out.println(parentString);
    }

    public void print()
    {
       System.out.println("I'm a Parent Class.");
    }
} 

public class Child extends Parent
{
    public Child() {
        super("From Derived");
        System.out.println("Child Constructor.");
    }

    public void print()
    {
       super.print();
       System.out.println("I'm a Child Class.");
    }

    public static void main(String[] args)
    {
        Child child = new Child();
        child.print();
        ((Parent)child).print();
    }
}

Вывод:

From Derived

Child Constructor.

I'm a Parent Class.

I'm a Child Class.

I'm a Parent Class.

I'm a Child Class.

Ответы [ 5 ]

15 голосов
/ 18 августа 2010

Потому что это пример полиморфизма (позднее связывание). Во время компиляции вы указываете, что объект имеет тип Parent и поэтому может вызывать только методы, определенные в Parent. Но во время выполнения, когда происходит «связывание», метод вызывается для объекта, который имеет тип Child независимо от того, как на него ссылаются в коде.

Вас удивляет то, что метод переопределения должен вызываться во время выполнения. В Java (в отличие от C # и C ++) все методы virtual и, следовательно, вызывается метод переопределения. См. этот пример , чтобы понять разницу.

2 голосов
/ 18 августа 2010

Оба:

child.print();

и

((Parent)child).print();

Должен вернуться:

I'm a Parent Class.
I'm a Child Class.

В таком порядке.

Приведение объекта к его базовому классу не меняет, какой вызов метода будет сделан.

В этом случае даже после приведения вызывается дочерний метод печати, а не родительский.

0 голосов
/ 15 декабря 2012

в Java, если мы вызываем какой-либо метод для одного объекта, то он вызывает метод, используя суб большинство объекта ............... здесь:

Объект | | родитель | | Дочерний <- самый юный объект </p>

Дело 1 ::

Ребенок ребенок = новый ребенок ();

    child.print();

этот вызывающий метод дочернего класса print с использованием дочернего объекта ... так что печатает

Выход ::

Я Родительский класс. Я детский класс.

Объяснение: Из дочернего метода он вызывает родительский метод из-за super.print (); метод поэтому первая строка - это я родительский класс. после завершения родительского метода контроль выполнения возвращается к дочернему методу и печатает «Я - дочерний класс».

Дело 2 ::

    ((Parent)child).print();
if we call like this jvm calls print () method by using sub most object here sub most  object is child object so it prints 

output::
          I'm a Parent Class.
          I'm a Child Class.

Объяснение: Из дочернего метода он вызывает родительский метод из-за super.print (); метод поэтому первая строка - это я родительский класс. после завершения родительского метода управление выполнением возвращается к дочернему методу и печатает «Я - дочерний класс».

0 голосов
/ 18 августа 2010

Даже если вы приводите его как родительский класс, это не значит, что он будет использовать функции своего родителя - он будет рассматривать объект только как родительский..Распечатать();Вы говорите «Рассматривайте этот объект как родительский объект, а не дочерний объект».Не «Использовать реализации родительского метода»

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

0 голосов
/ 18 августа 2010

Даже если вы приведете child к Parent, это не изменит его реализацию метода.Это на самом деле не делает его родителем.Вот почему вы можете сделать что-то вроде:

Image img = new BufferedImage(...);

Несмотря на то, что Image is abstract, img по-прежнему является bufferedImage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...