(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
因此没有什么不同。
所以我有两个方法,一个在 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
因此没有什么不同。