博客
关于我
Java中this关键字和super关键字用法----详解
阅读量:321 次
发布时间:2019-03-04

本文共 2159 字,大约阅读时间需要 7 分钟。

构造方法中的this关键字

构造方法是一个类的对象在通过new关键字创建时自动调用的特殊方法。在Java中,构造方法有其独特的调用方式,与普通方法不同。然而,如果一个类有多个构造方法,调用其他构造方法时需要使用this关键字。以下是使用this关键字在构造方法中的注意事项。

第一,this关键字只能在构造方法中使用,不能在普通方法中使用。第二,在构造方法中使用this调用其他构造方法时,不能进行递归调用,即不能直接或间接地调用自己或同一个构造方法。第三,通过this调用其他构造方法必须放在构造方法的第一行执行,否则会导致语法错误。同样,super用于调用父类构造方法也必须放在构造方法的第一行,因此在一个构造方法中不能同时使用this和super。

在非构造方法中,this关键字用于访问类中的成员变量和成员方法。具体来说:

  • this.xxx; 用于访问类中的成员变量xxx。
  • this.yyy(paras…); 用于调用类中的成员方法yyy。
  • this; 用于表示当前类对象的引用。
  • 需要注意的是,通过this访问的成员变量和方法可以访问本类中所有的成员,包括private成员。然而,通过this访问static成员可能会产生警告,因为static成员可以通过类名直接访问。

    在继承关系中,this关键字的含义可能会因上下文而有所不同:

  • this(paras…); 调用的是父类的构造方法,无论子类是否有该参数的构造方法。
  • this.xxx; 访问的是父类中的成员变量xxx。
  • this.yyy(paras…); 如果子类重写了yyy方法,则访问子类的方法;否则,访问父类的方法。
  • this; 表示的是子类对象的引用。
  • 以下是一个示例:

    public class ClassTest {public static void main(String[] args) {Child child = new Child();child.show();}}

    class Parent {public String str;Parent() {this(1);}Parent(int a) {this.str = "Parent";this.show();}public void show() {System.out.println(this.str);}}

    class Child extends Parent {public String str;Child() {}Child(int a) {str = "Child";}public void show() {System.out.println(str);super.show();}}

    在这个例子中,当使用new Child()时,Child类的无参数构造方法会调用Parent类的无参数构造方法。Parent类的无参数构造方法会调用Parent(int)构造方法,进而赋值Parent类的str字段为"Parent"。接着,Parent(int)构造方法会调用show()方法,打印"Parent"。

    当调用child.show()时,Child类的show()方法会先打印自己的str字段(null),然后调用super.show(),打印Parent类的str字段("Parent")。因此,输出为null, Parent。

    如果将new Child(1)改为new Child(),则结果会有所不同。Child(int)构造方法会赋值自己的str字段为"Child",然后调用super.show(),打印自己的str字段("Child"),再打印Parent类的str字段("Parent")。因此,输出为null, Child, Child, Parent。

    super和this的区别

    super和this在Java中是不同的概念。在代码中,super和this表示不同的对象引用。super表示父类的引用,而this表示当前类对象的引用。例如:

    public class ClassConstructorTest {public static void main(String[] args) {Child child = new Child();child.show();}}

    class Parent {private Parent mSelf;Parent() {mSelf = this;}public void show() {System.out.println(this.getClass().getName());System.out.println(super.getClass().getName());System.out.println(mSelf.getClass().getName());}}

    class Child extends Parent {public void show() {System.out.println(this.getClass().getName());System.out.println(super.getClass().getName());super.show();}}

    转载地址:http://qhhq.baihongyu.com/

    你可能感兴趣的文章
    python判断文件是空的,如果是空的,就删除
    查看>>
    python判断密码是否正确_python密码判断是否符合要求的方法
    查看>>
    python判断字符串包含中文_Python 判断字符串是否包含中文
    查看>>
    python删除第一行_Python 乱码指北:一行删掉根目录
    查看>>
    Python删除列表元素的三种方法
    查看>>
    python初步学习-python数据类型-集合(set)
    查看>>
    python列表生成字典_Python中将字典转换为列表的方法
    查看>>
    python列表对应元素合并为列表及判断一个列表是几维
    查看>>
    python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
    查看>>
    python列表前几个_python之列表
    查看>>
    python列表元组
    查看>>
    Python列表/元组/字典和集合使用
    查看>>
    python列表 行列选择_python_pandas_dataframe_行列选择_切片操作
    查看>>
    python列表
    查看>>
    python列出当前目录、子目录和文件的脚本
    查看>>
    python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
    查看>>
    Python切片对象和__getitem__
    查看>>
    python+flask计算机毕业设计高校体育竞赛成绩管理系统的设计与实现(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体育赛事系统(程序+开题+论文)
    查看>>