- 要点
- 错误的理解
- 正确的理解
- 演示代码
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。
