执行顺序
public class Test1 {public static void main(String[] args) {
A1 a = new A2(1,33);
//a.print();
System.out.println(a.getId());
System.out.println(a.getAge());
/*A2 a1 = (A2)a;
a1.print1();
System.out.println(a1.getId());
System.out.println(a1.getAge());*/
}
}
class A1 {
private int id=1, age=1;
A1(){}
A1(int id, int age) {
this.id = id;
this.age = age;
//System.out.println("1");
}
public int getId() {
//System.out.println("z");
return id;
}
public int getAge() {
//System.out.println("z");
return age;
}
public void print() {
System.out.println(getId() + "+" + getAge());
}
}
class A2 extends A1 {
private int id=2, age=2;
A2(int id, int age) {
super(id,age);
}
public int getId() {
//System.out.print("y1");
return id;
}
public int getAge() {
//System.out.print("y2");
return age;
}
public void print() {
System.out.println(getId() + "-" + getAge());
}
}
急!!!!它在内存中的执行是什么样的 --------------------编程问答-------------------- 1.执行super关键字引用的父类构造方法给父类中的Id和Age初始化
2.调用A2的实例中的get()方法得到初始化值为2的Id和Age,并打印输出。 --------------------编程问答-------------------- System.out.println(a.getId());
调用的是A2的getId()方法,因为A2类重写了A1的getId()方法。
System.out.println(a.getAge());
也是同理, --------------------编程问答-------------------- 在实例化一个子类时,子类的构造方易做图首先调用父类的构造方法。这就是为什么super关键字必须出现在子类构造方法的第一行了。子类调用父类的构造方法可以使用super关键字隐式调用,也可以是不使用super关键字的隐式调用。当是隐式调用时,子类会调用父类无参的默认构造方法。此时如果父类中没有无参的默认构造方法,就会出现编译错误。 --------------------编程问答-------------------- A1 a = new A2(1,33);这是多态问题,父类的引用指向子类的对象,在这样实例化的过程中,子类首先重写父类的print() 方法,在调用的过程中,父类的引用指向那个子类的对象,调用那个子类的方法。如果子类没有重写父类的方法,A1 a = new A2(1,33)这个形式的调用不成功。A1 a = new A2(1,33)这儿也涉及到了强制类型转换,只不过是子类的对象转化到父类,所以不需要强制转换,如果是父类转换到子类,则需要强制转换。
还有在继承实现的过程中,子类的对象先调用父类的构造方法,然后在调用子类的构造的方法。 --------------------编程问答-------------------- 学习了
补充:Java , Java SE