7.super的应用
1)super. 的应用
- 用在子类的成员方法或构造方法中,表示访问父类的属性或是成员方法;
- super.属性:访问父类的属性
super.成员方法(属性):访问父类的成员方法
2)**super()**的应用
- super()/super(实参):用在子类的构造方法中,代表JVM创建子类的同时默认创建父类时,调用哪一个构造方法完成对父类对象的创建;
- 如果在子类构造方法的第一行没有super()/super(实参),JVM默认添加super();
- 注意:在同一个构造方法中,不允许同时使用super())和this();(如果this()/this(实参)出现在构造方法的第一行,JVM不再提供默认的super(),此时JVM会通过this()/this(实参)到对应的构造方法中的第一行找super()/super(实参))。
8.带有继承关系的创建对象的过程:(上图也表现了这一点)
创建子类对象,JVM会默认创建一个对应的父类对象,而且此父类对象仅供当前子类操作,外界无法访问。
步骤:
1)new :分配空间(子类+父类),同时为属性赋默认值
2)执行子类的构造方法:在子类的构造方法第一行遇到super()/super(实参)
① 先执行父类的构造方法
- 执行父类的属性初始语句
- 父类构造方法中原有的其他语句
注意:父类的属性初始化语句,也会被编译器移交到每一个父类构造方法中
② 继续执行子类构造方法:
-
执行子类属性的初始化
-
子类构造方法中原有内容
注意:子类的属性初始化语句,也被编译器移交到每一个子类的构造方法中,但是位于 super()/super(实参) 后面,构造方法其他语句的前面
封装+继承例子
class TestPerson{
public static void main(String[] args){
Man m = new Man("团团",23);
System.out.println(m.getName()+"\t"+m.getAge());
Woman w = new Woman("段段",25,6);
System.out.println(w.getName()+"\t"+w.getAge()+"\t"+w.getN());
}
}
class Person{
private String name;
private int age;
public Person(){}//防止子类调用父类无参时报错
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void speak(){
System.out.println("speak...");
}
}
class Man extends Person{
public Man(){}
public Man(String name,int age){
super(name,age);
}
}
class Woman extends Person{
private int n;
public Woman(){}
public Woman(String name,int age,int n){
super(name,age);
this.n = n;
}
public void setN(int n){
this.n = n;
}
public int getN(){
return n;
}
}