0
点赞
收藏
分享

微信扫一扫

总结this与super


本文共1048字,读完大概需要3分钟


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

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

比如:

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

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


class Base{	
    public Base(int age){	
        	
    }	
}	
public class User  extends Base{	
//编译失败	
    public User() {	
    }	
}


提示


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


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


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还可以指代当前对象,比如在同步代码块中


private void test() {	
        synchronized (this) {	
          //doSomething	
        }	
    }


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

总结this与super_父类



举报

相关推荐

0 条评论