所以我有两个方法,一个在超类中,另一个在子类中,具有相同的名称和参数,比如public void method()。子类中还有另一个方法method1(),如下所示:
public void method1()
{super.method();}
上面的代码在执行时按计划进行(方法1使用超类中的方法),但如果我将其更改为这样:
public void method1()
{((Class)this).method();}
其中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方法。
不,简而言之,(Class)所做的
是将子类的引用类型转换为超类,但引用的类保持不变。现在,一般来说,如果你有一个指向 的类型引用,并且你调用了一个重写的方法,则预期的行为是获取重写的方法。所以(类)因此
没有什么不同。
这就是多态性的工作原理(及其后期绑定机制)。它不考虑引用的类型,而是考虑实例的实际类型。
这就是为什么你的((SuperClass)this).method();的行为与this.method()
相同。
超级不是和((超级类)这个)一样吗?
所以不,super
和((SuperClass)this)
通过
super.method()
您将控制流移动到超类可用的方法()
的代码,但通过(Superclass)此
您只是转换引用。
问题内容: 有调用任何区别和(包括性能差)? 问题答案: 唯一重要的是您是否使用例如
问题内容: 假设我们有一个类名Home。是什么区别 Home.this 和 Home.class ?他们指的是什么? 问题答案: 这个 引用该类的当前实例。 此表达式的正式术语似乎是qualified this,如Java语言规范的15.8.4节所引用。 在一个简单的类中,说和将等效。此表达式仅在存在内部类且需要引用封闭类的情况下使用。 例如: 家庭类 将类的表示形式作为对象返回。 此表达式的正式
问题内容: 我敢肯定有一个简单的答案,但是今天是星期五下午,我很累。:( 不知道如何解释它,所以我将继续发布示例代码… 这是一个简单的对象: 这里正在使用它: 一切正常,最后一行除外。当jQuery调用doSomething方法时,它会覆盖“ this”并使其停止工作。 尝试使用也不起作用。 那么,如何以一种允许jQuery调用它并允许该对象与调用jQuery对象一起工作的方式引用该对象自身的属性
问题内容: 从语言设计的角度来看,我想知道为什么Scala删除了Java的类文字(例如)并替换为,但是又添加了带有其Singletons like 而不是like之类的“类型文字” ? 问题答案: 这是我的合理化: classOf [T] 定义为具有此签名的函数: 尽管它是由编译器实现的,但可以使用函数语法 而不必在 语法 上创建任何特殊处理 。因此,这是考虑此选项的原因之一。 这样的替代方案暗示
问题内容: .class文件和.java文件有什么区别?我正在尝试使我的applet正常工作,但是目前我只能在Eclipse中运行它,尚不能嵌入HTML。谢谢 **编辑:那么如何使用JVM进行编译? 问题答案: .class文件是已编译的.java文件。 .java是所有文本,并且易于阅读。 .class是二进制文件(通常)。 通过转到命令行,导航到.java文件并运行,可以将Java文件编译为类
这里的。class是什么,它指定了什么?c和a不同吗?