Java中this和super关键字的使用总结
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()只能在构造方法的第一行一样,就是为了
对象的初始化一气呵成。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号