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()只能在构造方法的第一行一样,就是为了对象的初始化一气呵成

猜你喜欢

转载自blog.csdn.net/weixin_44580492/article/details/106245423
今日推荐