Java中的引用变量类型和多态有个相同的前提,那就是继承,两个类必须要有继承关系才能进行类型转换以及多态,多态的体现:父类或者接口的引用指向了自己的子类对象。
代码例子:
class A{
void way(){
System.out.println("Away()");
}
static void way2(){
System.out.println("Astatic()");
}
}
class B extends A{
void way(){
System.out.println("Bway()");
}
static void way2(){
System.out.println("Bstatic()");
}
}
如上例子中有A和B两个类,而B类继承了A类。
如果创建对象A a = new B()
1、完成了引用变量类型转换,子类向上转型成父类,自动完成
2、这样创建的对象也体现了多态,父类A的引用指向了子类B的对象,对象B有B类类型和A类类型。
3、如果引用类型变量a调用了成员方法way(),那么输出的结果是Bway(),因为引用类型变量a最终还是指向子类的对象,在父类和子类的成员方法有同名时,子类的对象还是会先在子类中查找没有才回去父类中查找,也就是父类的方法会被子类的方法覆盖。
4、如果引用类型变量a调用了静态方法way2(),那么输出的结果是Astatic(),因为该方法是静态的,已经不是对象的特有数据了,可以说是所以类的,随着类的加载而加载,而引用类型变量a现在已经是父类A类型的,所以调用的是父类A中的静态方法way2()。