1: class Person {
int a;
2: public void printValue(int i, int j) {//... }
3: public void printValue(int i){//, .. }
4: }
5: public class Teacher extends Person {
int a;
6: public void printValue() {//... }
7: public void printValue(int i) {//...}
8: public static void main(String args[]){
9: Person t = new Teacher();
10: t.printValue(10);
t.a;
11: }
12: }
有一个问题就是步骤9 10
如这句话
当然在使用new Xxxx()创建的时候 我理解为 父类引用变量t 放到一个栈内存中,而new Teacher()放到一个堆内存中.当我用t.a的时候.他调用的是父类的成员变量,调用方法的时候他确调用子类的方法.这是为什么?
是因为创建引用的时候 父类的成员变量与引用t放到一块栈内存中吗?但new Teacher()以后 为什么子类的变量a不能放到一个栈内存中呢(成员变量在使用new Xxxx()创建该类的实例时被创建,而其生存期和该类的实例对象的生存期相同)? 指教一下 这个内存分配.谢谢了
论坛里看到的别人的提问,添加了些代码在eclipse上测试了下,结果如下:
class Person {
public static int a = 473;
public void printValue(int i, int j) {
System.out.println(i+" "+j);
}
public void printValue(int i){
System.out.println(i);
}
}
public class Teacher extends Person {
int a = 789;
public void printValue() {
System.out.println("you fool");
}
public void printValue(int i) {
System.out.println(i+"you not a fool");
}
public static void main(String args[]){
Person t = new Teacher();
t.printValue(10);
System.out.println(t.a);
}
}
运行结果为:10you not a fool
473
1.本题的关键为Person t = new Teacher(); 在子类中重写了printValue(int i)函数,因此运行为子类中的printValue.
2.父类中声明a为static常量,运行父类中的a。
最后结论为若函数未被重写,诸如Person t = new Teacher();会调用父类方法。