super和this关键字的详解
this关键字
this关键字主要有三个作用
- this调用本类中的属性,也就是类中的成员标量。
- this调用本类中的其他方法。
- this调用本类中的其他构造方法,需要放在构造方法的首行。
- 引用成员变量
-
Public Class Student { String name; private void SetName(String name) { //定义一个参数(局部变量)name this.name=name; //将局部变量的值传递给成员变量 } }
-
- 调用类的构造构造方法
-
public class Student { //定义一个类,类的名字为student。 public Student() { //定义一个方法,名字与类相同故为构造方法 this(“Hello!”); } public Student(String name) { //定义一个带形式参数的构造方法 } }
-
super关键字(使用场景:必须在出现继承的类中才能使用)
- super调用父类构造器
- super调用普通方法
- super调用父类构造方法
- 案例分析
-
class pareant{ 10 public pareant(){ 11 System.out.println("这是父类的构造方法"); 12 } 13 } 14 15 class person extends pareant{ 16 public person(){ 17 super(); 18 System.out.println("这时子类构造方法"); 19 } 20 } 21 22 public class SuperTest{ 23 24 public static void main(String args[]){ 25 person p = new person(); 26 } 27 } 28
终端输出:
- 这是父类的构造方法
这时子类构造方法
- 这是父类的构造方法
-
- 注意
- 当父类存在无参构造器时,当调用子类无参构造器时,系统会自动在子类无参构造器前加上super(),表示先调用父类的无参构造器。此时super语句乐意省略,此时子类可以使用this调用构造方法
- 当弗雷不存在无参构造器时,必须在子类构造方法中使用super(参数),明确指定调用父类的拿一个构造器。此时super不能省略,并且此事子类不能使用this调用自身的构造方法
- 案例分析
-
class Person{ private String name; private int age; public Person(String name){ this.name = name; } public Person(String name, int age){ this(name); //this调用构造方法必须放在第一行,这里这样写是为了避免代码重复 this.age = age; } public Person(){ System.out.println("1.Person类的构造方法"); } } class Student extends Person{ private String school; public Student(){ super("yy"); System.out.println("Student类的构造方法"); } public Student(String school){ this(); //super("yy"); //对super的调用必须在构造方法的第一行 System.out.println("2.Student类的构造方法"); } } public class Test{ public static void main(String[] args){ Student stu = new Student("beida"); } }
终端的输出
-
Student类的构造方法
2.Student类的构造方法
-
- 注意
-
父类含有无参构造方法,所以在子类中可以使用this关键字来调用子类的构造方法,此时得省去super语句,免得跟this冲突,但省去后系统依旧会帮你加上,但不会报错,若不省去则会报错
-
-
- 案例分析
笨鸟先飞