繁体   English   中英

java.upcasting

[英]java.upcasting

我有这个例子:

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!!!

好的,我们得到这个结果是因为-这里是upcasting(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!!!

我的问题:为什么两个! ?? 为什么我们不丢失重写方法?

多数民众赞成在所需的行为..调用哪种方法取决于运行时类型,而不是引用类型。 由于obect的类型是JeniaJenia版本testOne被调用,即使是引用类型One 那是普通的老多态性。

因为就C ++ / C#而言,Java中的所有方法都是虚拟的,并且所有值都是通过引用传递的。 因此,当您调用某种方法时,引用的类型无关紧要,重要的是它所指向的对象的类型。 在您的情况下,对象是Jenia类型的,因此调用了Jenia方法。

请参阅注释中的说明

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.
        }
    }
}

当您在test方法中调用o.testOne()时,它会调用Jenia.testOne因为oJenia的实例。 您可以通过o.getClass().getName();进行检查o.getClass().getName();

此处覆盖的Java是教程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");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM