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.   

    1.执行super关键字引用的父类构造方法给父类中的Id和Age初始化
    2.调用A2的实例中的get()方法得到初始化值为2的Id和Age,并打印输出。
      

  2.   

    System.out.println(a.getId());
    调用的是A2的getId()方法,因为A2类重写了A1的getId()方法。
    System.out.println(a.getAge());
    也是同理,
      

  3.   

    在实例化一个子类时,子类的构造方法会首先调用父类的构造方法。这就是为什么super关键字必须出现在子类构造方法的第一行了。子类调用父类的构造方法可以使用super关键字隐式调用,也可以是不使用super关键字的隐式调用。当是隐式调用时,子类会调用父类无参的默认构造方法。此时如果父类中没有无参的默认构造方法,就会出现编译错误。
      

  4.   

    A1 a = new A2(1,33);这是多态问题,父类的引用指向子类的对象,在这样实例化的过程中,子类首先重写父类的print() 方法,在调用的过程中,父类的引用指向那个子类的对象,调用那个子类的方法。如果子类没有重写父类的方法,A1 a = new A2(1,33)这个形式的调用不成功。A1 a = new A2(1,33)这儿也涉及到了强制类型转换,只不过是子类的对象转化到父类,所以不需要强制转换,如果是父类转换到子类,则需要强制转换。 还有在继承实现的过程中,子类的对象先调用父类的构造方法,然后在调用子类的构造的方法。