簡體   English   中英

Java中的(類)this.method和super.method

[英](class)this.method and super.method in java

因此,我有兩種方法,一個在父類中,一個在子類中,具有相同的名稱和參數,可以說是public void method()。 我在子類中還有另一個方法method1(),如下所示:

public void method1() 
{super.method();}

上面的代碼在執行時按計划進行(如果我將其更改為該方法,則method1使用超類的方法):

public void method1() 
{((Class)this).method();}

由於某些原因,Class是超類的名稱,它不使用超類方法,而是使用具有相同名稱的子類的方法。 ((Class)this)是不是超級相同的東西? 為什么會這樣?

編輯:這是實際的類(我添加了實際的代碼,所以我的問題更加清楚)

public class MWindow extends Window
{
  private String message = "No message";
  protected int size = 7;
  public MWindow(String message)
  {
   size = 2;
   this.message = message;
   System.out.println ("Window message = " + message);
  }
  public MWindow(int size, String message)
  {
   super(size);
   this.message = message;
   System.out.println ("Window message = " + message);
  }
  public void setSize1(int y)
  {size = y;}
  public void setSize2(int z)
  {super.setSize (z);}
  public void printSize()
  {System.out.println ("MSize="+size);}
  public void printSize1()
  {System.out.println(((Window)this).size);} 
  public void printSize2()
  {((Window)this).printSize();} 
}

這是超類

public class Window
{
  protected int size;
  public Window()
  {
  size=1;
  System.out.println("Window size="+size);
  }
  public Window(int size)
  {
  this.size=size;
  System.out.println("Window size="+size);
  }
  public void setSize(int x)
  {size += x;}
  public void printSize()
  {System.out.println("Size=" + size);}
} 

這是main()類

 public class RunWindow
{
  public static void main (String[] args)
  {
   Window w1=new Window();
   Window w2=new Window(2);
   System.out.println(w1.size);
   System.out.println(w2.size);
   MWindow mw1=new MWindow("First MWindow");
   MWindow mw2=new MWindow(3, "Second MWindow");
   System.out.println(mw1.size);
   System.out.println(mw2.size);
   mw1.setSize1(4);
   System.out.println(mw1.size);
   mw1.setSize2(2);
   System.out.println(mw1.size);
   mw1.setSize(2);
   System.out.println(mw1.size);
   w1.printSize();
   mw1.printSize();
   mw1.printSize1();
   mw1.printSize2(); 
  }
}

執行以上操作,我們得到:

Window size=1
Window size=2
1 
2
Window size=1
Window message = First MWindow
Window size=3
Window message = Second MWindow
2
7
4
4
4
Size=1
MSize=4
5
MSize=4 

問題在於,最后的結果應該是Size = 5而不是MSize = 4,因為調用了超類printSize方法,而不是子類的printSize方法。

這就是多態性(及其后期綁定機制)的工作方式。 它不考慮引用類型,而是實例的實際類型。

這就是為什么你的((SuperClass)this).method(); this.method()行為相同。

與((SuperClass)this)超級不同嗎?

所以不, super((SuperClass)this)這不一樣。

通過super.method()您可以將控制流移動到可用於超類的method()代碼中,但是通過(SuperClass)this您僅是轉換引用。

不,總之, (Class)this是將類的引用類型轉換為超類,但是被引用的類保持不變。 現在,通常,如果您有一個指向a的類型引用,並且您調用了一個覆蓋的方法,則預期的行為是獲取被覆蓋的方法。 因此, (Class)this沒有什么不同。

暫無
暫無

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

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