您当前的位置: 首页 >  Java

liaowenxiong

暂无认证

  • 3浏览

    0关注

    1171博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java中的关键字this_super

liaowenxiong 发布时间:2021-08-11 17:59:07 ,浏览量:3

文章目录
  • 要点
  • 错误的理解
  • 正确的理解
    • 演示代码

要点

1.在类的构造器中,可以使用 this() 调用本类的其它构造器,调用的时候根据构造器声明的参数列表传递参数值

2.super() 调用父类的无参构造器

3.super.method() 调用父类的 method() 方法

4.super.name 访问父类的变量 name

5.使用 this()super() 调用构造器,必须写在构造方法体内,且必须写在第一个语句中

6.this()super() 不可以同时存在构造方法体内

错误的理解

1.this 表示当前对象

2.this 表示当前对象中的本类的资源

3.super 表示当前对象中继承自父类的资源

4.this 就是一个局部变量,保存当前对象的引用地址

正确的理解

1.this 表示本类的含义 2.super 表示父类的含义

演示代码

类 Ape:

package priv.lwx.javaprac.lambda;

public class Ape {
    String bloodColor;
    String name;
    String skinColor;
    private int age;

    public String getBloodColor() {
        return bloodColor; // 会编译成Ape$bloodColor
    }

    public String getName() {
        return this.name; // 会编译成Ape$name
    }
}

类 Person:

package priv.lwx.javaprac.lambda;

public class Person extends Ape {
    static String gender = "pp";
}

类 WhitePerson:

package priv.lwx.javaprac.lambda;

public class WhitePerson extends Person {
    private int age;
    private String name;
    public WhitePerson() {

    }

    public WhitePerson(String name, int age, String bloodColor) {
        this.name = name;
        this.age = age;
        this.bloodColor = bloodColor;
    }

    public WhitePerson(String name, int age, String bloodColor, String skinColor,String gender) {
        this.age = age;
        this.name = name; // 会编译成WhitePerson$name
        this.bloodColor = bloodColor; // 会编译成Ape$bloodColor
        super.skinColor = skinColor; // 会编译成Ape$skinColor
        this.gender = gender; // 会编译成Person.gender
    }

    public WhitePerson(String name, int age, String bloodColor, String skinColor) {
        this.age = age;
        this.name = name;
        this.bloodColor = bloodColor; // 会编译成Ape$bloodColor
        super.skinColor = skinColor; // 会编译成Ape$skinColor
        this.gender = gender; // 会编译成Person.gender,值为"pp"
    }

    public int getAge() {
        return age;
    }

    public String getBloodColor() {
        return this.bloodColor; // 会编译成 return Ape$bloodColor
    }

}

演示类 Demo02WhitePerson:

package priv.lwx.javaprac.lambda;

public class Demo02WhitePerson {
    public static void main(String[] args) {
        WhitePerson whitePerson1 = new WhitePerson("西太隆", 38, "red", "white");

        String gender = whitePerson1.gender; // 会编译成Person.gender
        System.out.println(gender); // 值为"pp"
        String name = whitePerson1.getName(); // whitePerson1对象中存在两个名为name的变量,分别是Ape$name、WhitePerson$name,方法getName返回的是当前对象中Ape$name的值
        System.out.println(name); // null

        String bloodColor = whitePerson1.getBloodColor();
        System.out.println(bloodColor); // red

        WhitePerson whitePerson2 = new WhitePerson("喜太郎", 28, "blue", "yellow", "male");
        String gender1 = whitePerson2.gender; // 会编译成Person.gender
        System.out.println(gender1); // male


    }
}

举例说明:

假设构造方法中有这句代码 this.name = name,等号左边部分 this.name 在编译时,编译器会在本类 WhitePerson.java 中查找是否存在变量 name,如果存在还会继续判断是不是静态的变量,如果是静态的变量会编译成 WhitePerson.name 这样的语法格式;如果不是静态的变量,则会编译成 WhitePerson$name 这样的语法格式,表示这个变量 name 是来自于类 WhitePerson

如果本类 WhitePerson 中找不到变量 name,则会往上查找,如果找到顶层的父类还是找不到,则会报编译错误。假设在父类 Person 中找到了变量 name,同样会判断是不是静态的变量,如果是则会编译成 Person.name 这样的语法格式;如果不是静态的变量,则会编译成 Person$name 这样的语法格式,表示这个变量 name 是来自于类 Person

假设最后编译成 Person$name = name 这样的语法格式,那么在运行时,JVM 会去当前对象中查找来自于类 Person 的变量 name,再将参数 name 的值赋值给变量 Person$name

假设构造方法中有这句代码 super.name = name,等号左边部分 super.name 在编译时,编译器会在父类 Person.java 中查找是否存在变量 name,如果存在会继续判断是不是静态的变量,如果是静态的变量则会编译成 Person.name 这样的语法格式;如果不是静态的变量,则会编译成 Person$name 这样的语法格式,表示这个变量 name 是来自于类 Person

同样地,如果父类 Person 中找不到变量 name,也会往上查找,如果找到顶层的父类还是找不到,则会报编译错误。假设在 Person.java 的父类 Ape.java 中找到了变量 name,接着判断该变量是不是静态的,如果是静态的则会编译成 Ape.name;如果不是静态的,则会编译成 Ape$name,表示变量 name 来自于类 Ape

假设最后编译成 Ape$name = name 这样的语法格式,那么在运行时,JVM 会去当前对象中查找来自于类 Ape 的变量 name,再将参数 name 的值赋值给变量 Ape$name

关注
打赏
1661566967
查看更多评论
立即登录/注册

微信扫码登录

0.0431s