首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.upcasting

java.upcasting
EN

Stack Overflow用户
提问于 2010-12-14 16:06:16
回答 5查看 626关注 0票数 1

我有这个例子:

代码语言:javascript
复制
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());
    }
}

结果:

代码语言:javascript
复制
One!!!
One!!!

好了,没有问题了。

然后,我试着修改我的代码:

仅此方法:

代码语言:javascript
复制
public static void main(String args[])
    {
        test(new Jenia());
        }

结果:

代码语言:javascript
复制
One!!!
One!!!

好的,我们有这样的结果是因为-这里向上转换(Jenia-One)。

也可以,但是,再次修改:在class Jenia override methodtestOne`中:

代码语言:javascript
复制
public void testOne(){System.out.println("Two!!!");}

所以我有这样的代码:

代码语言:javascript
复制
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());
    }
}

和结果:

代码语言:javascript
复制
Two!!!
One!!!

我的问题:为什么是两个!??为什么我们没有丢失覆盖方法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-14 16:12:10

因为Java中的所有方法在C++/C#和所有通过引用传递的值方面都是虚拟的。所以当你调用一些方法时,引用的类型是不相关的,重要的是它所指向的对象的类型。在本例中,对象是Jenia类型,因此调用Jenia方法。

票数 4
EN

Stack Overflow用户

发布于 2010-12-14 16:11:20

这就是我们想要的行为。调用哪个方法取决于运行时类型,而不是引用类型。由于obect的类型为Jenia,因此即使引用的类型为One,也会调用testOneJenia版本。这就是普通的老多态。

票数 4
EN

Stack Overflow用户

发布于 2010-12-14 16:10:01

请参阅评论中的说明

代码语言:javascript
复制
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.
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4437066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档