一、super——this的关系应用
-
this:能调用当前类的属性和方法
super:能调用父类的属性和方法 -
例子:
- 人类(父类)
public class Person {//人类(父类) //属性 protected String name = "chengsiwen"; //方法 public void print() { System.out.println("Person"); } //构造器 public Person() { System.out.println("Person无参构造执行了"); } }
- 学生类(子类)
public class Student extends Person {//学生类(子类) //属性 private String name = "csw"; public void test(String name) { System.out.println(name);//辰巳问(实参 name) System.out.println(this.name);//csw(子类 name) System.out.println(super.name);//chengsiwen(父类 name) } //方法 public void print() { System.out.println("Student"); } public void test1() { print();//Student(默认是当前类方法) this.print();//Student(当前类方法) super.print();//Person(父类方法) } //构造器 public Student() { //隐藏代码:默认调用了父类的无参构造 super();//调用父类的构造器,必须在子类构造器的第一行 //this();与super();都要放在第一个,所有不能同时存在 System.out.println("Student无参构造执行了"); } }
- 测试类
public class Application {//测试类 public static void main(String[] args) { //new (构造器) Student student = new Student(); /* 输出:Person无参构造执行了 Student无参构造执行了 */ System.out.println("===================="); //测试属性 student.test("辰巳问"); System.out.println("===================="); //测试方法 student.test1(); } }
- 人类(父类)
-
super注意点:
- super 是调用父类的构造方法,必须在构造方法的第一个
- super 必须只能出现在子类的方法或者构造方法中!
- super 和 this 不能同时调用构造方法(因为构造方法都要在第一行,起冲突了)
- 如果父类设置了有参构造,无参构造没了,子类中父类无参构造 super(); 用不了,子类的无参构造也用不了 。如果一定要调用子类的无参构造,则把 子类中父类无参构造改为有参构造super(参数) 即可。
-
VS this(对比)
- 代表的对象不同:
——this:本身调用者这个对象(在当前类)
——super:代表父类对象的应用 - 前提:
——this:没有继承也可以使用
——super:只能在继承条件下才能使用(子类使用super调用父类) - 构造方法
——this() :调用的是本类的构造
——super() :调用的是父类的构造
- 代表的对象不同:
-
总结
- super与this一样只能出现在实例方法和构造方法,不能出现在静态方法
- super大部分的时候是可以省略的;只有在父类子类都具有相同的方法和属性时,要调用父类的方法和属性才不能省略super.
- super()和this()都只能出现在构造方法的第一行,不能同时存在
- super()可以通过当前子类的构造方法区调用父类的构造方法,目的是:
创建子类对象时,先要初始化父类的特征
- 子类调用构造方法(创建对象),都会执行父类(Object)的构造方法,则必定会执行super()