java中的super的使用和this的比较
1. super关键字的使用
(1)super是一个关键字。
(2)super和this很类似,我们对比着学习。
2. 回顾构造器(构造方法)
在说清楚之前,我还需要回顾一下构造器的知识,也就是构造方法。主要是以下两点:
-
所谓构造器就是在创建完一个类之后,当我们new一个对象时,会自动的产生一个与类名字相同,没有返回值类型,也不能写void的一个方法。
-
我们可以自定义有参构造方法,但是当我们定义有参构造方法以后,无参构造方法就无法隐式的执行了,要想调用无参构造方法,就需要在类中显式的定义一个无参构造方法(这是一个好习惯)。
3. this关键字的功能和作用
this关键字的三大应用:
-
this调用本类中的属性,也就是类中的成员变量;
-
this调用本类中的其他方法;
-
this调用本类中的其他构造方法,调用时要放在构造方法的首行。
4. super关键字的功能和作用
super关键字的应用:
- super 可以在子类中调用父类可以访问的方法,比如public修饰的方法
- 可以使用super()在子类中调用父类的无参构造方法。
5.为什么要引入this关键字和super关键字
当子类继承了父类以后,子类就拥有了本类所有的属性和方法 ,同时也继承了父类的一些方法。这时,如果子类的方法中有和父类中相同的方法名时,就可以使用super来调用从而区分子类的方法和父类的方法。
6. 在子类中使用this关键字和super关键字来调用构造方法
- 子类继承父类以后,new一个对象后,子类会执行子类的无参构造方法,但是在子类的第一行,有默认的 super();这行代码也就是要先执行父类的无参构造方法,再执行本类中无参构造方法中以下的代码。
- super必须只能出现在子类的方法中或构造方法中
- super 和 this不能同时调用构造方法
- super调用构造方法时只能出现在代码的第一行,如果不是就会报错。
- this能调用本类中的所有属性和方法,但是static修饰的除外。
7.举个例子
案例5-1
Person类的代码
package com.oop.Dem05;
public class Person {
//无参构造方法
public Person(){
System.out.println("我是Person的无参构造方法");
}
}
Student类代码
package com.oop.Dem05;
public class Student extends Person{
public Student(){
System.out.println("我是student的无参构造方法");
}
}
main()函数的代码
package com.oop.Dem05;
public class Application {
public static void main(String[] args) {
Student student=new Student();//new一个对象
//student.say();
//System.out.println(student.money);
}
}
执行结果为
执行的结果我们可以知道student 类在执行自己的构造器代码之前,首先执行了父类Person类的构造方法,然后执行以下的代码。
我们也可以在第一行写出sperm();这行代码,输出的结果是一样的,如果在将super() ;这行代码放到Studnet构造方法中的最后一行,就会报错。同时,this()是执行本类的构造方法,和super()一样都只能放到第一行,所以this()和super()不能同时在一个方法中使用。
但是我们可以定义一个有参构造方法,可以使用super.方法名调用,定义了有参构造方法以后,无参构造方法就没有,这时我应该显示的定义一个无参构造方法,不然在调用无参构造方法时会报错。这是一个非常好的习惯。