• 五(九)、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中空参的构造器为止,正因为加载过所有的父类结构,所以才可以看到内存中父类中的结构,子类对象才可以考虑进行调用;

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

  • 相关阅读:
    反向映射和写时复制
    内存分析的好blog
    minicom使用
    tee的妙用
    网络带宽
    mem analyse
    linux 应用层常用API/命令
    ubuntu 库依赖问题
    Python基础学习笔记(一:hello world)
    第7章 取消与关闭
  • 原文地址:https://www.cnblogs.com/lixiuming521125/p/13305941.html
Copyright © 2020-2023  润新知