что получится, когда 2 класса будут брошены? это объект? - PullRequest
1 голос
/ 03 февраля 2012

У меня есть 3 класса A, B и c следующим образом

A.java

class A
{
    protected A(){
        System.out.println("A");
    }
    void show()
    {
        System.out.println("showA");
    }
}

B.java

class B extends A
{
    B(){
        System.out.println("B");
    }
    void show()
    {
        System.out.println("showB");
    }
}

C.java

class C extends B
{
    C(){
        System.out.println("C");
    }
    void show()
    {
        System.out.println("showC");
    }
    public static void main(String... args)
    {
        A a= (B)new C();
        a.show();
    }
}

При выполнении выдает вывод

D:\java\rmi\Hello>javac C.java

D:\java\rmi\Hello>java C
A
B
C
showC

Я знаю, что суперкласс не может быть приведен к подклассу. Но в выводе почему он выполняет метод класса C (show), когда происходит приведение к суперклассу B?

A a= (B)new C();

И если это правильно, то что забрасывается в В? Я имею в виду, что new C () будет вызывать конструктор C и, следовательно, соответствующие выходы, но в чем разница между new C().show(); и (B)new C().show(); что здесь кастуется?

Ответы [ 4 ]

1 голос
/ 03 февраля 2012

Ошибка "B не может быть приведена к C в C.main" означает, что суперкласс B приведен к C, который является подклассом. (Просто прочитайте его снова и снова, и вы поймете это ..)

Вы можете привести нижний элемент в иерархии к верхнему элементу, но не наоборот.
Надеюсь, вы поняли:)

1 голос
/ 03 февраля 2012

Приведение объекта не меняет его тип.

(B) new C();

будет по-прежнему создавать объект типа C, независимо от того, к чему вы его приводите.Но если вы создадите B, то он, конечно, будет B, поэтому конструктор C не вызывается при выполнении

(C) new B();
0 голосов
/ 03 февраля 2012

Когда вы создаете объект класса, сначала создаются его объекты суперкласса. Итак, когда вы говорите, A a = (B) new C (); При создании объекта C сначала создаются его объекты суперкласса. Таким образом, объект C может быть приведен к B. Но в последнем случае при создании объекта B это было бы невозможно.

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

0 голосов
/ 03 февраля 2012

Класс B не расширяет C, поэтому он не знает об этом и не может быть приведен к C. С помощью Java вы можете понижать, но не повышать.

OK

A a= (B)new C();

-> C наследуется от B, поэтому приведение возможно

Не в порядке

A a= (C)new B();

-> B не наследуется от C, поэтому его нельзя привести к нему

см. Также: Даункастинг в Java

Edit: Пожалуйста, рассмотрите возможность редактирования вашего вопроса, так как большинство пользователей, как правило, сначала исправляют ошибку. (Удалите ошибку и разбейте ее на исходный вопрос)

«В чем разница между новым C (). Show (); и (B) новым C (). Show ();» Это называется «полиморфизм». нет никакой разницы между двумя вызовами, так как java всегда будет выполнять метод самого низкого уровня иерархии.

Например:

class Bird{
 public void fly(){
   System.out.println("I am flying");
}}

class Duck extends Bird{
 public void fly(){
   System.out.println("I can not fly");
}}

class Test{
 public static void main(String[] args){
  Bird[] birds = {new Bird(), new Duck()};
  for (Bird b: birds){
   b.fly();
  }
}

Это вывело бы:

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