/**
* 作者:hiyo585
* 公司:hiyo design studios
* 对象的多态
* Java中多态性主要体现在1)方法的重载和覆写 2)对象的多态
* 对象的多态性:
* 1)向上转型:子类对象---->父类对象 (程序自动完成)
* 2)向下转型:父类对象---->子类对象 (需要明确要转型的子类类型)
*
* 转换格式
* 对象的向上转型:父类 父类对象 = 子类实例;
* 对象的向下转型:子类 子类对象 = (子类)父类实例
*/
package com.hiyo.HighClass;
//对象向上转型的例子
class PolyA {
public void method1() {
System.out.println("PolyA---->method1") ;
}
public void method2() {
this.method1();
}
}
class PolyB extends PolyA {
public void method1() {
System.out.println("PolyB---->method1");
}
public void method3() {
System.out.println("PolyB---->method3");
}
}
class PolyC extends PolyA {
public void method1() {
System.out.println("PolyC---->method1");
}
}
public class PolymDemo1 {
public static void main(String[] args) {
PolyB pb = new PolyB() ;
PolyA pa = pb ;//发生向上转型
pa.method1(); //调用子类覆写过的方法
//PolyB---->method1
//父类对象调用方法,实际上调用的是子类覆写过的方法
//发生向上转型,所调用的方法肯定是被子类覆写过的方法
pa.method2() ;
//父类对象调用自己的方法
//method2()中的this.method1(),this还是指子类对象
//pa.method3() ;
//method3只在子类中进行了定义,没有在父类中定义
//无法用父类对象调用只在子类中定义的方法。
//只在子类中定义的方法,必须用子类对象调用
//或者父类对象采用向下转型。
/*
错误:(47, 11) java: 找不到符号
符号: 方法 method3()
位置: 类型为com.hiyo.HighClass.PolyA的变量 pa
*/
((PolyB)pa).method3() ;//向下转型
//如果要调用子类自己的方法,只能用子类生命对象
/*PolyA pa2 = new PolyA() ;
PolyB pb2 = (PolyB)pa2 ;
//向下转型失败
//失败的原因,pa2和pb2之间没有建立关系,
//pb2需要先向上转型
//PolyA pa2 = new PolyB() ;
pb2.method3();
*/
//对象的多态实例
PolyB pb3 = new PolyB() ;
PolyC pc3 = new PolyC() ;
mainMethod(pb3);
mainMethod(pc3);
}
public static void mainMethod(PolyA pa) {
pa.method1();
}
}
/*
PolyB---->method1
PolyB---->method1
PolyB---->method3
PolyB---->method1
PolyC---->method1
*/