文章目录
- 要点
- 错误的理解
- 正确的理解
- 演示代码
要点
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$namethis.bloodColor = bloodColor; // 会编译成Ape$bloodColorsuper.skinColor = skinColor; // 会编译成Ape$skinColorthis.gender = gender; // 会编译成Person.gender}public WhitePerson(String name, int age, String bloodColor, String skinColor) {this.age = age;this.name = name;this.bloodColor = bloodColor; // 会编译成Ape$bloodColorsuper.skinColor = skinColor; // 会编译成Ape$skinColorthis.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.genderSystem.out.println(gender); // 值为"pp"String name = whitePerson1.getName(); // whitePerson1对象中存在两个名为name的变量,分别是Ape$name、WhitePerson$name,方法getName返回的是当前对象中Ape$name的值System.out.println(name); // nullString bloodColor = whitePerson1.getBloodColor();System.out.println(bloodColor); // redWhitePerson whitePerson2 = new WhitePerson("喜太郎", 28, "blue", "yellow", "male");String gender1 = whitePerson2.gender; // 会编译成Person.genderSystem.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
。