日期:2014-05-20  浏览次数:20639 次

java:通过父类的引用去访问子类对象
我刚刚学习java,在学到第三章:面向对象 的时候遇到了这个问题:父类引用去访问子类对象。以下是我写的一个例子。


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() {
System.out.println("xixi");
}

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, age;

A2(int id, int age) {
this.id = id;
this.age = age;
}

public int getId() {
System.out.println("y1");
return id;
}

public int getAge() {
System.out.println("y2");
return age;
}

public void print1() {
System.out.println(getId() + "-" + getAge());
}
}


当我不重写getId()和getAge()两个方法时,输出的结果是 0 0;
重写后输出的结果是 1 33。

希望高手出手帮忙解决。谢谢!

------解决方案--------------------
不重写getId()和getAge()两个方法时,a.getId()和a.getAge()调用的是A1的方法,而A1里面两个私有变量初始值都是1,所以输出结果应该是1 1(不是0 0!)。

重写getId()和getAge()两个方法时,a.getId()和a.getAge()调用的是A2的方法,输出的是A2里面两个私有变量的值,由构造函数初始化为1和33。

注意,不管重不重写getId()和getAge()两个方法,A2的构造函数并没有调用A1的A1(int id, int age)构造函数,而是隐式地调用A1(),所以A1的两个私有变量初始值都是1。




------解决方案--------------------
探讨
不重写getId()和getAge()两个方法时,a.getId()和a.getAge()调用的是A1的方法,而A1里面两个私有变量初始值都是1,所以输出结果应该是1 1(不是0 0!)。

重写getId()和getAge()两个方法时,a.getId()和a.getAge()调用的是A2的方法,输出的是A2里面两个私有变量的值,由构造函数初始化为1和33。

注意,不管重不重写getI……