五(九)、super关键字

super 关键字的使用:
  1.super 可以理解为 父类的;this可以理解为当前对象
  2.super 可以调用父类的属性和方法 构造器  this 可以用来修饰:属性,方法、构造器;
  3.super 的使用:
          3.1 我们可以在子类的方法或者构造器中,通过super.属性或者super.方法的方式,
              显示调用父类中声明的属性或者方法,但是通常我们习惯省略super。
          3.2 特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类的属性,则必须显示使用super.属性;
          3.3 当子类重写了父类中的方法以后,想要在子类中调用父类被重写的方法时,则需要使用 super.方法的方式,
              表名调用的是父类被重写的方法,否则默认调用子类重写的方法;
  4.super 调用构造器:
      4.1 我们可以在子类的构造器中显示使用“super(形参列表)”的方式,调用父类中声明的指定构造器
      4.2 “super(形参列表)”的使用,必须声明在子类构造器中的首行;原因是,需要先保证父类的初始化
      4.3 我们在类的构造器,针对于 “this(形参列表)”或者 “super(形参列表)”只能二选一;
      4.4,在构造器的首行没有显示声明“this(形参列表)”或者 “super(形参列表)”,默认调用的是super();
      4.5 在类的多个构造器中,至少有一个构造器使用的“super(形参列表)”调用父类构造器;
  问题引入:子类重写父类方法以后,还想使用父类的被重写的方法,则可以使用super;

 1 public class Day12Super13 {
 2     public static void main(String[] args) {
 3         Student3 student = new Student3("tom",12,"IT");
 4         student.show();
 5         Student3 student1 = new Student3();
 6     }
 7 }
 8 class Persons3{
 9     String name;
10     int age;
11     int id = 1001;//身份证号
12     
13     public Persons3() {
14         System.out.println("我无处不在");
15     }
16     public Persons3(String name, int age) {
17         this.name = name;
18         this.age = age;
19     }
20     
21     public void eat() {
22         System.out.println("吃饭");
23     }
24     public void walk() {
25         System.out.println("走了");
26     }
27 }
28 
29 class Student3 extends Persons3{
30     String major;
31     int id = 1002;//学号
32 
33     public Student3(String major) {
34         this.major = major;
35     }
36     public Student3(String name,int age,String major) {
37         super(name,age);
38         this.major = major;
39     }
40 
41     public Student3() {
42     }
43     
44     @Override
45         public void eat() {
46             // TODO Auto-generated method stub
47             //super.eat();
48             System.out.println("学生多吃有营养的食物");
49         }
50     
51     public void study() {
52         System.out.println("学生学习");
53     }
54     
55     public void show() {
56         System.out.println("name:"+this.name+",age:"+super.age+",身份证号:"+super.id+",学号:"+this.id);
57     }
58     
59 }

这里Students3的初始化 Student3 student1 = new Student3();,会打印“我无处不在”;

  所以换句话说,我们通过子类的构造器创建子类对象是,我们一定会直接或者间接调用父类构造器,进而调用父类的父类的构造器,直到调用到Object中空参的构造器为止,正因为加载过所有的父类结构,所以才可以看到内存中父类中的结构,子类对象才可以考虑进行调用;

  也就是说,子类继承父类以后,就获取了父类的属性和方法; 创建子类对象,在堆空间中,就会加重所有父类中声明的属性;这也是对象实例化的过程;

原文地址:https://www.cnblogs.com/lixiuming521125/p/13305941.html