当前位置: 首页 > 知识库问答 >
问题:

Java中的(class)this.method和super.method

从劲
2023-03-14

所以我有两个方法,一个在超类中,另一个在子类中,具有相同的名称和参数,比如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方法。

共有2个答案

南宫浩皛
2023-03-14

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

景品
2023-03-14

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

这就是为什么你的((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不同吗?