[英]instanceof, subclasses and casting
如果我有一個類myClass1
和第二個類myClass1Extended
,它是第一類的擴展,則我有以下源代碼:
myClass1 c1 = something(); // line 1
myClass1Extended c1ex = somethingElse(); // line 2
if (c1ex instanceof myClass1) { // line 3
(myClass1)c1ex.doSomething(); // line 4
}
我有幾個問題:
instanceof
返回true嗎? 非常感謝你
您為什么不嘗試查看代碼?
鑒於:
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
方法。 假設在Child
找到foo
方法,它將運行它,否則它將為它查看Parent
類。
在父類中,當foo
方法調用bar
,編譯器將再次查看以確保Parent
類具有bar
方法。 在運行時,VM再次在Child
類中查找bar
方法,由於沒有,因此它在Parent
調用了該方法。
如果不存在的方法, Parent
則它們必須存在於父類的Parent
,一路到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();
}
}
}
如您所見,Child繼承自Parent並覆蓋了printFoo()方法。 在打印這些父對象時,您將獲得以下輸出:
test.Child is Parent
myFoo
bar
test.Parent is Parent
foo
bar
因此,回答您的問題:
1)是的
2)它將調用父類的方法
3)它將調用重寫的方法-如果此方法包含超級調用,則父方法也將執行
4)否-如果您指定fe Parent o = new Child()
並在Child中實現了不存在於Parent中的方法,並且您想調用child對象的方法,則必須將其強制轉換回Child ((Child)o).invokeYourMethod()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.