编译类型
编译时类型由声明该变量时使用的类型决定,比如下方代码中main函数类声明的p,虽然它右边是new Student(),但他们的编译类型仍然是people。
编译时引用变量只能调用其编译类型所具有的方法。因此p只能调用test,无法调用test2
运行类型
运行时类型由实际赋给该变量的对象决定。
所以p和s的运行类型都是student,test()运行结果都是student里面的方法
运行结果是:
示例代码
public class Test {
public static void main(String[] args){
// 编译类型是声明该变量的类型
// p的编译类型是 people
People p = new Student();
Student s = new Student();
// 编译时引用变量只能调用编译时所具有的方法 test2是student的方法 所以下面报错
p.test();
s.test();
s.test2();
}
}
class People{
public void test(){
System.out.println("调用的是people里面的方法");
}
}
class Student extends People{
@Override
public void test() {
System.out.println("调用的是student里面的方法");
}
public void test2(){
System.out.println("调用的是student里面第二个方法");
}
}
例题
joe的编译类型为Human 运行类型为Employe
答案为 Employe