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