2013-10-13 73 views
-1

,如果我有一个类myClass1和第二类myClass1Extended这是第一类的扩展,我有这样的代码:的instanceof,子类和铸造

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行,假设第一个答案是肯定的,如果doSomething()在myClass1Extended中没有被覆盖会发生什么?
  3. 而如果doSomething()被覆盖会发生什么?
  4. 第4行是(myClass1)必要的吗?

非常感谢您

+0

此问题未显示任何研究工作。请先尝试,然后再问。 –

+0

我认为这是一个有趣的问题,人们给了我很好的答案,不幸的是我会删除它,因为还有其他人认为我应该减去它。 –

回答

3

你为什么不去尝试的代码看?

  1. 它会调用一个父类
  2. 它会调用子类
  3. 没有一个。

考虑:

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

它验证该p被声明为,Parent类型,具有foo方法。

在运行时执行p.foo()线的时候,虚拟机着眼于p实际上指向,Child类型,并查找那里为foo方法。假设foo方法在Child中找到,它会运行它,否则它将查找Parent类。

在父类时foo方法调用bar编译器将再度向确保该Parent类有一个bar方法。在运行时,VM再次查找Child类,查找bar方法,并且由于它不调用Parent中的那个。

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

+1

因为我认为这是知识缺失的一部分,因为我实际上已经测试过,但我想确保我没有犯过一些错误。最后,因为这是深入理解语言的好方法。非常感谢你。 –

+0

真的很清楚,谢谢。 –

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

正如你可以看到儿童从父继承并重写printFoo()方法。在打印这些父对象,你会得到下面的输出:

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

因此,要回答你的问题:
1)是
2),它会调用父类的方法
3)它会调用重写方法 - 如果此方法包含超级调用,则父级的方法也将执行
4)否 - 如果指定了fe Parent o = new Child()并且在Parent中不存在的Child中实现一个方法,并且您想要调用该子对象的方法,则必须将其转回Child ((Child)o).invokeYourMethod()