java关键字this和关键字super的总结

java关键字this的总结

this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题;
this可以调用成员变量,不能调用局部变量;
this也可以调用成员方法,但是在普通方法中可以省略this,在构造方法中不允许省略,必须是构造方法的第一条语句。

而且在静态方法当中不允许出现this关键字。

对象创建的过程和this的本质

构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回该类的对象,但这个对象并不是完全由构造器负责创建。创建一个对象分为如下四步:

   1. 分配对象空间,并将对象成员变量初始化为0或空

  2. 执行属性值的显示初始化

  3. 执行构造方法

  4. 返回对象的地址给相关的变量

this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。

this最常的用法:

   1.  在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。

  2. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。

  3. this不能用于static方法中。

this关键字使用练习:

this代表当前“对象”示例

//this关键字练习
public class ThisTest01 {
    //定义三个私有属性
    private int id;
    private  String name;
    private  String address;
    //无参构造
    public ThisTest01() {

    }
    //有参构造
    public ThisTest01(int id, String name, String address) {
        //初始化
        System.out.println("正在初始化已经创建好的对象: "+this);
        this.id = id;
        this.name = name;
        this.address = address;
    }
    public void check(){
        System.out.println("学号:"+id+"姓名"+name+"家庭住址"+address);
        //不写this效果一样
        System.out.println("=============================");
        System.out.println("学号:"+this.id+"姓名"+this.name+"家庭住址"+this.address);

    }
    //主函数入口
    public static void main(String[] args) {
        //实例化对象方式一
        ThisTest01 stu01 = new ThisTest01(  2020  ,"  WanWan  ","  云南昆明");
        //对象访问方法
        System.out.println("打印学生基本信息:"+stu01);
        stu01.check();
        System.out.println("============stu02==============");
        //实例化对象方式二
        ThisTest01 stu02 = new ThisTest01();
        stu02.id=2019;
        stu02.name="晚风花间寺中人";
        stu02.address="CSND博客";
        System.out.println("打印学生基本信息:"+stu02);
        stu02.check();
    }
}


运行结果:

定义的对象,直接输出就是输出地址,

System.out.println("正在初始化已经创建好的对象: "+this);

System.out.println("打印学生基本信息:"+stu01);

正在初始化已经创建好的对象: ThisTest01@506e1b77

可以理解为:stu01=this

同理:

System.out.println("打印学生基本信息:"+stu02);

打印学生基本信息:ThisTest01@37a71e93

正在初始化已经创建好的对象: ThisTest01@506e1b77
打印学生基本信息:ThisTest01@506e1b77
学号:2020姓名  WanWan  家庭住址  云南昆明
=============================
学号:2020姓名  WanWan  家庭住址  云南昆明
============stu02==============
打印学生基本信息:ThisTest01@37a71e93
学号:2019姓名晚风花间寺中人家庭住址CSND博客
=============================
学号:2019姓名晚风花间寺中人家庭住址CSND博客

this()调用重载构造方法

//this关键字练习
public class ThisTest02 {
    int a,b,c;  //成员变量
    //无参构造
    public ThisTest02() {
        System.out.println("这是无参构造器");
    }
    //有参构造
    //重载构造方法
    public ThisTest02(int a, int b) {   //局部变量

        //错误1示范:Method call expected
        //ThisTest02(); //这是无法调用构造方法的

        this(); //调用无参的构造方法,并且必须位于第一行!   Call to 'this()' must be first statement in constructor body
        this.a = a;
        this.b = b;
        System.out.println("这是被调用的构造器");
    }

    public ThisTest02(int a, int b, int c) {
        // 调用带参的构造方法,并且必须位于第一行!
        this(a,b);
//        this.a = a;
//        this.b = b;
        this.c = c;
        System.out.println("这是调用的构造器");
    }
    //定义一个方法
    void show(){
        System.out.println("糟糕!我被别的构造器调用了");
    }
    void study(){
        //在构造器中调用别的构造器,两者效果相同
        this.show();
        show();
        System.out.println("这个假期,你学习java了吗");
    }
    //主函数入口
    public static void main(String[] args) {
        //以下三种初始化方式研究this()调用重载构造方法
        //ThisTest02 stu = new ThisTest02();
        //ThisTest02 stu = new ThisTest02(2,3);
        ThisTest02 stu = new ThisTest02(2,3,4);
        System.out.println(stu);
        stu.study();
    }
}

运行结果:

这是无参构造器
这是被调用的构造器
这是调用的构造器
ThisTest02@b4c966a
糟糕!我被别的构造器调用了
糟糕!我被别的构造器调用了
这个假期,你学习java了吗

super关键字

super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。

  使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。

  若是构造方法的第一行代码没有显式的调用super(...)或者this(...);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。

super关键字练习:

public class TestSuper01 {
    public static void main(String[] args) {
        new ChildClass().f();
    }
}
class FatherClass {
    public int value;
    public void f(){
        value = 100;
        System.out.println ("FatherClass.value="+value);
    }
}
class ChildClass extends FatherClass {
    public int value;
    public void f() {
        super.f();  //调用父类对象的普通方法
        value = 200;
        System.out.println("ChildClass.value="+value);
        System.out.println(value);
        System.out.println(super.value); //调用父类对象的成员变量
    }
}

运行结果:

FatherClass.value=100
ChildClass.value=200
200
100

推荐优质博文:https://www.cnblogs.com/xdp-gacl/p/3636071.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值