介绍
这篇文章主要讲解了Java方法类及调用方法的用法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
在说方法和调用的使用之前我们来看一个小例子,如果看懂了那就好了
公共类MethodInvoke { 类动物{ 公共空间print () { System.out.println (“Animal.print ()“); } } 猫类动物{延伸 @Override 公共空间print () { System.out.println (“Cat.print ()“); } } 公共静态void main (String [] args){抛出异常 方法animalMethod=Animal.class.getDeclaredMethod(“保险单上); 方法catMethod=Cat.class.getDeclaredMethod(“保险单上); 动物动物=new (); 猫猫猫=new (); animalMethod.invoke(猫);//相当于猫调用父类的印刷方法 animalMethod.invoke(动物);//相当于animal.print (); catMethod.invoke(猫);//相当于cat.print (); catMethod.invoke(动物); } }
执行结果如下
Cat.print () Animal.print () Cat.print () 异常的线程“main". lang。IllegalArgumentException:对象不是声明类的一个实例 在sun.reflect.NativeMethodAccessorImpl。invoke0(本地方法) 在sun.reflect.NativeMethodAccessorImpl。调用(未知源) 在sun.reflect.DelegatingMethodAccessorImpl。调用(未知源)
代码中,猫类覆盖了父类动物的print()方法,然后通过反射分别获取打印()的方法对象。最后分别用猫和动物的实例对象去执行打印()方法。其中animalMethod.invoke(动物)和catMethod.invoke(猫),示例对象的真实类型和方法的声明、是相同的,按照预期打印结果;animalMethod.invoke (Cat)中,由于猫是动物的子类,按照多态的特性,子类调用父类的的方法,方法执行时会动态链接到子类的实现方法上。
因此,这里会调用Cat.print()方法;而catMethod.invoke(动物)中,传入的参数类型动物是父类,却期望调用子猫类的方法,因此这一次会抛出异常。