玩命加载中 . . .

super关键字(16)


super关键字

  1. super不是引用类型,,super中存储的不是内存地址,,super指向的不是父类对象

  2. super代表的是前子类对象中的父类型特征

  3. 什么时候使用 super?
    子类和父类中都有某个数据,例如,子类和父类中都有name这个属性
    如果要再子类中访问父类中的name属性,需要使用 super

  4. super可以用在什么地方?

    • 可以用在成员方法中,但是不能用在静态方法中
    • super可以用在构造方法中
  5. super关键字用在构造方法中:

    • 语法: super(实参);
      注意:super()括号中传入的是实参而不是形参

    • 作用:通过子类的构造方法去调用父类的构造方法

    • 语法规则(重点):

      一个构造方法第一行如果没有this(….);
      也没有显示的去调用 super(….);
      系统会默认调用 super();

      例如:

      // 父类
      public class Bank {
          private int id;
          public Bank() {
              System.out.println("Bank无参构造函数执行");
          }
      }
      // 子类
      public class Credit extends Bank {
          public Credit() {
              // 因为这里既没有this()也没有super(),所以JVM默认执行super()
          }
      }
      // 测试类
      public class BankTest {
          public static void main(String[] args) {
              Credit credit = new Credit();    // --------->  Bank无参构造函数执行
          }
      }
      
    • 在Java语言中只要是创建Java对象,那么Object中的无参数构造方法一定会执行
      因为所有方法默认继承于Object

    • 注意: super(….);的调用只能放在构造方法的第一行

    • super(….);和this(….);不能共存

    • super(….);调用了父类中的构造方法,但是并不会创建父类对象.

      通过子类的构造方法去调用父类的构造方法,
      作用是:给当前子类对象中的父类型特征赋值

    • 注意:调用构造方法不一定是创建对象

  6. super()的个人理解:

    • super()只能在子类的构造函数中使用
    • super()给当前子类对象中的父类型特征赋值
    • 因为父类里面成员方法是私有的所以子类无法无法直接访问
    • 如果子类调用父类的成员变量还要new一个空间,费空间
    • 但是使用super()可以不用创建父类对象直接间接赋值然后直接使用父类get方法访问

    例如:

    // 父类
    public class Bank {
        private int id;
        Credit credit;
    
        public Bank() {
    
        }
    
        public Bank(int id) {
            this.id = id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
        public int getId() {
            return id;
        }
    // 子类
    public class Credit extends Bank {
        private int passWorld;
    
        public Credit() {
        }
    
        public Credit(int id,int passWorld) {
            super(id);        // 将id传给父类构造函数,但是父类不会创建对象
            this.passWorld = passWorld;
        }
    
        public void setPassWorld(int passWorld) {
            this.passWorld = passWorld;
        }
    
        public int getPassWorld() {
            return passWorld;
        }
    }
    // 测试
        public static void main(String[] args) {
            Credit credit = new Credit(100,200);    // 创建一个子类对象,为父类型特征id赋值100,子类passWorld赋值200
            System.out.println(credit.getId());        // --------> 父类型特征id=100
            System.out.println(credit.getPassWorld());    // ----------> passWorld=200
            credit.setId(74);    // 重新定义父类型特征id=74
            System.out.println(credit.getId());        // -------------> 父类型特征id=74
        }
    

super总结:

  1. super关键字: 类似与this关键字(当前当前对象);super关键字代表父类对象

  2. 可以利用super关键字代表父类对象访问父类的属性和方法。

    • super.属性—>访问父类的属性
    • super.方法名()—>调用父类的方法
  3. 可以使用super关键字调用父类的构造函数,必须出现在构造函数的第一行。

  4. super不能与static混用。


文章作者: 小靳同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小靳同学 !
评论
 上一篇
单例模式(15) 单例模式(15)
单例模式(singleton pattern)单例模式所具备条件: 构造方法私有化 对外提供一个公开的静态的获取当前对象的方法 提供当前类型
2021-06-08
下一篇 
抽象类(17) 抽象类(17)
抽象类 语法格式: [修饰符] abstract class 类名{} 抽象类无法被实例化 虽然抽象类没有办法实例化,但是抽象类也有构
2021-06-08
  目录