BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #29073同步于 2014/3/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

一个关于多态的问题...

sxh
2014/3/29镜像同步20 回复
这一段怎样写才会通过? //A.java public class A{ public void hello(Integer a){ System.out.println("Hello int"); } public void hello(Double a){ System.out.println("Hello double"); } public static void main(String args[]){ A a = new A(); Object o = new Integer(4); a.hello(o); } } 问题关键是运行时我不能知道这个Object到底是哪个类型... 这到底是多态 重载 还是重写 表示一直分不清... 请教正确写法。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
kingkongman机器人#1 · 2014/3/30
【1】a.hello(o) 改为 a.hello( Integer(o) ) 可通过编译。 【2】重载和覆盖(即你提到的重写)都是多态的表现形式。重载是同一函数参数类型或数量等不同,覆盖是同意函数且参数完全相同。重载的目的就是希望达到使用同一函数名,根据具体传入的参数调用不同函数,覆盖的目的主要是为了实现上溯造型动态绑定。 【3】此处hello实现了重载, Object o = new Integer(4)是上溯造型,这并不矛盾,但是传入hello的参数必须是Integer或Double类型的,因为你只重载了这两种类型的参数,否则会提示找不到相应函数。但由于Object o为上溯造型指向Integer,因此可以显示下溯造型为Integer类型,这样参数类型就和hello函数相匹配了。
kingkongman机器人#2 · 2014/3/30
【1】a.hello(o) 改为 a.hello( Integer(o) ) 可通过编译。 【2】重载和覆盖(即你提到的重写)都是多态的表现形式。重载是同一函数参数类型或数量等不同,覆盖是同意函数且参数完全相同。重载的目的就是希望达到使用同一函数名,根据具体传入的参数调用不同函数,覆盖的目的主要是为了实现上溯造型动态绑定。 【3】此处hello实现了重载, Object o = new Integer(4)是上溯造型,这并不矛盾,但是传入hello的参数必须是Integer或Double类型的,因为你只重载了这两种类型的参数,否则会提示找不到相应函数。但由于Object o为上溯造型指向Integer,因此可以显示下溯造型为Integer类型,这样参数类型就和hello函数相匹配了。 【 在 sxh 的大作中提到: 】 : 这一段怎样写才会通过? : //A.java : public class A{ : ...................
roseking机器人#3 · 2014/3/30
1.楼主说在运行时无法判定不能知道这个Object到底是哪个类型,猜测楼主是从一个没有用泛型的容器里取得的数据,这种情况利用RTTI加一个instanceof的判断然后安全的向下转型即。 2.重载我认为根本不能说是多态。多态的前提是运行时将引用地址换成实际地址,但是重载在编译期已然做了这个工作,换句话说重载是一个静态行为,静态的东西谈什么多态?所以楼主的问题木有什么多态的问题,只是一个RTTI加上重载。
kingkongman机器人#4 · 2014/3/30
重载说是多态也是合理的。看怎么理解了,个人觉得是对语文的一种尊重!中国汉字博大精深- -。广义的多态包括静态多态和动态多态,静态多态即重载在编译期执行,动态多态即运行时的动态绑定即重写;狭义的多态就仅指后者,毕竟重载是面向方法,而覆盖才是真正面向对象的技术。 java小白入门阶段,大神讲的挺好,对于楼主的猜测感觉挺对的。。。[ema3] 【 在 roseking 的大作中提到: 】 : 1.楼主说在运行时无法判定不能知道这个Object到底是哪个类型,猜测楼主是从一个没有用泛型的容器里取得的数据,这种情况利用RTTI加一个instanceof的判断然后安全的向下转型即。 : 2.重载我认为根本不能说是多态。多态的前提是运行时将引用地址换成实际地址,但是重载在编译期已然做了这个工作,换句话说重载是一个静态行为,静态的东西谈什么多态?所以楼主的问题木有什么多态的问题,只是一个RTTI加上重载。
sxh机器人#5 · 2014/3/30
谢谢。的确是,我原本想从一个泛型的容器里取数据然后根据数据类型做操作。 instanceof肯定对。 其实我表述不太对 我是想说 不用instanceof的情况下怎么弄,因为instanceof老是被人抨击说没有照顾到面向对象编程的原则。 后来自己查了查资料知道了,本来程序的父类子类是自己定义而不是这种原生类Integer String,所以在里面加入同名不同参方法继承父类同名父参方法就好。 但是如果我本来想用的就是这种原生类,不能自己新加方法,就只能用instanceof了?还是可以新加方法? 【 在 roseking 的大作中提到: 】 : 1.楼主说在运行时无法判定不能知道这个Object到底是哪个类型,猜测楼主是从一个没有用泛型的容器里取得的数据,这种情况利用RTTI加一个instanceof的判断然后安全的向下转型即。 : 2.重载我认为根本不能说是多态。多态的前提是运行时将引用地址换成实际地址,但是重载在编译期已然做了这个工作,换句话说重载是一个静态行为,静态的东西谈什么多态?所以楼主的问题木有什么多态的问题,只是一个RTTI加上重载。
sxh机器人#6 · 2014/3/30
恩,谢谢。 【 在 kingkongman 的大作中提到: 】
nuanyangyang机器人#7 · 2014/3/30
仅供吐槽。实际Java请使用instanceof abstract class IntegerOrDouble { public abstract boolean isInteger(); } class JustInteger extends IntegerOrDouble { private int i; public JustInteger(int i) { this.i = i; } public @Override boolean isInteger() { return true; } public int getInteger() { return i; } } class JustDouble extends IntegerOrDouble { private double d; public JustDouble(double d) { this.d = d; } public @Override boolean isInteger() { return false; } public double getDouble() { return d; } } public class A{ public void hello(IntegerOrDouble a){ if (a.isInteger()) { System.out.println("Hello int: " + ((JustInteger)a).getInteger()); } else { System.out.println("Hello double: " + ((JustDouble)a).getDouble()); } } public static void main(String args[]){ A a = new A(); IntegerOrDouble iod1 = new JustInteger(4); IntegerOrDouble iod2 = new JustDouble(4.0); a.hello(iod1); a.hello(iod2); } }
sxh机器人#8 · 2014/3/30
额。。。。 好吧... 【 在 nuanyangyang 的大作中提到: 】 : 仅供吐槽。实际Java请使用instanceof : [code=java] : abstract class IntegerOrDouble { : ...................
nuanyangyang机器人#9 · 2014/3/30
继续吐槽。不要乱学 interface IntegerOrDoubleVisitor { void visitInteger(int i); void visitDouble(double d); } abstract class IntegerOrDouble { public abstract void accept(IntegerOrDoubleVisitor visitor); } class JustInteger extends IntegerOrDouble { private int i; public JustInteger(int i) { this.i = i; } public @Override void accept(IntegerOrDoubleVisitor visitor) { visitor.visitInteger(i); } } class JustDouble extends IntegerOrDouble { private double d; public JustDouble(double d) { this.d = d; } public @Override void accept(IntegerOrDoubleVisitor visitor) { visitor.visitDouble(d); } } class HelloIntegerOrDouble implements IntegerOrDoubleVisitor { public @Override void visitInteger(int i) { System.out.println("Hello int: " + i); } public @Override void visitDouble(double d) { System.out.println("Hello double: " + d); } } public class A { public static void main(String args[]){ HelloIntegerOrDouble v = new HelloIntegerOrDouble(); IntegerOrDouble iod1 = new JustInteger(4); IntegerOrDouble iod2 = new JustDouble(4.0); iod1.accept(v); iod2.accept(v); } }