(class)this.method 和 super.method 在 java

(class)this.method and super.method in java

所以我有两个方法,一个在 superclass 中,一个在 subclass 中,具有相同的名称和参数,比如 public void method()。我在 subclass 中还有另一个名为 method1() 的方法,如下所示:

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

上面的代码在执行时按计划进行(方法 1 使用 superclass 中的方法)但是如果我将其更改为:

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

其中 Class 是 superclass 的名称,出于某种原因它不使用 superclass 方法,而是使用 subclass 的方法一样的名字。 super 和 ((Class)this) 不是一回事吗?为什么会这样?

编辑:这是实际的 class(我添加了实际的代码所以我的问题更清楚了)

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

这是超级class

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

 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,因为调用了 superclass printSize 方法而不是 subclass 的 printSize 方法。

这就是多态性的工作原理(及其 late-binding 机制)。它不考虑引用类型,而是考虑实例的实际类型。

这就是为什么您的 ((SuperClass)this).method();this.method() 表现相同的原因。

Isn't super the same thing with ((SuperClass)this)?

所以不,super((SuperClass)this) 不一样。

通过 super.method() 您正在将控制流移动到可用于超类的 method() 代码,但是通过 (SuperClass)this 您只是在转换引用。

不,简而言之,(Class)this 所做的是将 subclass 的引用类型转换为 superclass,但引用的 class 仍然存在相同。现在一般来说,如果您有一个指向 a 的类型的引用,并且您调用了一个覆盖的方法,则预期的行为是获取被覆盖的方法。所以 (Class)this 因此没有什么不同。