Java的中this和super以及this()和 super()

本文详细介绍了Java中this和super的关键字用法。this用于区分实例变量和局部变量,引用当前对象。super则用来访问父类的成员变量和构造函数,特别是在子类中调用父类的方法或构造时。在构造函数中,this()用于调用同一类中其他构造函数,super()用于调用父类的构造函数,且必须位于首行。
摘要由CSDN通过智能技术生成

Java中的this和super以及this()和 super()

1、this关键字

package Day04.study;

public class Student {
    public String name;
    public void setName( String name) {
        this.name = name;
    }
    public String getName( ) {
        return name;
    }

}

上述代码是常见的javabean的定义,经常会出现this关键字,为什么这里需要用this这个关键字?
若将上述的代码修改一下:

package Day04.study;

public class Student {
    public String name;
    public void setName( String name) {
        name = name; // 这里把this去掉,变成了name=name
    }
    public String getName( ) {
        return name;
    }

}

把setName方法里的this.name的this去掉,变成了name=name,就会发现个问题,这两个name都是局部变量的name,这就变成了局部变量给局部变量赋值了, 但我们需要给对象的name赋值,并不是给局部变量赋值,由于名称一样导致区分不出来了。

因此必须用this来区分一下;如果两个不重名的话,name=n这种的不加this是没问题的,这是因为它是先在局部找变量,如果找到了就用局部变量,没找到就去找全局变量。

2、this的实际意义

this是当前对象的引用,就是说当前用构造函数建的对象是谁,这个this就代表谁,它是一个引用。

还有一个问题,如果构造函数想调用另一个构造函数该怎么办呢?
此时就需要使用this()了

    public Student (int id) {
        this.id= id;
    }
    public Student (int id,String name) {
        this (id) ;  // 这个this(id)就是调用上边的构造函数
        this.name = name;
    }

注意:如果在构造函数里调用其他重载的构造函数时,则被调用的那个构造函数必须放在代码的第一行,否则报错!!

	public Student (int id) {
        this.id= id;
    }
    
    public Student (int id,String name) {
        this.name = name;
        this (id) ;//this(id)放第二行报错
    }

在这里插入图片描述

3、super关键字

package Day04.study;

    public class Fu {
        int num =4 ;
        public void show ( ) {
            System.out.println ( "fu in here" );
        }
    }

package Day04.study;

public class Zi extends Fu {
    public void showNum ( ) {
        System.out.println ( "showNum="+num) ;
    }
    public void show ( ) {
        System. out.println ( "zi in here" ) ;
    }

public static void main ( String [ ] args) {
        Zi zi = new Zi( ) ;
        zi.showNum( ) ;
    }

}

上述示例是父类里定义了一个字段是num,子类里没有定义,所以最后的输出结果是showNum=4

在这里插入图片描述

但是,若子类也定义了一个num值为44,那打印出来的一定是44,因为在调用成员(包括成员变量和成员方法)时 ,如果不特殊标明,前边其实默认省略了this,他默认调用的是子类的

在这里插入图片描述

如若这时想用父类的,而不想用子类的,该怎么办呢?
这时候又出现了区分不出来的情况,所以要用super来标明你要调用父类的,而不是子类的

public class Zi extends Fu {
    int num = 44;

    public void showNum() {
        System.out.println("showNum=" + super.num);
    }

    public void show() {
        System.out.println("zi in here");
    }

    public static void main (String[ ]args){
            Zi zi = new Zi();
            zi.showNum();

    }
}

在这里插入图片描述

当只有父类有,子类没有的情况下,则调的是父类的(因为子类继承了父类,子类就拥有了父类除了私有private外的所有东西);当父类和子类都有的情况下,则默认调用的是子类的,如果用super标明了,则调的是父类的
在这里插入图片描述
如上面关系图所示,this和super的引用是这样指向对象的成员变量和方法:

this不仅指向了子类的成员变量和方法,它还指向了子类从父类继承过来的变量和方法;而super仅仅只是指向了子类从父类继承的成员变量和方法。

如果子类构造函数想调用父类的构造函数,该怎么办呢?
这时候就要用到super();了.

注意:在子类的构造函数里都必须去调用父类的构造函数,你不写其实第一行都有一个隐式的super();

package Day04.study;

    public class Fu {
        int num =4 ;
        public void show ( ) {
            System.out.println ( "fu in here" );
        }
        public Fu (int num) {
            this.num = num;
        }

    }

package Day04.study;

public class Zi extends Fu {
    int num = 44;

    public Zi() {  // 报错
    }

    public Zi(int num) {  // 报错
    }
}

在这里插入图片描述

如上图所示,若父类里不定义无参的构造的话,子类的构造函数会报错,所以说明在子类的构造函数默认的都有一句隐式的super();去调用父类无参的构造,但是如果你的构造函数里不想调用默认的父类无参构造,而是想调用父类其他的构造函数,则可以显式的写出来,并且如果你写了则调用父类的supper(xxx) 必须放在第一行,否则报错!!

public class Zi extends Fu {
    int num = 44;

    public Zi(){
        System.out.println ( "zi") ;
        super(44);// 不是放在第一行,报错
    }
    public Zi (int num) {
        super (44);// 放在第一行,正确
        this.num = num;
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值