super关键字以及super()

super关键字

package com.company.super01;

public class Employee {
    String name = "zhangsan";
    // 成员方法
    public void work(){
        System.out.println("员工在工作!");
    }
}

package com.company.super01;
/*
* 1、【注】super不是引用类型,super中存储的不是内存地址,super指向的不是父类对象。
*       和this不一样,this是引用内存,里面存储的内存地址指向当前对象。
*
* 2、super代表的是当前子类对象中父类型特征,因为是“当前子类对象”所有他的使用范围和this类似。
*
* 3、什么时候使用super?
*   子类和父类中都有某个数据,例如子类和父类中都有name这个属性。
*   如果要在子类中访问父类中name属性,需要使用"super."
*
* 4、super可以用在什么地方?
*   第一:super可以用在成员方法中,不能用在静态方法中
*   第二:super可以用在构造方法中
*
* */
public class Manager extends Employee {
    String name = "lisi";
    // 子类将父类中的work方法重写了
    public void work(){
        System.out.println("经理在工作");
    }

    // 成员方法
    public void m1(){
        // 在没有重写work方法之前,前两句代码肯定会执行父类Employee里面的work()方法
        // 但是在重写方法后,都会执行重写后的work()方法
        // 那么这时还是想执行父类里面的方法,应该怎么办呢?  使用super关键字
        // 属性也可以使用super关键字
        // this.work();
        // work();
        super.work();
    }

    /*
    // this和super相同,都不能用在静态上下文中
    public static void m2(){
        System.out.println(super.name);
    }

     */
}
package com.company.super01;

public class Test01 {
    public static void main(String[] args) {
        Manager m = new Manager();
        m.m1();
    }
}

super()在构造方法中的使用

package com.company.super02;

public class Account {
    // Field
    private String actno;
    private double balance;

    // Constructor
    public Account(){
        System.out.println("Account的无参构造方法执行!");
    }
    public Account(String actno, double balance){
        this.actno = actno;
        this.balance = balance;
        System.out.println("Account的有参构造方法!");
    }
    public void setActno(String actno){
        this.actno = actno;
    }
    public String getActno(){
        return actno;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }
}

package com.company.super02;
/*
 * this关键字用在构造方法中:
 *   this(实参);
 * 作用:在同一个类中可以在某个构造器中调用其他构造器
 *
 * super关键字用在构造方法中:
 *   语法: super(实参);
 *   作用:通过子类的构造方法去调用父类的构造方法。
 *
 * 语法规则:
 *   一个构造方法第一行如果没有 this(...);也没有显示的去调用 super();
 *   系统会默认调用 super(); // 【注】看起来像是子类继承了父类中的构造方法,其实并不是!!!
 *
 * 注意: super(...);的调用只能放在构造方法的第一行,和this()一样。
 *       因此super()和this()不能共存!!!
 *
 * 通过子类的构造方法去调用父类的构造方法,作用是:给当前子类对象中的父类型特征赋值;
 *
 * 【注意】 尽管super()调用了父类对象中的构造器,但是并没有创建父类对象,只是给当前子类对象中的父类型特征赋值。
 *
 * 在java中由于所有的类都默认继承Object类,所以,只要是构造器中没有this()就一定默认会有super(),默认调用Object类中的构造方法。
 *  */
public class DebitAccount extends Account {
    // Eiled
    // 独特属性
    private double debit;

    // constructor
    public DebitAccount(){
        super("110",5.5); // 不写的话默认 super();
    }

    public DebitAccount(String actno, double balance, double debit) {
//        this.actno = actno;
//        this.balance = balance;
        // 可以看到由于在父类中actno、balance由于是private修饰的,私有属性不能被继承
        // 因此不能如上在进行构造器中完成赋值操作,这时候就需要用到super();
        // 通过子类的构造方法去调用父类的构造方法,作用是:给当前子类对象中的父类型特征赋值。
        super(actno, balance);
        this.debit = debit;
    }

    public double getDebit() {
        return debit;
    }

    public void setDebit(double debit) {
        this.debit = debit;
    }
}

package com.company.super02;

public class Test {
    public static void main(String[] args) {
        DebitAccount da = new DebitAccount();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值