1.super不是引用类型
- super中存储的不是内存地址,super指向的不是父类型对象
- this中存储的是内存地址,指向当前对象
2.super代表的是当前子类对象中的父类型特征
- 如果子类中没有定义name,那么在子类中
name;this.name;super.name
都是一样的,都指的是父类中的name。如果子类中重新定义了name,那么子类中的name;this.name
指的是子类中的name,super.name
才代表父类中的name
3.什么时候使用super?
- 子类和父类中都有某个数据,如果要在子类中访问父类中的属性,需要使用super
4.super可以用在什么地方?
- 成员方法中
- 构造方法中
- 无法在静态方法中使用(this也不可以)
5.super关键字在构造方法中
- 语法:super(实参);
- 作用:代码重用;通过子类的构造方法去调用父类的构造方法(给当前子类中的父类型特征赋值)
- 语法规则:一个构造方法第一行如果没有this(…)也没有显示的去掉用super(…)系统会默认调用super()
- super(…)的调用只能放在构造方法的第一行
- this(…)也只能出现在构造方法的第一行,所以super和this不能共存
- 父类中的构造方法不会被子类继承,在子类中用super可以调用,super虽然调用了父类中的构造方法,但只会给当前子类中的父类型特征赋值,并不会创建父类对象
【注】在java中只要是创建对象,那么object类中的无参数构造方法一定会执行
单例模式的特点之一是构造方法私有化。子类中的super无法调用父类中的构造方法,会导致编译不通过。所以单例模式一个缺陷是没有子类,无法被继承。
6.例子
- 成员方法中
public class Employee
{
String name="张三";
//成员方法
public void work(){
System.out.println("员工在工作");
}
}
public class Manager extends Employee
{
//重新定义了name
String name="李四";
//子类重写父类中的work方法
public void work(){
System.out.println("经理在工作");
}
//成员方法
public void m1(){
//this.work
//work();
super.work();
System.out.println(this.name);//李四
System.out.println(name);//李四
System.out.println(super.name);//张三
}
}
- 构造方法中
public class Account
{
//Field
private String actno;
private double balance;
//Constructor
public Account(){
//默认有super();
System.out.println("Account的无参数构造方法执行");
}
public Account(String actno,double balance){
//默认有super();
this.actno=actno;
this.balance=balance;
}
//setter and getter
public void setActno(String actno){
this.actno=actno;
}
public String getActno(){
return actno;
}
public void setBalance(double balance){
this.balance=balance;
}
public double getBalance(){
return balance;
}
}
public class DebitAccount extends Account
{
//Field
//独特属性
private double debit;
//Constructor
public DebitAccount(){
//默认有super();
}
public DebitAccount(String actno,double balance,double debit){
//通过子类的构造方法去调用父类的构造方法,作用是:给当前子类对象中的父类型特征赋值
//actno和balance是父类中的私有属性,在子类中不能通过this.赋值
super(actno,balance);
this.debit=debit;
}
//setter and getter
public void setDebit(double debit){
this.debit=debit;
}
public double getDebit(){
return debit;
}
}