看书看到继承与多态那,问两个基础问题
1、public abstract class A{
abstract void method();
void test(){
method();
}
}
public class B extends A{
void method(){
System.out.println("Sub");
}
public static void main(String[] args);
new B().test();
}
}
书上说方法test()在A中定义,它调用了方法method()。虽然方法method()在类中被定义成抽象的,但仍然可以被调用,因为在运行环境中,Java虚拟机会执行B的实例的method方法。一个实例所属的类肯定实现了父类中所有的抽象方法。那倒数第三行的new B().test();是不是就相当于 A a = new B(); a.test()呀?就是说这个实例B是属于类A的对么?
2、书上说对于一个引用类型的变量,Java编译器按照它声明的类型来处理。例如:
Base who = new Sub();
who.subVar = "123"; //编译出错,提示Base类中没有subVar属性
对于一个引用类型的变量,Java虚拟机按照它实际引用的对象来处理。例如以下代码编译通过,但运行时会抛出ClassCastException异常:
Base who = new Base();
Sub s = (Sub)who;//运行时抛ClassCastException异常
我想问的是如何区分Java编译器和Java虚拟机呀?它们都分别是怎么处理这个引用变量的?
谢谢!