2013-07-09 3 views
0

У меня есть проблема в понимании Вопрос № 9 от главы ориентации объектов из книги SCJP от K & B.SCJP Объект Ориентация Issue

Вопрос:

public class Redwood extends Tree { 

public static void main (String [] args) { 
new Redwood () . go () ; 

} 

void go () { 

go2 (new Tree () , new Redwood ()) ; 

go2 ((Redwood) new Tree () , new Redwood (] 

} 

void go2 (Tree tl, Redwood rl) { 

Redwood r2 = (Redwood) tl; 

Tree t2 = (Tree)rl; 
} 
} 


class Tree { } 

Опции:

What is the result? (Choose all that apply.) 

A. An exception is thrown at runtime 

B. The code compiles and runs with no output 

C. Compilation fails with an error at line 8 

D. Compilation fails with an error at line 9 

E. Compilation fails with an error at line 12 

F. Compilation fails with an error at line 13 

Ответ, приведенный в книге, является A, поскольку Tre e не может быть подавлен в Redwood. У меня просто есть проблема, чтобы понять концепцию.

+0

'go2 ((Redwood) новое дерево(), новый Redwood (]'? Опечатка? – exexzian

ответ

2

Child Экземпляр класса может быть приведен к Parent ссылки класса, потому что с Child наследует Parent, Child должны поддерживать все виды поведения, которые Parent уже поддерживаются.

Пример

class Parent { 

    public void getA() { 
     return 1; 
    } 

} 

class Child extends Parent { 


    public void getB() { 
     return 1; 
    } 

} 

Теперь давайте рассмотрим 2 объекта

Child c = new Child(); 
Parent p = new Parent(); 

Теперь, если вы

Parent p2 = (Parent) c; 

это справедливо, потому что при вызове p2.getA(), он будет работать так getA() метод уже унаследован от c, который является примером Child.

Теперь, если вы

Child c2 = (Parent) p; 

это не будет работать, потому что, тип c2 является Child, и вызов c2.getB() действителен. Но так как экземпляр p имеет тип Parent, он не имеет реализации до getB() (это был новый метод, добавленный в наследство дочерним классом).

В простых терминах наследования является IS A отношения

Возвращаясь к вашей проблеме

RedwoodявляетсяTree так Tree t = (Tree) (new Redwood()); работы. Это означает, что Redwood экземпляр может быть приведен к Tree

Но Treeэто НЕReedwood всегда (это может быть что угодно) .. так Redwood r = (Redwood) new Tree() не работает

0

Вариант А: исключение во время выполнения

из go2 ((Redwood) new Tree () , new Redwood (] // Среда выполнения исключение

вы еще потому литье дерева объектов для объекта Redwood и его не представляется возможным. Ваш класс Tree является родительским классом, и вы не можете сбрасывать объект родительского класса на объект дочернего класса.

1

если передать объект дерева как ниже, то это законно

Tree t1 = new Redwood(); 

Потому что дерево может быть Redwood или некоторое дерево ... так что вы не можете опущенными во время выполнения

2

Эта линия выбросит исключение во время выполнения:

go2 ((Redwood) new Tree () , new Redwood ()); 

Поскольку вы закидывающие Tree объекта в Redwood, которое не возможно

Класс Tree является родительским классом, и вы не можете сбрасывать объект родительского класса на объект дочернего класса.

Это не относится:

(Redwood) new Tree () 

Но верно обратное.

То есть это вполне допустимо:

(Tree) new redwood () 
0

ClassCastException будет сгенерирован, когда попытки коды чтобы свалить Дерево в Редвуд. Так правильный ответ: A

0

Этот код не компилируется из-за очевидных ошибок синтаксиса: ] в методе идут не имеет соответствия [, и ' после метод идти не имеет соответствия ' либо. Кроме того, код не содержит двух }.

3

>

class Tree{ 
    // super class 
} 

public class Redwood extends Tree{ 
    //child class 
    public static void main (String [] args) { 
    new Redwood () . go () ; // Calling method go() 
    } 

    void go () { 

    go2 (new Tree () , new Redwood ()) ; 

    go2 ((Redwood) new Tree () , new Redwood ()); // Problem is Here 

    /* 
    (Redwood)new Tree(),------>by this line Tree IS-A Redwood Which wrong 


    According to Question 
    Redwood IS-A Tree So relationship is 
    (Tree) new Redwood(); 


    */ 

    } 

    void go2 (Tree tl, Redwood rl) { 

    Redwood r2 = (Redwood) tl; 

    Tree t2 = (Tree)rl; 
} 
Смежные вопросы