欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文原文阅读:https://honeypps.com/java/java-lime-light-of-this-and-super/

使用super和this应该注意这些:

1)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
3)super()和this()均需放在构造方法内第一行。
4)尽管可以用this调用一个构造器,但却不能调用两个。
5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

为什么this或者super要放到第一行?

this() super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。

如下:

class A{public A(String name){System.out.println(name);}
}class B extends A{public B(String name) {super(name);}}

class A中没有构造无参的构造函数,如果在class B中的构造函数如果没有调用super(name)将会报错。

假如我们允许把this 和super放置到任何位置。那么请看下面代码:

class A{    A()   {       System.out.println("You call super class non-args constructor!");  }
}class B extends A{     B()     {    //这里,编译器将自动加上 super();              System.out.println("You call subclass constructor!");      }                  B(String n)       {               super();               this();//ERROR:编译错误//实际就是调用了B(){...},而在B(){...}中编译器自动加上了super();这样就相当于两次调用了super();也就是说对父类进行了两次初始化。而在实例化一个对象时,一个构造方法只能调用一次,这说明this和super不能同时存在一个构造方法中。同时因为系统没有在第一行发现this()或super()调用,就会自动加上super(),如果没有将this()和super()放在第一行就会产生矛盾。因为总有一个super()在第二句上。所以该程序不能通过编译!!!  }}

也就是说你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。无法执行当前的类的构造器。也就不能实例化任何对象,这个类就成为一个无为类。

从另外一面说,子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,应为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。
因此,this()或者super()必须放在第一行。

欢迎跳转到本文原文阅读:https://honeypps.com/java/java-lime-light-of-this-and-super/

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

Java中this()和super()的注意点相关推荐

  1. JAVA中this和super用法

    参考网上资料和自行理解总结java中this和super中各自用法及其差异 <一>. this的用法 构造方法是创建java对象的重要途径,通过new关键字调用构造器时,构造器返回该类的对 ...

  2. java底层原理书籍_阿里面试题:Java中this和super关键字的底层实现原理

    知道的越多,不知道的就越多,业余的像一棵小草! 编辑:业余草 来源:https://www.xttblog.com/?p=5028 B 站:业余草 最近一个粉丝加我说,接到了阿里的面试,问问我阿里会面 ...

  3. Java中this与super的区别

    2019独角兽企业重金招聘Python工程师标准>>> this与super关键字在java中构造函数中的应用:  ** super()函数 **  super()函数在子类构造函数 ...

  4. [转载] Java中this和super关键字分别是什么意思

    参考链接: Java中的Super关键字 this和super关键字 this是自身的一个对象,代表对象本身可以理解为指代当前的对象,它可以调用当前对象的属性.方法和构造方法,一般情况下可以省略,必须 ...

  5. Java 中this和super的用法总结

    这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this ...

  6. 一句话搞懂Java中this和super的实现原理

    写在前面 本文隶属于专栏<100个问题搞定Java虚拟机>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java ...

  7. Java中this和super的对比

    使用super的注意事项 super调用父类的构造方法,必须写在构造方法中第一个 super只能出现在子类的方法中 super和this不能同时使用构造方法,因为这两个都要求必须写在构造方法中第一个 ...

  8. java中this和super是否可以同时使用

    1.super从子类中调用父类的构造方法,this()在同一类内调用其它方法.  2.尽管可以用this调用一个构造器,但却不能调用两个  3.this和super不能同时出现在一个构造函数里面,因为 ...

  9. Java中this、super关键字的用法

    一.this关键字代表当前对象的引用,用在当前类中,有三个方法: this()代表在当前类中调用其他的构造方法,并且只能在构造方法中写,只能调用一次,只能写在第一行. this.date代表访问当前类 ...

最新文章

  1. Harris角点检测原理详解(转载)
  2. 求1!+2!+3!+....20!的值
  3. python input函数的应用(接收用户的输入)
  4. Spring Boot从Controller层进行单元测试
  5. 国家哲学社会科学文献中心
  6. 《我们不一样团队》项目需求分析改进
  7. JQuery中$.ajax()方法参数详解 转载
  8. 服务器远程桌面日志,Windows记录远程桌面3389登录日志
  9. 数字格式化输出NumberFormat
  10. 借助易宝实现Java版网上在线支付
  11. 混合非线性整数规划matlab,非线性整数规划matlab
  12. JAVA学习总结-day1
  13. 中国身份证号码验证,支持15 18位,可验证成功90 的身份证号
  14. 新旭完成总金额达美金4,000万元C轮融资;波士顿科学两款创新产品同时进入创新医疗器械特别审查程序 | 医药健闻...
  15. Proxmox VE 7.2 更改登录横幅
  16. Hadoop入门及官网教程
  17. 消失的中国互联网元老陈天桥:为神经科学捐助10亿,不担心机器人崛起
  18. android 仿qq 通讯录,Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展[图文+源码]...
  19. C++ 探索之旅 | 第一部分第二课:C++ 编程的必要软件
  20. java导出excel 序号_Java 实现导出excel表

热门文章

  1. 把c++语言转换为go的工具_V,新编程语言来袭!与Go类似,跟C一样快
  2. 200910阶段一C++虚析构
  3. 为Ubuntu Linux安装Docker CE Edge
  4. 二分求幂,快速求解a的b次幂
  5. winform下 PictureBox 显示网络图片
  6. [C++基础]025_虚函数和虚函数表
  7. 泛微协同“风暴”席卷高端市场
  8. 牛客多校7 - Pointer Analysis(模拟)
  9. 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...
  10. 安卓入门系列-04常见布局之LinearLayout(线性布局)