Java的多态与绑定

来源:百度知道 编辑:UC知道 时间:2024/05/30 11:35:59
public class Person {
protected int age=2;
public Person() { }

}
public class Student extends Person{
public int age=3;
public Student() {
age=4;
}

}
public class Test {

public Test() {
}
public static void main(String[] args){
Person p=new Student();
Student q=new Student();
System.out.println(p.age);为什么输出是2??
System.ou.println(q.age);为什么输出是4??
}
________________________________________________
public class TestAnimals {
public static void main (String [] args) {
Horse b = new Horse();
System.out.println(b.getI());为什么输出是1???
System.out.println(b.i);
}
}
class Animal {
protected int i=1;
public int getI(){
return i;
}
public void setI(int i){
this.i=i;
}
}
class Horse extends Animal {
in

当子类成员变量与父类里面成员变量同名时,叫做变量遮盖,不能说是覆盖,它是没有多态现象的,只有方法才会有多态现象,所以前面是哪类的引用会相应地调用里面的成员变量,
所以
System.out.println(p.age);是父类引用,输出2
System.ou.println(q.age);子类引用,输出子类的成员变量为4;
而System.out.println(b.getI());为什么输出是1???
因为你子类没有重写getI方法,所以没有多态现象,所以就执行了父类里面的getI()方法了.

至于内存关系,要画图才能说得清楚的

你问的问题很深奥啊,我试了下发现如下的一点规律,但无法讲清内存关系:
1,父类的方法只能使用父类的或他的父类的属性变量,因为子类的变量再定义他时还没延生呢.
2,把子类的对象赋给父类的引用时,引用只能使用父类中存在的变量和方法,而不能使用子类的新元素.
3,当子类覆盖父类的变量时,当创建对象时两个相同名字的变量仍被他配内存,并占取不同的单元,所以父类的变量只是因为就近原则而被隐藏,而并不是没有.但当子类覆盖父类的方法时,由于方法名只是相当于一个方法体的地址入口,所以父类的方法名被替换为了子类的方法体地址.这里正是我有点弄不懂的地方,因为子类通过super.方法名仍能调用到父类的方法.
但不管怎样第1条是符合的,只要我们知道调用的方法名包含的是哪个类的方法体入口,就知道他使用的是哪个类的变量了.
如:
public class A{
int i=1;
public int getI(){
return i;
}
}
public class B extends A{
int i=2;
public int getI(){
return i;
}
public int getII(){
return super.getI();
}
}
public class Test{
public static void main(String[