Java 实例、子类和类型转换

Java 实例、子类和类型转换,java,Java,如果我有一个类myClass1,另一个类MyClassExtended是第一个类的扩展,那么我有以下源代码: myClass1 c1 = something(); // line 1 myClass1Extended c1ex = somethingElse(); // line 2 if (c1ex instanceof myClass1) { // line 3 (myClass1)c1ex.doSomething(); // line 4 } 我有几个问题:

如果我有一个类myClass1,另一个类MyClassExtended是第一个类的扩展,那么我有以下源代码:

myClass1 c1 = something();   // line 1
myClass1Extended c1ex = somethingElse();   // line 2
if (c1ex instanceof myClass1) {    // line 3
    (myClass1)c1ex.doSomething();    // line 4
}
我有几个问题:

在第3行中,运算符instanceof是否返回true? 在第4行中,假设第一个答案是肯定的,那么如果doSomething没有在MyClass中被覆盖,将会发生什么? 如果doSomething被覆盖会发生什么? 在第4行中,是否需要myClass1?
非常感谢

为什么不试试代码看看呢

对 它将调用父类中的一个 它将调用子类中的一个 不 鉴于:

class Parent
{
    public void foo() 
    {
        System.out.ptintln("parent::foo");
        bar();
    }

    public void bar()
    {
        System.out.println("parent::bar");
    }
}

class Child
    extends Parent
{
    public void foo() 
    {
        super.foo();
        System.out.ptintln("child::foo");
    }
}
可以在使用父类的任何位置使用子类,因为所有子类都是父类的类型

当编译器查看此代码时:

Parent p = new Child();
p.foo();
它验证子级是否扩展或实现父级

当编译器查看此代码时:

Parent p = new Child();
p.foo();
它验证p声明为父类型的类型是否具有foo方法

在运行时,当执行p.foo行时,虚拟机将查看p实际指向的类型Child,并在那里查找foo方法。假设在子类中找到foo方法,它将运行它,否则它将查看父类

在父类中,当foo方法调用bar时,编译器再次检查以确保父类具有bar方法。在运行时,VM再次查看子类以查找bar方法,因为它没有调用父类中的子类


如果这些方法不存在于父类中,那么它们必须存在于父类的父类中,一直到java.lang.Object。

要回答您的问题,请在这里举一个例子:

package test;

public class Parent
{
    public void printFoo()
    {
        System.out.println("foo");
    }

    public void printBar()
    {
        System.out.println("bar");
    }
}

package test;

public class Child extends Parent
{
    @Override
    public void printFoo()
    {
        System.out.println("myFoo");
    }
}

package test;

public class Main
{
    public static void main(String ... args)
    {
        Parent test = new Child();
        Parent test2 = new Parent();

        print(test);
        print(test2);
    }

    public static void print(Parent parent)
    {
        if (parent instanceof Parent)
        {
            System.out.println(parent.getClass().getName()+" is Parent");
            parent.printFoo();
            parent.printBar();
        }
    }
}
正如您所看到的,子对象从父对象继承并重写printFoo方法。打印这些父对象时,您将获得以下输出:

test.Child is Parent
myFoo
bar
test.Parent is Parent
foo
bar
因此,要回答您的问题: 1是的 2它将调用父类的方法 3它将调用重写的方法-如果此方法包含超级调用,则父方法也将执行
4否-如果您指定f.e.Parent o=new Child并在Child中实现一个在Parent中不存在的方法,并且您希望调用Child对象的方法,则必须将其强制转换回Child Childo。invokeYourMethod

此问题未显示任何研究成果。请先尝试,然后再问。我认为这是一个有趣的问题,人们给了我很好的答案,不幸的是,我将删除它,因为有其他人认为我应该为此得到一个负号。因为我认为这是这里缺少的知识的一部分,因为我实际上已经测试过了,但我想确定我没有犯错误。最后,因为这是深入理解语言的好方法。非常感谢你。