Java中this关键字super关键字总结(通俗语言带你深入了解其中的真谛)

目录

一、前言

二、this关键字

 1.疑点解答

        (1)什么是实例对象

        (2)什么是引用

        (3)实例方法和构造方法以及成员变量和局部变量

2.简单理解

3.使用场景

4。案例讲解

三、super关键字

1.使用场景

2.疑点解答

3.案例分析


一、前言

        对于学习Java的同学们来说,了解this、super我们学习Java的必经之路,只有我们真正的深入了解之后,我们才能将其化为自己的工具,加以使用。本篇博客,将带大家由浅入深,循序渐进的了解他们的本质,脱去其专有名词的外衣,让其与生活接轨。


二、this关键字

        关键字this表示每个实例对象指向自己的引用,可以出现在实例方法和构造方法当中,不能出现在static修饰的类方法(静态方法)当中。

        原因:因为,this相当于对象自己的内存地址,用this就是去找对象那一块空间,static修饰的变量或者方法已经超然脱离对象这一内存范围,你再去对象那一块空间找,肯定找不见。【static关键字的详解见博主的另一篇文章】

 1.疑点解答

        (1)什么是实例对象

        Java中new出来的对象叫做实例,说白了就是这个new出来的“东西”,叫它对象也可以,叫它实例也可以。举个例子:当我们有一个Person类,在这时我们Person zhangsan=new Person()那么zhangsan就是一个实例对象,当我们这个宽范围的类去new出一个实例化的东西(对象)时,那个东西就叫做实例对象

        (2)什么是引用

        当我们每实例化一个对象时,我们的Java就会在内存当中开辟出一块空间来存放这个对象。而引用就是找到这块空间的一张地图。我们就可粗略的将引用当作是一个变量,一个保存这块空间内存地址的一个变量

        (3)实例方法和构造方法以及成员变量和局部变量

         实例方法和构造方法总的来说都为类中的方法,他们只不过有着作用上以及形式上的区别,但回归本质,其都为方法。在此处我们可粗略的认为,在类当中不带static修饰符修饰的方法都可以使用this。(原因见后文)

        成员变量就在类声明之后一开始创建的那几个变量,他们可以作用于类这个成员的任意位置,所以成员变量可以作用在整个类中。而局部变量就是创建在方法这个局部空间中,一旦出了这个局部空间就会失效,故,局部变量只在方法体内有效。

2.简单理解

        this其实就是一个变量,一个保存内存地址的一个变量,而这个内存地址就是其对应new出来的那个东西的。我们可以通过这个“变量”来找到这块内存(对象),从而可以对这个内存当中的对象进行调整。

3.使用场景

1.用在实例方法和构造方法当中

        我们类中的有些方法有时候需要我们的成员变量的一些数据,这些成员变量如同实例对象一样放在了那块内存当中。如果我们要用,我们就得通过this这个保存那块地址的东西才能找见那些数据从而修改使用。

2.区分成员变量和局部变量

        我们有时候在一个方法中定义了一个变量x(局部变量),但类一开始创建的时候也定义了一个x(成员变量),我们有时候就想在这个方法里面就去用或者修改那个成员变量x,这个时候我们就能用this告诉计算机,你用我给你这个地址去找一下实例对象当中的那个成员变量x,这样就区分了局部变量和成员变量。

4.案例讲解

package com.Linhai.Test2;

public class demo {
    public static void main(String[] args) {
        GetSum getSum = new GetSum();
        getSum.getSum(1,2);    //调用getSum方法,并传入1和2两个值
    }
}

class GetSum {
    int x=20;   //成员变量x
    int y;
    int sum;

    public int getSum(int x, int y) {    //局部变量x
        sum=x+y;
        System.out.println("成员变量x的值为:"+this.x);    //用在实例方法当中访问成员变量的值
        System.out.println("局部变量x的值为:"+x);
        System.out.println("getsum这个实例对象的内存地址为:"+this);
        return sum;
    }
}

//输出结果

成员变量x的值为:20
局部变量x的值为:1
getSum这个实例对象的内存地址为:com.Linhai.Test2.GetSum@49e4cb85

Process finished with exit code 0
 


三、super关键字

1.使用场景

        子类在继承父类时,可能会出现变量隐藏、方法覆盖等现象。如果在这时子类需要调用或者访问父类被隐藏的变量或者方法时,就会需要super关键字。

  1. 用来访问父类被覆盖的方法
  2. 用来调用父类中被隐藏的成员变量
  3. 用来调用父类当中的构造方法(包括有参、无参等)

2.疑点解答

        变量隐藏:指子类的成员变量与父类的成员变量具有相同的名字时,此时,调用该成员变量,默认调用子类的成员变量,而父类的成员变量亦被称作是“变量被隐藏”。

        方法覆盖:子类的方法名和父类的方法名一样,方法的返回值类型,入口参数的数目、类型、数据均相同,只是方法的实现功能不同时,此时父类的方法就会被隐藏,而在调用该方法时,默认调用子类的方法,而父类的方法因被隐藏而无法调用。

        不严谨分析:我们也可以将super类似this的理解方式,super也是一个变量,这个变量保存的是父类的实例对象的地址,我们可以根据这个地址的,精确的寻找到父类藏起来的方法以及变量,将其揪出,修改使用。

3.案例分析

package com.Linhai.Test2;

public class Test {
    public static void main(String[] args) {
        Students students = new Students();
    }
}

class People {
    String address = "中国";   //默认中国人地址在中国

    public void toDo() {
        System.out.println("这是父类toDo方法");
    }
}

class Students extends People {
    String address = "山西";   //默认太原理工大学人在山西

    public Students() {
        System.out.println("调用子类的局部变量" + address);
        System.out.println("调用被隐藏父类的局部变量" + super.address);
        super.toDo();    //调用父类的toDo方法
        toDo();          //没使用super调用的是子类的toDo方法
    }

    @Override//方法重写
    public void toDo() {
        System.out.println("这是子类toDo方法");
    }
}

输出结果:

调用子类的局部变量山西
调用被隐藏父类的局部变量中国
这是父类toDo方法
这是子类toDo方法 


编写不易,如有帮助点赞收藏,如有问题可联系博主qq2280006919

@Hanpig编写

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值