簡體   English   中英

instanceof,子類和強制轉換

[英]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
}

我有幾個問題:

  1. 在第3行中,運算符instanceof返回true嗎?
  2. 在第4行中,假設第一個答案是yes,如果myClass1Extended中的doSomething()沒有被覆蓋,將會發生什么?
  3. 如果重寫了doSomething()會發生什么呢?
  4. 在第4行中,(myClass1)是否必要?

非常感謝你

您為什么不嘗試查看代碼?

  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方法。 假設在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM