class B{
int i =1;
int k =5656;
public void add(){
}
}
class C extends B{
int i =5;
int j;
public C(){
super.i = 7;
}
public void add(){
super.i = 8888;
}
}
public class A {
public static void print(B b){
System.out.println(b.i);
}
public static void main(String[] args) {
B b = new C();
System.out.println(b.i); //7 创建C对象时,构造器改变了B的i的属性值
//System.out.println(b.j); 调不到子类的属性
print(b);//7
C c = new C();
System.out.println(c.i);//5 子类和父类的i不是一个,这个不能重写
print(c);//7 向上转型后,是B的i了
}
}
一般而言,Father f = new Child()
创建对象时,会先创建父类对象在创建子类对象,空间明显比只创建父类引用的f要大,这个时候以f为准,多余的信息存在,但是f并不能指向
这种形式记住一句话:属性静态绑定,方法动态绑定。