前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >总结this与super

总结this与super

作者头像
田维常
发布2019-08-02 09:39:00
6620
发布2019-08-02 09:39:00
举报
文章被收录于专栏:Java后端技术栈cwnait

既然是搞java开发,这两个关键字是入门的时候必学的。但是不能说每个人都一定会一定懂。今天就来聊聊这两个东东。

对象实例化的时候,至少有一条从本类出发抵达Object的通道,而打开这条通道的两个主要的工兵就是this和super,可以说是逢山开路遇水搭桥。其实很多时候this和super往往是默默无闻的,在很多情况下是被省略的。

比如:

  • 本类方法调用本类属性
  • 本类方法调用另一个本类方法
  • 子类构造方法隐含调用super()

任何类在初创期,都有一个默认的空构造方法,同时super方法的一条默认通道。构造方法的参数列表决定了调用通道的选择,如果子类调用父类的某个构造方法,super就会不断往上溯源;如果没有指定,则默认调super方法。如果父类没有提供默认的构造方法,子类集成会报错。

代码语言:javascript
复制
class Base{    public Base(int age){            }}public class User  extends Base{//编译失败    public User() {    }}

提示

代码语言:javascript
复制
Error:无法将类 com.tian.swagger.domain.Base中的构造器 Base应用到给定类型;  需要: int  找到: 没有参数  原因: 实际参数列表和形式参数列表长度不同

如果父类始终没有提供默认的无参构造方法,必须在本类的无参构造方法中使用super方式调用父类的有参构造方法:

代码语言:javascript
复制
class Base{    public Base(int age){
    }}public class User  extends Base{    public User() {        super(1);    }}
  • 一个实例变量可以使用this.赋值另外一个实例变量;
  • 一个实例方法也可以通过this.调用另外一个实例方法;
  • 甚至一个构造方法都可以使用this.来调用另外一个构造方法。
  • 如果this.和super指代构造方法,则必须位于方法的第一行。

换句话说,就是一个方法中this和super只能出现一个,并且只能出现一次,否则实例化对象的时候,会因为子类调用到多个父类构造方法,从而导致混乱。

由于this和super都在实例化阶段调用,所以不能在静态方法和静态代码块中出现this.和super关键字。this还可以指代当前对象,比如在同步代码块中

代码语言:javascript
复制
 private void test() {        synchronized (this) {          //doSomething        }    }

super却不能这么使用。但是super也有自己的特点,在子类中覆写父类方法时候,可以使用super调用父类同名的实例方法,下面总结一下this和super的异同点:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档