Java this和super关键字
1.this和super的使用区分
this的用法 | 相关代码所在行数 |
---|---|
1.在本类中区分同名的成员变量和局部变量 (调用本类的成员变量) |
50、52 |
2.在有继承关系的类中,区分子类和父类的同名方法 (this调用本类的成员方法) |
57 |
3.在本类的构造方法中调用其它构造方法 |
20、46 |
super的用法 | 相关代码所在行数 |
1.在父类与子类中区分同名的成员变量 (调用父类的成员变量) |
52、54 |
2.在父类与子类中区分同名的成员方法 (super调用父类的成员方法) |
59 |
3.在子类构造方法中调用父类构造方法 |
39 |
public class TestThisAndSuper {
public static void main(String[] args) {
//调用Zi类的有参构造方法
Zi z = new Zi(33);
}
}
class Fu{
//父类
//Fu类的 成员变量
int num = 11;
//Fu类的 无参构造方法
public Fu(){
System.out.println("这是Fu类无参构造方法");
}
//Fu类的 有参构造方法
public Fu(int num){
//调用 Fu类的无参构造方法
this();
System.out.println("这是Fu类有参构造方法");
}
//Fu类的 成员方法
public void method(){
System.out.println("这是Fu类成员方法");
}
}
class Zi extends Fu{
//子类
//Zi类的 成员变量
int num = 22;
//Zi类的 无参构造方法
public Zi(){
//调用 Fu类的有参构造方法
super(20);
System.out.println("这是Zi类无参构造方法");
}
//Zi类的 有参构造方法
public Zi(int num){
//调用 Zi类的无参构造方法
this();
System.out.println("这是Zi类有参构造方法");
//打印 局部变量(构造方法的参数)
System.out.println("Zi类中的局部变量:"+num+"(构造方法的参数)");
//打印 Zi类中的成员变量
System.out.println("Zi类中的成员变量:"+this.num);
//打印 Fu类的成员变量
System.out.println("Fu类中的成员变量:"+super.num);
//调用 Zi类中的method方法
this.method();
//调用 Fu类中的method方法
super.method();
}
//重写 Fu类的method方法
@Override
public void method(){
System.out.println("这是Zi类成员方法");
}
}
来看完这句再往下看:构造方法不属于成员,构造方法是用来初始化对象的
2.为什么this()和super()必须在构造方法的第一行
1.
保证数据加载的完整性
,构造方法中也含有代码(例如赋值和条件判断等),毕竟构造方法也叫方法。
2.对于继承来说,子类得到父类所有成员的前提是,在创建子类对象时必须保证父类首先初始化
简单理解,就是保证初始化的完整性(初始化完成再进行其他操作),维护代码逻辑和结构的合理性
3.为什么静态方法中不能使用this和super关键字
1.
this和super都是代表对象的引用
,静态方法的生命周期和所在类的生命周期是相同的,静态方法加载后对象未必存在。
2.静态方法优先于对象的存在
,如果在静态方法中使用this和super关键字,那么就有可能出现对象还未定义就使用对象的情况。
总结一下,就是静态方法有了而对象还不一定存在,所以this和super不允许在静态方法中使用。
4.为什么要在构造方法内调用构造方法
1.可以在构造方法内编写代码,执行一些操作(例如赋值和条件判断等),毕竟构造方法也叫方法。
2.对于继承来说,子类并不会继承到父类的构造方法
,子类只会继承到父类的成员属性和成员方法。要想调用到父类的成员属性和成员方法,子类必须在构造方法内调用父类的构造方法super()或者其重载形式。
【注意】
子类构造方法默认调用super()
如果几个构造方法的调用构成了循环,编译器是不会编译通过的!
5.如何调用两个父类的构造方法
可以用代码解决的问题就不需要文字了吧 ↓ ↓ ↓
class Fu{
public Fu(){
System.out.println("这是Fu类无参构造方法");
}
public Fu(int num){
//调用 Fu类的无参构造方法
this();
System.out.println("这是Fu类有参构造方法");
}
}
class Zi extends Fu{
public Zi(){
//调用 Fu类的有参构造方法
super(20);
System.out.println("这是Zi类无参构造方法");
}
}
你看,在父类的有参构造方法中,使用this()调用无参构造方法,在子类构造方法中调用父类有参构造方法就实现了,创建子类对象使用即可
【总结】
由于编译器的限制,一个构造方法只能使用一次this()或者super(),只能借助另外一个构造方法来实现多个构造方法的调用
6.为什么成员方法内不能调用构造方法
就像this()和super()只能在构造方法的第一行一样,就是为了
对象的初始化一气呵成
。