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();
}
}