收录日期:2020/10/20 19:15:35 时间:2016/08/13 20:21:13 标签:Java SE


 class Base {

public void foo(Base x)
{
System.out.println("Base.Base");
}
public void foo(Derived x)
{
System.out.println("Base.Derived");
}

}
class Derived extends Base
{
public void foo(Base x)
{
System.out.println("Derived.Base");
}
public void foo(Derived x)
{
System.out.println("Derived.Derived");
}

}
public class StaticParamsDemo
{
public static void whichFoo(Base arg1, Base arg2)
{
//It is guaranteed that we will call foo(Base)
//Only issue is which class's version of foo(Base)
//is called; the dynamic type of arg1 is used
//to decide
arg1.foo(arg2);
}
public static void main(String []args)
{
Base b = new Base();
Derived d = new Derived();

whichFoo(b,b);
whichFoo(b,d);
whichFoo(d,b);
whichFoo(d,d);
}
}

打印结果为:
Base.Base
Base.Base
Derived.Base
Derived.Base

想请问大虾,结果为什么不是:
Base.Base
Base.Derived
Derived.Base
Derived.Derived.
这个代码中继承的体现就是父类中的方法子类也有,但是会被子类Derived 覆盖
whichFoo的一个参数是什么类型,就调用对应类型的foo方法,例如,arg1是Base类型就调用Base类的foo方法,

第二个参数是什么类型,就调用该类中对应的foo方法
第二个参数是什么类型,就调用该类中对应的foo方法

那为什么语句whichFoo(d,d);打印结果不是:Derived.Derived.实际却是Derived.Base呢
其实这段代码的突破口可以从



public class StaticParamsDemo
{
public static void whichFoo(Base arg1, Base arg2)
{
arg1.foo(arg2);
}
public static void main(String []args)
{
Base b = new Base();
Derived d = new Derived();

whichFoo(b,b); //第一个参数是b那就是进类Base 然后调用whichFoo,那第一个参数是类Base 自然就打印出Base 类中的第一个System.out.println("Base.Base");
whichFoo(b,d);//第一个参数是b那就是进类Base 然后调用whichFoo,那第一个参数是类Base 自然就打印出Base 类中的第一个System.out.println("Base.Base");
whichFoo(d,b);//第一个参数是d那就是进类Derived然后调用whichFoo,那第一个参数是类Derived 自然就打印出Derived类中的第一个System.out.println("Derived.Base");
whichFoo(d,d);//第一个参数是d那就是进类Derived然后调用whichFoo,那第一个参数是类Derived 自然就打印出Derived类中的第一个System.out.println("Derived.Base");
}
}


谢谢

但还是不明白。。


怎么调用whichFoo才会打印Derived.Derived或者Base.Derived?

public class StaticParamsDemo
{
public static void whichFoo(Base arg1, Base arg2)
{
arg1.foo(arg2);
}
public static void whichtwo(Base arg1,Derived arg2){
arg1.foo(arg2);
}
public static void main(String []args)
{
Base b = new Base();
Derived d = new Derived();
whichFoo(b,b);
whichtwo(b,d);
whichFoo(d,b);
whichtwo(d,d);
}
}
加一个方法
结果是:
Base.Base
Base.Derived
Derived.Base
Derived.Derived
虽然是实现了我的要求,可也违背了面向对象编程呀。
引用 5 楼 feifeikub 的回复:
Java code

public class StaticParamsDemo
{
public static void whichFoo(Base arg1, Base arg2)
{
    arg1.foo(arg2);
}
public static void whichtwo(Base arg1,Derived arg2){
    arg1.foo(arg2);
}
public……
引用 7 楼 uooooppp 的回复:
虽然是实现了我的要求,可也违背了面向对象编程呀。

引用 5 楼 feifeikub 的回复:

Java code

public class StaticParamsDemo
{
public static void whichFoo(Base arg1, Base arg2)
{
arg1.foo(arg2);
}
public static void whichtw……


先确保实现没有问题,再考虑面向XX,面向XXX之类的。
摸索下创建对象的流程吧。。。
本质的疑问还是没得到解答。

看看还有没高人。

JAVA带预编译的模糊查询问题 页面的显示问题,在线等 谁有闲置的ds9097-009? 不知道是不是中毒了? 讨论兼散分! 有创业想法的朋友,进来讨论一下如何利用你们手头上的资源! vs2005如何获得地址栏的参数?? 1秒钟要处理2000个客户端发来的数据,应该如何办呀? mybase server 2.2无法连接服务器... xml日历控件 问个兼容问题? [调查]大家开发net用什么做数据访问层还是如何处理? 再问:求最多连续编号 着急: 求一个文章分类的ASP的函数 如何制作不用打包的能在非BUILDER的环境中运行的EXE文件 我最后问问题,问一个关于sb.Append(\"表格的字符串\"),将Panel添加到指定的表格的问题.. 60分问3个作业题目,顺便祝大家端午愉快。 peercast 中tracker的作用是什么? rebuild database 问题 刚用asp.net 2.0 + sql server 2005 做了个简单的论坛 大家帮忙测下速度如何!!!!!!! 图片写入Access数据库的问题,急!!!!!!!!! 这条语句能不能改漂亮点〉?关于日期取得。 从xml中如何取值? 请教数据库高手,帮忙看看设计的合理性 本公司急招有经验的程序员 我感觉被狠狠的宰了!因为我看到这个商家有个别个送的锦旗,她说给我的东西很好.我就买了! 问下 QT执行过程中的错误 急~!连接数据库 .net2005 sql2000 摸版页是直接上传后在用stream读取还是上传存到数据库在到数据库里面读取。 VS2003 中如何开发购物车程序 谁有支持中文的jspsmartupload.jar呀?急,在线等