java中this :当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。
super:super用来指向某类的父类。
隐式参数this ( this是一个引用 )
class SuperClass { //父类SuperClass
public void voice1(){ //父类中两个方法voice1,voice2
System.out.println("SuperClass voice1");
voice2();
}
public void voice2(){
System.out.println("SuperClass voice2");
}
}
public class SubClass extends SuperClass{ //子类SubClass继承SuperClass
public void voice2(){
System.out.println("SubClass voice2");
}
public static void main(String[] args){
SubClass sub = new SubClass();
sub.voice1();
}
}
运行结果:
SuperClass voice1
SubClass voice2
分析:
创建了子类对象sub后,调用voice1( )方法,但是因为子类SubClass中并没有对voice1( )进行重写,所以只能调用父类的该方法。
虽然看voice1( )是无参的,但是java里有一个隐式参数this,this是指向自身对象的一个引用,所以在运行sub.voice1( )时,实际上是sub.voice1(this) ,在运行到voice2( ) 时,实际上运行的是this.voice2( this ),而因为this为sub对象,所以运行子类的voice2( ) 方法,输出SubClass voice2 。
至于this不能在static方法中使用等等,网上一查一大堆,这里不做过多的赘述。
关键字super
我再网上看了一个视频,老师说this和super 都是作为隐藏的参数传递的,换句话说,执行voice1()方法时,实际上执行的是voice1(this, super) ,为了验证super也是隐藏参数的说法,我把上面的代码稍作调整为:
class SuperClass { //父类SuperClass
public void voice1(){ //父类中两个方法voice1,voice2
System.out.println("SuperClass voice1");
super.voice2(); //将原来的voice2()改为super.voice2()
}
public void voice2(){
System.out.println("SuperClass voice2");
}
}
public class SubClass extends SuperClass{ //子类SubClass继承SuperClass
public void voice2(){
System.out.println("SubClass voice2");
}
public static void main(String[] args){
SubClass sub = new SubClass();
sub.voice1();
}
}
编译直接报错,因为没有找到SuperClass的父类,可以理解,我给SuperClass增加了父类Super_2_Class,代码如下:
class Super_2_Class {
public void voice1(){
System.out.println("Super_2_Class voice1");
voice2();
}
public void voice2(){
System.out.println("Super_2_Class voice2");
}
}
class SuperClass extends Super_2_Class{
public void voice1(){
System.out.println("SuperClass voice1");
super.voice2();
}
public void voice2(){
System.out.println("SuperClass voice2");
}
}
public class SubClass extends SuperClass{
public void voice2(){
System.out.println("SubClass voice2");
}
public static void main(String[] args){
SubClass sub = new SubClass();
sub.voice1();
}
}
如果按照上面的分析来分析super,那么应该执行的是SuperClass的voice2()方法,但是输出的结果却是:
SuperClass voice1
Super_2_Class voice2
所以我们按照this和super都是隐式参数,并按照this的思维来分析super是错误的,那只能说super不是隐式参数,super只是一个指向父类的引用,是一个关键字,但确不是一个隐式参数。