有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

是否将字符串设置为该对象的类型?肯定有一些使用引号转换为字符串的情况,所以我对这个基本示例有点困惑。提前谢谢


共 (4) 个答案

  1. # 1 楼答案

    sb.m(o)中,使用对象引用调用m(),因此Java选择重载。Java不会选择比传递给它的引用类型更具体的重载。不过,它将在继承链上上升。假设您没有m(字符串o),调用sb.m("Hello")仍然是合法的,但它会调用对象版本

    如果你做sb.m((String) o),你会得到你预期的行为

  2. # 2 楼答案

    将字符串向下投射到对象。你所做的与此类似

    public class Sub extends Super {
        public Sub() {
            i = 5;
        }
        public static void main(String[] args) {
            Super s = new Sub();
            Object o = "";
            System.out.println("Object Type = " + o.getClass().getName());
            s.m(o);
            s.m((Object)"");
        }
    }
    
  3. # 3 楼答案

    您将对象声明为Object,因此其类型为Object。Java中的类型是强静态的,所以当您将一个对象声明为类型Type时,它的类型将一直保持不变

    如果希望它是一个字符串,则必须使用toString方法或cast (String)o

  4. # 4 楼答案

    方法的类型在编译时确定,而不是在运行时确定。dynamic dispatch只存在于“参数”this中——对于java等static typing语言中的参数没有动态调度

    编译器“选择”应该调用哪个方法,因为oObject类型——它选择m(Object)——它无法知道o的动态类型实际上是String

    如果您感兴趣,在某些情况下,克服这个问题的一种常见方法是使用visitor design pattern

    在您的特定情况下,为了“强制”激活m(String),您应该使用m(o.toString())