JAVA中类和对象的初认识(2)浅谈this和super

java编译器中为每个成员方法增加了一个隐藏的引用类型参数,该参数指向当前对象。

this引用是调用成员方法中当前的对象

this引用的特性:
1.this的类型:对应所引用类的类型引用,即哪个对象调用就是哪个对象的引用类型 

2.在成员方法中使用

3.在成员方法中只能引用当前对象

4.this是”成员方法“第一个隐藏参数,编译器会自动传递,即成员方法执行时,this来接收编译器所传递给该成员方法的该方法对象的引用

注意:this不可以为空(this=null 是错误的),正因为this是表示一个对象的引用,在实例中当你使用this时,说明已经存在一个可以使用this的实例对象了。this作为关键字不可以被作为左值进行赋值。

super关键字主要用来在子类方法中调用父类的成员

super特性:
1.若父类显示定义无参或者默认的构造方法,在子类构造方法的第一行默认有隐含的super()调用,调用父类的构造方法

2.super()调用父类构造时必须是子类构造函数中第一条语句

3.super()在子类构造方法中出现一次,并且不可以和this()同时出现

本次主要谈一谈super()与this()不可以同时出现的问题,但是在此之前我们再扩充一下super与this的相同和不同之处,以便我们在今后的使用中更好的理解这两个关键字。

super与this

相同:

1.都是Java的关键字

2.只能在非静态方法中使用,用来访问非成员方法和字段

3.构造方法中调用必须是第一行不能同时出现

不同:
1.this对当前对象的引用,super对从父类继承下来的部分成员引用

2.非静态成员方法中,this 用来访问本类的方法和属性,super访问父类继承下来的方法和属性

3.this是隐藏的,super不是

4.成员方法中直接访问本类成员时编译之后会将this还原,即本类非静态成员都是通过this来访问的,在子类中如果通过super访问父类成员,编译后在字节码层面super实际是不存在的

5.this()本类构造的引用,super()父类构造的引用,不可同时出现

6.构造方法中一定会出现super()调用,用户不写编译器也会加上,但是this()不写则没有

其实看到这里关于super()与this()不可以同时出现的问题的答案已经显露出来了,但我们在这里还是简单的说一下

public class Demo {
 public static class A{
     public A(){
         System.out.println("A");
     }
 }
 public static class B extends A{
     public B(){
         //编译器在构造方法中未发现有this()或super(),
         //会在第一行加上super()来保证当前对象在实例化前,
         //确保其父类先初始化
         //在这里隐式的调用了super()
         System.out.println("B");
     }

     public B(int num){
         this();//发现有了this()
     }

 }

    public static void main(String[] args) {
        B b= new B();
        B b1= new B(1);
    }

}

所以如果在B类的有参构造方法中的this() 前或后加上super(),就会报错。原因显而易见this()是子类无参构造方法的调用,在这个构造方法中super()已经被隐藏的调用过一次了。所以在进行super()的调用便重复了,而构造方法无疑是只使用一次的。所以this()和super()是不可以同时存在的。

在this()前加上super()

在this()后加上super()

 单走一个super()

 总结:
1.this()和super()是构造方法的引用

2.构造方法只用一次,为避免多次创建对象,同一个方法只能调用一次this()或super()

3.为避免操作时对象还未构建成功,需要this()和super()在调用的第一行实现,来创建对象

指正、点赞即加电子功德,谢谢。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值