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()在调用的第一行实现,来创建对象
指正、点赞即加电子功德,谢谢。