(类)java中的this.method和super.method

时间:2015-03-18 18:29:33

标签: java methods super

所以我在超类中有两个方法,在子类中有一个具有相同名称和参数的方法,可以说是public void method()。我在子类中还有另一个方法,名为method1(),如下所示:

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

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

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方法。

2 个答案:

答案 0 :(得分:3)

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

这就是为什么您的((SuperClass)this).method();的行为与this.method()相同。

  

与((SuperClass)这个相比,是不是同样的事情)?

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

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

答案 1 :(得分:0)

不,简而言之(Class)this正在做的是将引用的类型转换为超类,但引用的类保持不变。现在一般来说,如果你有一个指向a的类型的引用,并且你调用了一个覆盖的方法,那么预期的行为是获取重写的方法。所以(Class)this因此没有区别。