【问题标题】:using of casting in inheritanceHierarchy?在继承层次结构中使用强制转换?
【发布时间】:2015-12-15 07:18:02
【问题描述】:

请看下面的代码演示,我对转换的继承层次结构有误解。只是下面的示例,正​​确的结果是 Baz 1 Foo 3。我不知道为什么我们会得到这个答案。

我认为确定 e 的编译时类型是 Object 类型。转换 Foo 时不会发生编译时错误,因为向上转换和向下转换都可以。 Foo 类型也有 .one() 方法。然后考虑运行时类型 Object e = new Baz();并且 Baz 类型可以转换为 Foo 类型,因为在对象的运行时类型之上进行转换是可以的。这样就不会发生运行时并确定输出。我认为强制转换意味着使一种对象类型变成另一种对象类型,因此 e 现在是 Foo 类型,只需检查 Foo 类型中的方法一。我得到“Foo1”。这是错误的。谁能帮我解决这个问题?谢谢!

public class inheritanceHierarchy
    public static void main(String[] args) {
        class Foo {
            public void one() {
                System.out.println("Foo 1");
            }

            public void three() {
                System.out.println("Foo 3");
            }
        }

        class Baz extends Foo {

            public void one() {
                System.out.println("Baz 1");
                super.three();
            }

            public void two() {
                System.out.println("Baz 2");
            }
        }

        Object e = new Baz();
        ((Foo) e).one();
    }
}

【问题讨论】:

  • 顺便说一句,如果您不在方法中声明类,我认为您的示例会更清晰 - 这是一种非常不寻常的技术。只需将它们声明为单独的顶级类型,理想情况下使您的所有类型都遵循 Java 命名约定。
  • 这个问题几乎看不懂,我几乎无法解析它的文字。

标签: java inheritance hierarchy


【解决方案1】:

我认为强制转换意味着将一种对象类型转换为另一种对象类型,因此 e 现在是 Foo 类型,只需检查 Foo 类型中的方法一。

没有。投射根本不会改变对象的类型。它只为您提供目标类型的表达式。比如:

String x = "foo";
Object y = x;
String z = (String) y;

这里我们有三个引用,都指向同一个对象。对象不会改变它的类型,变量的值也不是对象——它们只是引用。您理解这一点至关重要

因此,在您的情况下,唯一的对象仍然是 Baz 的实例,因此当您调用 one() 时,您最终仍然会在 Baz 中调用覆盖。

【讨论】:

    【解决方案2】:

    继承还允许使用多态性,因此您可以像这样实例化您的 Baz 对象,而不是将 Baz 对象转换为 Foo 对象: Foo e = new Baz();

    这允许访问超类和子类方法。但是,这并没有改变 Jon Skeet 也指出的事实,即您正在覆盖子类中的 one() 方法。

    【讨论】:

    • 这是有道理的。谢谢
    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多