-1

如果我有一个类myClass1和第二类myClass1Extended是第一类的扩展,我有这个源代码:

myClass1 c1 = something();   // line 1
myClass1Extended c1ex = somethingElse();   // line 2
if (c1ex instanceof myClass1) {    // line 3
    (myClass1)c1ex.doSomething();    // line 4
}

我有几个问题:

  1. 在第 3 行,运算符会instanceof返回 true 吗?
  2. 在第 4 行,假设第一个答案是肯定的,如果 myClass1Extended 中没有覆盖 doSomething() 会发生什么?
  3. 如果 doSomething() 已被覆盖,会发生什么?
  4. 在第 4 行, (myClass1) 是必要的吗?

非常感谢

4

2 回答 2

3

你为什么不试试代码看看?

  1. 是的
  2. 它将调用父类中的那个
  3. 它将调用子类中的那个
  4. 不。

鉴于:

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 类的任何地方使用 Child 类,因为所有 Child 都是 Parent 的类型。

当编译器查看这段代码时:

Parent p = new Child();

它验证子项是否扩展或实现了父项。

当编译器查看这段代码时:

p.foo();

它验证p声明为的类型Parent, 有一个foo方法。

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

在父类中,当foo方法调用时bar,编译器再次查看以确保Parent该类具有bar方法。在运行时,VM 再次查看方法的Childbar,因为它不调用Parent.

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

于 2013-10-13T16:33:34.480 回答
1

要回答您的问题,请在此处使用此示例:

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();
        }
    }
}

如您所见, Child 继承自 Parent 并覆盖 printFoo() 方法。在打印这些 Parent 对象时,您将获得以下输出:

test.Child is Parent
myFoo
bar
test.Parent is Parent
foo
bar

所以回答你的问题:
1)是
2)它将调用父类的方法
3)它将调用覆盖的方法 - 如果此方法包含超级调用,则父方法也将执行
4)否 - 如果您指定 feParent o = new Child()并在 Child 中实现 Parent 中不存在的方法,并且您想要调用子对象的方法,您必须将其强制转换回 Child((Child)o).invokeYourMethod()

于 2013-10-13T16:48:02.010 回答