java使用object o=“”)创建的对象的类型;
比如说,下面有一个例子:
class Super {
public int i = 3;
public void m(Object o) {
System.out.println("Object " + i);
}
public void m(String o) {
System.out.println("String " + i);
}
}
public class Sub extends Super {
public Sub() {
i = 5;
}
public static void main(String[] args) {
Super s = new Sub();
Object o = "";
s.m(o);
s.m("");
}
}
该代码的结果是:
Object 5
String 5
但我想是:
String 5
String 5
是否将字符串设置为该对象的类型?肯定有一些使用引号转换为字符串的情况,所以我对这个基本示例有点困惑。提前谢谢
# 1 楼答案
在
sb.m(o)
中,使用对象引用调用m(),因此Java选择重载。Java不会选择比传递给它的引用类型更具体的重载。不过,它将在继承链上上升。假设您没有m(字符串o),调用sb.m("Hello")
仍然是合法的,但它会调用对象版本如果你做
sb.m((String) o)
,你会得到你预期的行为# 2 楼答案
将字符串向下投射到对象。你所做的与此类似
# 3 楼答案
您将对象声明为
Object
,因此其类型为Object
。Java中的类型是强静态的,所以当您将一个对象声明为类型Type
时,它的类型将一直保持不变如果希望它是一个字符串,则必须使用
toString
方法或cast(String)o
# 4 楼答案
方法的类型在编译时确定,而不是在运行时确定。dynamic dispatch只存在于“参数”
this
中——对于java等static typing语言中的参数没有动态调度编译器“选择”应该调用哪个方法,因为
o
是Object
类型——它选择m(Object)
——它无法知道o
的动态类型实际上是String
如果您感兴趣,在某些情况下,克服这个问题的一种常见方法是使用visitor design pattern
在您的特定情况下,为了“强制”激活
m(String)
,您应该使用m(o.toString())