一、super关键字的作用
1、子类在构造方法中显示调用父类构造方法
super可以在子类的构造方法中显示调用父类的构造方法;并且这行代码必须出现在子类构造方法的第一行。原因:因为父类构造方法没有执行之前父类的属性和方法还没有被创建,则子类不能继承父类的属性和方法,因此子类的构造方法不能被执行。
/** * 子类:构造方法的第一行要保证显示或者隐式的调用构造方法 * @author Administrator * */ public class Teacher extends Person { //继承自父类的空构造函数 public Teacher() { } public Teacher(String name, int age, String gender) {
//1. 出现在子类构造函数的第一行,用于调用父类的构造方法 super(name, age, gender); } private String course; public void teach() { System.out.println("教..."); } }
2.可以在子类中充当临时父类对象
可以在子类内部代表父类对象,从而在子类中访问父类的属性和方法。
class Person01 { private String name; private int age; public void say() { System.out.println("人说...."); return null; } public void eat() { System.out.println("人吃...."); } } class Teacher01 extends Person01 { @Override public C say() { System.out.println("老师在一本正经的说..."); return null; } //注解的作用:防止开发者误写,起到提示作用 @Override public void eat() { System.out.println("洗个手"); //2. super作用:super类似于父类的虚拟对象 super.eat(); System.out.println("抽根烟..."); } }
二、this关键字的作用
1、代表当前对象
在类的内部永远代表正在执行此代码的对象;在成员方法和构造方法内部,都可以通过this来明确访问类中的成员属性和成员方法。
public class Person03 { String name; int age; //构造代码块:直接在类中编写一对大括号,构造代码块可以访问到之前定义的属性 { System.out.println("构造代码块!" + name); } { say(); System.out.println("构造代码块2!" + this); } public Person03(){ System.out.println("构造方法!"); } public Person03(String name, int age) {
//1. 指向无参构造方法 this();
//2. 代表正在执行此代码的对象 this.name = name; this.age = age; } void say() { System.out.println("成员方法说动作"); } { say(); System.out.println("构造代码块3!"); } public static void main(String[] args) { Person03 p = new Person03(); p.say(); //匿名创建对象:创建对象只会用一次并且立即使用,而不用赋值给一个引用,即为创建了一个匿名对象 new Person03().say(); } }
2、指向某个构造方法
在构造方法内部通过this(参数列表),可以调用其他构造方法。
注意:使用这种用法时,this()必须出现在当前构方法的第一行。
三、super和this的共同点和区别
共同点:super和this都可以代表一个临时对象执行构造函数,并且都要放在构造函数的第一行;
不同点:super一般用在子类中,用于代表父类的对象;this用于当前类中,用于代表正在执行该代码的对象。