【问题标题】:Java dynamic, static castingJava 动态、静态转换
【发布时间】:2015-05-31 14:30:40
【问题描述】:
import javax.swing.*;

public class Toast {
    static Object[] objects = { new JButton(),
        new String("Example"), new Object() };

    public static void main(String[] args) {
        System.out.println( new Count(objects) );
        for (Object o : objects)
            System.out.println(o);
    }
}


class Count {
    int b, s, o;
    public Count(Object[] objects) {
        for (int i=0; i<objects.length; i++)
            count(objects[i]);
    }
    public void count(JButton x) { b++; }
    public void count(String x) { s++; }
    public void count(Object x) { o++; }
    public String toString() {
        return b + " : " + s + " : " + o + "\n";
    }
}

上面是一段代码,它以某种形式出现在我即将进行的一项考试的过去试卷中。这个问题的想法是衡量你是否完全理解多态性、动态和静态转换。 OO的基本思想。

我想发表我认为正确的内容,如果人们能够纠正我或添加我将不胜感激的观点。

从我在上面的代码中可以看到:

  • 项目向上转换为对象数组中的对象,因为 Java 中的每个类在技术上都从对象类继承。这就是为什么当 count 运行时它会说有 3 个对象而不是 1 个 Jbutton、1 个字符串和 1 个对象。

  • 当增强的 for 循环运行时,该对象类型的 toString,例如来自对象的字符串和内存地址的示例(不确定 JButton 将打印什么)。由于这是在运行时完成的,因此这称为动态转换。

我看不到与上述代码相关的任何其他点。

【问题讨论】:

    标签: java dynamic static polymorphism


    【解决方案1】:

    静态转换和动态转换背后的想法与需要做出类型决定的时刻有关。如果它需要由编译器制作,那么它是静态转换。如果编译器将决定推迟到运行时,那么它就是动态强制转换。

    所以,您的第一个观察结果是不正确的。 upcast没有解释计数。对象不会丢失它们的类型,但编译器需要执行静态转换来决定调用哪个方法并选择count(Object)。 java中没有动态调度,这意味着调用的方法总是在编译时决定的。

    你的第二个观察也是不正确的。使用的是多态性。在 Java 中,总是为实例的类型而不是代码中的类型调用方法。此外,这里没有动态转换。编译器可以验证所有类型。只是方法调用总是virtual,但这不是强制转换。

    实际上在这个例子中,我没有看到一个动态转换的案例。编译器可以验证所有类型。您通常只会在向下投射时看到动态投射,而不会出现这种情况。

    【讨论】:

      【解决方案2】:

      这是我要带走的:

      1. 编译器在执行赋值时隐式向上转换。这包括在初始化期间分配给数组元素。

      2. 在选择方法重载时,编译器和 JVM 不会隐式向下转换。对象数组的静态类型是Object[],所以会一直调用count(Object)方法。

      3. JVM 在调用虚拟方法时会隐式地“向下转换”(在某种意义上)。 println 循环将始终调用实际对象实例的 toString 方法,而不是始终调用 Object.toString。

      【讨论】:

        【解决方案3】:

        在您的 Count() 方法中,总是会调用 count(object),因为所有对象都被强制转换为对象。 为了防止你可以调用方法实例然后向下转换对象并调用计数

        public Count(Object[] objects) {
            for (int i=0; i<objects.length; i++)
            {
                if(objects[i] instanceof JButton)
                   count((JButton) objects[i]);
                else if(objects[i] instanceof String) 
                   count((String) objects[i]);
                else
                   count(objects[i]);
            }
        } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          • 1970-01-01
          • 2017-09-22
          • 2011-02-16
          • 1970-01-01
          • 2013-06-24
          • 1970-01-01
          相关资源
          最近更新 更多