java.upcasting - PullRequest
       23

java.upcasting

1 голос
/ 14 декабря 2010

у меня есть этот пример:

class One
{
    public void testOne(){System.out.println("One!!!");}
    public void testTwo(){System.out.println("One!!!");}
}
public class Jenia extends One
{
    static void test(One o) {o.testOne(); o.testTwo();}
    public static void main(String args[])
    {
        test(new One());
    }
}

Результаты:

One!!!
One!!!

хорошо, без вопросов.

чем, я пытаюсь изменить мой код:

только этот метод:

public static void main(String args[])
    {
        test(new Jenia());
        }

результаты:

One!!!
One!!!

хорошо, у нас есть этот результат, потому что - здесь апкастинг (Jenia-One).

все тоже хорошо, но снова модифицировано: в class Jenia override method testOne`:

public void testOne(){System.out.println("Two!!!");}

поэтому у меня есть этот код:

class One
{
    public void testOne(){System.out.println("One!!!");}
    public void testTwo(){System.out.println("One!!!");}
}
public class Jenia extends One
{
    public void testOne(){System.out.println("Two!!!");}

    static void test(One o){o.testOne(); o.testTwo();}
    public static void main(String args[])
    {
        test(new Jenia());
    }
}

и результаты:

Two!!!
One!!!

мой вопрос: почему двое !!! ?? почему мы не потеряли методы переопределения?

Ответы [ 5 ]

4 голосов
/ 14 декабря 2010

Потому что все методы в Java являются виртуальными с точки зрения C ++ / C # и всех значений, передаваемых по ссылке. Поэтому, когда вы вызываете какой-либо метод, тип ссылки не имеет значения, важен тип объекта, на который он указывает. В вашем случае объект имеет тип Jenia, поэтому вызывается метод Jenia.

4 голосов
/ 14 декабря 2010

Это желаемое поведение .. какой метод вызывается, зависит от типа среды выполнения, а не от ссылочного типа.Поскольку объект имеет тип Jenia, вызывается версия testOne Jenia, даже если ссылка имеет тип One.Это простой старый полиморфизм.

2 голосов
/ 14 декабря 2010

См. Пояснения в комментариях

class One
{
    public void testOne(){System.out.println("One!!!");}//method one
    public void testTwo(){System.out.println("One!!!");}//method two
}
public class Jenia extends One
{
    public void testOne(){System.out.println("Two!!!");}//method 3

static void test(One o){o.testOne(); o.testTwo();}//method 4
    public static void main(String args[])
    {
        test(new Jenia());//calls method 4 which in turns calls 3 and 2.
        }
    }
}
1 голос
/ 14 декабря 2010

java overriding вот учебник http://download.oracle.com/javase/tutorial/java/IandI/override.html

public class A {
    void print() {
        System.out.println("A");
    }

    public static void main(String[] args){
        A a1 = new A();
        a1.print(); // A

        A a2 = new B();
        a2.print(); // B ! because it overrides print method

        B b = new B();
        b.print(); // B
    }
}


class B extends A {
    void print() {
        System.out.println("B");
    }
}
1 голос
/ 14 декабря 2010

Когда вы вызываете o.testOne() в методе test, он вызывает Jenia.testOne, поскольку o является экземпляром Jenia. Вы можете проверить это по o.getClass().getName();.

...