簡體   English   中英

Java轉換和多態

[英]Java casting and polymorphism

public class A {
  public void x()
  {
    System.out.println("A");
  }
}

public class B extends A {
  public void x()
  {
    System.out.println("B");
  }
}

B b = new B();
A a = (A) b;
a.x();

此代碼顯示“ B”。 你能告訴我為什么嗎? 我認為它將打印“ A”。

B b您創建的新對象的引用 new B()

當您將引用B轉換為A ,該對象將保持不變並保持不變,並且當您調用覆蓋的方法x()時,它的作用完全相同。

只需在代碼中添加這一行並檢查: System.out.println(a.getClass()); 打印class B

    B b = new B();
    A a = (A) b;
    a.x();
    System.out.println(a.getClass()); // prints Class B

因此,基本上,即使將b強制轉換為(A),被調用的方法也將是B 那是多態性 查看對象 ,前提是參考文件符合合同規定。

那是因為 :

這將創建一個新的B類對象,對象引用為b

B b = new B();

在這種情況下, aClass A的對象引用,並且您正在使用a=b ,這意味着a將引用b所引用的同一對象(即Class B的對象),因此這就是為什么要使用a Class B和印刷品B

A a = (A) b;
a.x();

在投射對象時,我們具有以下可能性。1.parent = child 2.child =(child)Parent

public class C {

public static void main(String[] args) {

    B b = new B(); // b is child
    TestPoly t= new TestPoly(); // t is parent
    t=(TestPoly)b;//parent=(parent)child   i.e parent=child
    t.x(); // return B


     b=(B)t; //child=(child)parent i.e  b=t
     b.x(); // return B (because your calling child.x())


     B b1 = new B();//child
     TestPoly a = (TestPoly) b1;//p=(p)c; ie= p=child
     a.x(); //return B
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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