super关键字的理解
1、super的理解
1、super理解:父类的
2、super可以用来调用父类的属性、方法、构造器。
2、super 的深入理解
常用的是在子类的构造器里面调用父类的构造器,对父类的一些属性进行初始化的动作。
/** * 属性: * 如果子类属性和父类一样的时候,子类要调用父类的属性时必须要显示 * 的调用(使用super.属性)。 * 属性一般不会出现重复的属性 * 方法: * 如果子类中重写了父类的某个方法但是还想调用父类的方法时那么就必须用super.方法了。 * * 构造器: * 调用父类的构造器 * 1、我们可以在子类的构造器中显示的使用super(参数)调用父类的构造器,给父类属性赋值,然后子类也可以获取到 * 2、super(参数) 这个代码必须在子类的构造器首行 * 3、我们在子类的构造器中对于this(参数) 或 super(参数) 只能二选一 * 4、在子类的构造器中没有显示声明this(参数)或super(参数),默认是super(),也就是子类的空参构造器或者有参构造器会默认加super()来调用 * 父类的空参构造器。 * 5、通过子类构造器创建子类对象时,我们会在构造器里面直接或者间接的调用父类的构造器,但自始至终就创建了一个对象 * 即子类的对象。 * * */
3、具体的代码示例
public class Student extends Person { String major; private String id = "1001";//学生号 public Student(String major) { this.major = major; } public Student() { // super(); } public Student(String major,String name,int age) { // super(name,age); this.major = major; } @Override public void eat(){ System.out.println("学生要多吃有营养的食物"); } public void study(){ System.out.println("学生学习知识"); } /** * super调用父类的属性:如果子类属性和父类一样的时候,子类要调用父类的属性时必须要显示 * 的调用(使用super.属性)。 * 属性一般不会出现重复的属性。 */ //这里通过super调用getName() 获取的值是null,原因是name 是 student的属性,通过空参构造器 //没有给name属性赋值。 public void show(){ System.out.println("name = "+ super.getName() + ",age=" + super.getAge()); System.out.println("id = " + id); System.out.println("id = "+ super.id); } }
4、常见的使用之二
这里刚开始不理解为什么继承后要写一个带参的构造器
import org.springframework.context.ApplicationEvent; public class MyEvent extends ApplicationEvent { /** * 这里继承后为什么必须要写一个有参的构造器器呢,就是因为ApplicationEvent 没有默认的空参构造器 * 如果不写的话,MyEvent 就会有一个默认的空参构造器,空参构造器里面有一个默认的super()来调用ApplicationEvent * 这样MyEvent 有了带参的构造器,里面显示的调用ApplicationEvent的有参构造器。 * 特别注意:有了带参的构造器,就不会提供默认的构造器了。 * 也说明了下构造器里面的参数,不一定非的是类的属性. * */ public MyEvent(Object source) { super(source); } }