Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-Difference((classType)this).m1()和一个静态引用_Java_Inheritance_Binding - Fatal编程技术网

Java-Difference((classType)this).m1()和一个静态引用

Java-Difference((classType)this).m1()和一个静态引用,java,inheritance,binding,Java,Inheritance,Binding,在Java中,一个对象可以像这样调用父方法:((父)this).m1() 与此有什么区别:fatherf=sonObj;f、 m1() public Father extends Object { public void m1(){} } public Son extends Father { public void m1() { ((Father) this).m1(); } } Java-Difference((classType)this).m1()和一个静态引用 一个

在Java中,一个对象可以像这样调用父方法:
((父)this).m1()
与此有什么区别:
fatherf=sonObj;f、 m1()

public Father extends Object {
public void m1(){}
}

public Son extends Father {
  public void m1() {
    ((Father) this).m1();
  }
}
Java-Difference((classType)this).m1()和一个静态引用

一个细节,但它不是一个静态引用,而是一个引用

在Java中,一个对象可以像这样调用父方法:

这有什么区别:

在这两种情况下,您都调用由
this
sonObj
引用的实例的
m1()
方法。 在您的示例中,这些是
Son
实例。 因此,将调用
Son
m1()
方法的方法

要调用父类的
m1()
方法,应执行以下操作:

public Son extends Father {
  public void m1() {
     super.m1();
  }
}

我建议,您首先尝试运行代码。不要忘记在两个
m1()
中都放一个print语句。不需要显式扩展
Object
类,因为java中的所有类都隐式扩展
Object
类。调用
((父)变量)。m1()
将始终导致son的
m1()
得到执行,因为在java中所有方法都是虚拟的。您试图在son的m1()中执行此操作,甚至会导致
son.m1()
的无限递归,您确定吗?在我的书中,他们是这样做的。他们写道,这和super.m1()一样;在Java中,所有方法都是虚拟的,因此您总是在继承层次结构的顶部调用该方法。当您重写一个方法时,您可以通过调用super来选择使用super类功能,但是除非您在该方法内做额外的工作,否则没有理由调用super,因为如果您没有重写该方法的话。另外,您的类层次结构是错误的,每个父亲都是儿子,因此
父亲
应该扩展
儿子
而不是反过来。((父亲)这一点)。m1()和super.m1是一样的,谢谢。但是,如果我想调用父方法,为什么第一种方法有效呢?我认为它仍然是一个子对象。
((父)this.m1()
super.m1()
不是一回事
((父)this).m1()
调用this
引用的实例的
m1()
方法。如果
this
引用了一个
Son
实例,则将调用
Son
m1()
super.m1()
是一种可供子类调用父方法的能力。
((Father)this).m1(); 
Father f = sonObj; f.m1();
public Son extends Father {
  public void m1() {
     super.m1();
  }
}