所以我在超类中有两个方法,在子类中有一个具有相同名称和参数的方法,可以说是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方法。
答案 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
因此没有区别。