Java多态(利用向上向下转型和反射机理)
- //基类:
- public class Polymorphism {
- public int book=6;
- public void base(){
- System.out.println("父类的普通方法");
- }
- public void test(){
- System.out.println("父类的被覆盖的方法");
- }
- }
- //子类
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- public class SubClass extends Polymorphism {
- public String book="子类的book";
- @Override
- public void test() {
- System.out.println("子类的覆盖父类的方法");
- }
- public void sub(){
- System.out.println("子类特有的独特方法");
- }
- public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
- Polymorphism bs=new Polymorphism();
- System.out.println(bs.book);
- bs.base();
- bs.test();
- SubClass sc=new SubClass();
- //通过引用变量来访问其包含的实例属性时,系统总是试图访问它编译时类所定义的属性,而不是它运行时类所定义的属性
- System.out.println(sc.book);
- sc.test();
- sc.base();
- sc.sub();
- Polymorphism py=new SubClass();
- System.out.println(py.book);
- py.base();
- py.test();
- //利用向下转型可以访问子类特有方法
- SubClass ss=(SubClass)py;
- ss.sub();
- //利用反射也可以
- Method[] cla=py.getClass().getMethods();
- int i=1;
- for(Method mth:cla){
- System.out.println(i+":");
- System.out.println(mth.toString()+":"+mth.getName());//省略
- if(mth.getName()=="sub"){
- System.out.println("*********");
- mth.invoke(py, null);//执行子类特有的方法体
- break;
- }
- i++;
- }
- }
- }