Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在继承层次结构中使用强制转换?_Java_Inheritance_Hierarchy - Fatal编程技术网

Java 在继承层次结构中使用强制转换?

Java 在继承层次结构中使用强制转换?,java,inheritance,hierarchy,Java,Inheritance,Hierarchy,请看下面的代码演示,我对有关强制转换的继承层次问题有误解。正如下面的示例所示,正确的结果是Baz 1 Foo 3。我不知道为什么我们会得到这个答案 我想的是确定e的编译时类型,它是Object类型。在强制转换Foo时不会发生编译时错误,因为向上强制转换和向下强制转换都可以。此外,Foo类型还有.one()方法。然后考虑运行时类型,对象e=new Baz();Baz类型可以强制转换为Foo类型,因为在对象的运行时类型之上强制转换是可以的。这样就不会发生运行时并确定输出。我认为强制转换意味着将一个对

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

我想的是确定e的编译时类型,它是Object类型。在强制转换Foo时不会发生编译时错误,因为向上强制转换和向下强制转换都可以。此外,Foo类型还有.one()方法。然后考虑运行时类型,对象e=new Baz();Baz类型可以强制转换为Foo类型,因为在对象的运行时类型之上强制转换是可以的。这样就不会发生运行时并确定输出。我认为强制转换意味着将一个对象类型转换为另一个对象类型,所以现在e是Foo类型,只需检查Foo类型中的方法1。我得到“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();
    }
}
我认为强制转换意味着将一个对象类型转换为另一个对象类型,所以现在e是Foo类型,只需检查Foo类型中的方法1

不。强制转换根本不会更改对象的类型。它只提供目标类型的表达式。例如:

String x = "foo";
Object y = x;
String z = (String) y;
这里我们有三个引用,都指向同一个对象。对象不改变其类型,变量的值也不是对象——它们只是引用。你必须明白这一点

因此,在您的例子中,唯一的对象仍然是
Baz
的实例,因此当您调用
one()
时,您仍然在
Baz
中调用覆盖

我认为强制转换意味着将一个对象类型转换为另一个对象类型,所以现在e是Foo类型,只需检查Foo类型中的方法1

不。强制转换根本不会更改对象的类型。它只提供目标类型的表达式。例如:

String x = "foo";
Object y = x;
String z = (String) y;
这里我们有三个引用,都指向同一个对象。对象不改变其类型,变量的值也不是对象——它们只是引用。你必须明白这一点


因此,在您的情况下,唯一的对象仍然是
Baz
的实例,因此当您调用
one()
时,您仍然会在
Baz
中调用覆盖,继承还允许使用多态性,因此您可以像这样实例化Baz对象,而不是将Baz对象强制转换为Foo对象:
fooe=newbaz()


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

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


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

顺便说一句,如果您不在方法中声明类,我认为您的示例会更清晰-这是一种非常不寻常的使用技巧。只需将它们声明为单独的顶级类型,理想情况下,使所有类型都遵循Java命名约定。这个问题很难理解,我也很难解析它的文本。顺便说一句,如果不在方法中声明类,我认为您的示例会更清晰-这是一种非常不寻常的使用技术。只需将它们声明为独立的顶级类型,理想情况下,使所有类型都遵循Java命名约定。这个问题很难理解,我也很难解析它的文本。这很有意义。谢谢你,这很有道理。非常感谢。