多态
eg :
class A{method();}
class B extends A{method();}
A a=new B();
a.method()调用的是B的method()方法。//a.method()执行是,应该看引用a具体指向的内存空间实际存在的是什么对象。从这里来看,引用a所指向的实际内存空间是B的实例。
方法的调用具体决定于运行时,编译器只是检查java语法的正误。
通过 对象.属性 的形式来获得属性值时,具体返回的属性值是依赖于对象引用的类型的。
而通过方法来获得对象的属性时,方法调用所返回的属性则决定于具体内存中存在的真正对象
。
(attention: 静态的方法这一条不适用)
Eg:
public class TestPoly {
public static void main(String[] args) {
Father1 f=new Child1();
System.out.println(f.age);//在编译阶段就已经可以确定f.age的值是:45,因为在编译时不会生成对象,
//直接看引用类型即可,所以下面的((Child1)f).age之间看f的类型即可。
System.out.println(((Child1)f).age);
f.printAge();//这个需要在运行是通过方法来决定结果,此时,f引用指向的是Child1类型的对象空间,所以调用的是Child类的pringAge()方法,从而得出结果是:90
((Child1)f).printAge();
}
}
class Father1{
int age=45;
public void printAge(){
System.out.println(age);
}
}
class Child1 extends Father1{
int age=90;
public void printAge(){
System.out.println(age);
}
}