this super

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只是一个指向父类的引用,是一个关键字,但确不是一个隐式参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值