java反射与多态(父类调用子类)的代码演示
package Test0817;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class Base{
int a;
Base(){
a=1;
System.out.println("Base Construct");
}
public void f(){
System.out.println("Base");
}
}
class Sub extends Base{
int a;
int b;
Sub(){
a=2;
b=2;
System.out.println("Sub Construct");
}
Sub(int i){
a=i;
b=i;
System.out.println("Sub Construct.this have one param");
}
public void f(){
System.out.println("Sub");
}
public void f(int m){
System.out.println("Sub,the m = "+m);
}
}
public class TestFanshe {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException {
Class<?> c;
try {
c = Class.forName("Test0817.Sub"); //需要有完整的包名.类名
Sub s = (Sub) c.newInstance();//实例化
//得到构造函数
c.getConstructors();
//得到方法
Method method = c.getMethod("f");
System.out.println("the method is "+method.toString());
Class[] paramerClass = new Class[1];
paramerClass[0] = int.class; //这个地方要写int,与形参的参数类型一致,写Integer就会报方法找不到
Method method1 = c.getMethod("f", paramerClass);
System.out.println("the method is "+method1.toString());
//通过反射,调用s对象的方法
method.invoke(s); //无参数的
int a=10;
method1.invoke(s, a); //一个参数的
method1.invoke(s, 20);
//实例化,将父类引用指向
Base b = (Base) c.newInstance();
Base bs = (Sub) c.newInstance();
//Sub sb = (Base) c.newInstance(); 报错
s.f(); //输出 sub
b.f(); //输出 sub
//b.f(10);//报错,无法调用父类中没有的子类方法
bs.f(); //输出 sub
//bs.f(10);//报错,无法调用父类中没有的子类方法
} catch (ClassNotFoundException e) {
System.out.println("发生无该类异常");
e.printStackTrace();
}catch(NoSuchMethodException e){
System.out.println("发生无该方法异常");
e.printStackTrace();
}catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结果:
Base Construct
Sub Construct
the method is public void Test0817.Sub.f()
the method is public void Test0817.Sub.f(int)
Sub
Sub,the m = 10
Sub,the m = 20
Base Construct
Sub Construct
Base Construct
Sub Construct
package Test0817; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; class Base{
int a; Base(){
a=1;
System.out.println("Base Construct");
}
public void f(){
System.out.println("Base");
}
} class Sub extends Base{
int a;
int b;
Sub(){
a=2;
b=2;
System.out.println("Sub Construct");
} Sub(int i){
a=i;
b=i;
System.out.println("Sub Construct.this have one param");
}
public void f(){
System.out.println("Sub");
}
public void f(int m){
System.out.println("Sub,the m = "+m);
}
} public class TestFanshe { public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException {
Class<?> c;
try {
c = Class.forName("Test0817.Sub"); //需要有完整的包名.类名
Sub s = (Sub) c.newInstance();//实例化
//得到构造函数
c.getConstructors();
//得到方法
Method method = c.getMethod("f");
System.out.println("the method is "+method.toString()); Class[] paramerClass = new Class[1];
paramerClass[0] = int.class; //这个地方要写int,与形参的参数类型一致,写Integer就会报方法找不到
Method method1 = c.getMethod("f", paramerClass);
System.out.println("the method is "+method1.toString());
//通过反射,调用s对象的方法
method.invoke(s); //无参数的 int a=10;
method1.invoke(s, a); //一个参数的
method1.invoke(s, 20); //实例化,将父类引用指向
Base b = (Base) c.newInstance();
Base bs = (Sub) c.newInstance();
//Sub sb = (Base) c.newInstance(); 报错
s.f(); //输出 sub
b.f(); //输出 sub
//b.f(10);//报错,无法调用父类中没有的子类方法
bs.f(); //输出 sub
//bs.f(10);//报错,无法调用父类中没有的子类方法
} catch (ClassNotFoundException e) {
System.out.println("发生无该类异常");
e.printStackTrace();
}catch(NoSuchMethodException e){
System.out.println("发生无该方法异常");
e.printStackTrace();
}catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
java反射与多态(父类调用子类)的代码演示的更多相关文章
- Java特性之多态父类与子类之间的调用
问题描述: Java三大特性,封装.继承.多态,一直没搞懂其中多态是什么,最近研究了一下,关于父类和子类之间的调用.下面是一个测试类,源代码如下: package com.test; public c ...
- 多态&&父类调用子类特有的方法
/* 多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数使用的是父类对象,可以传入父类.子类对象 4.局限性: 1>父类类型的变量,不能直接调 ...
- java 多态 ---父类调用子类方法
package test1;//多态的体现import javax.print.attribute.standard.RequestingUserName;import java.util.Scann ...
- Java 多态 父类和子类方法的访问控制权限
Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...
- php 父类调用子类方法和成员
在C和C++里,父类都不允许调用子类的方法,但在php里可以.下面是一个调用的例子: <?php abstract class Animal { protected $name; public ...
- PHP面向对象-看父类调用子类方法
大部分面向对象编程语言中,父类是不允许调用子类的方法的,但是PHP中可以 1.父类调用子类方法示例 class A { public function testa() { $this->test ...
- php面向对象编程 父类调用子类编程
使用父类调用子类的实现代码
- this引用逃逸(使用内部类获取未外部类未初始化完的变量),多态父类使用子类未初始化完的变量
1,this引用逃逸 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了. 这是危及到线程安全的,因为其他线程有可能 ...
- Java多态性详解 (父类引用子类对象)
面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...
- Java多态性详解——父类引用子类对象
来源:http://blog.csdn.net/hikvision_java_gyh/article/details/8957456 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实 ...
随机推荐
- kibana智能检索发送多次_msearch —— 配置index pattern,同时设置时间段,就知道到底是在哪些索引里去查找数据了
kibanasite/elasticsearch/log-*/_field_stats?level=indices 返回: {"_shards":{"total ...
- systemd服务管理---systemctl命令列出所有服务
1.列出系统所有服务 #systemctl list-units --all --type=service
- POJ 1951 模拟
思路: 坑爹模拟毁我一生 给两组数据: 输入: YOURE TRAVELING THROUGH ANOTHER DIMENSION A DIMENSION NOT OF SIGHT. 输出: YR T ...
- HDU 2852 KiKi's K-Number【 树状数组 二分 】
题意:给出m个操作,0:是增加一个数,add(x,1)1:是删除一个指定的数,这个是看sum(x) - sum(x-1)是否为0,为0的话则不存在,不为0的话,则add(x,-1)2:是查询比x大的数 ...
- Dapper基础知识三
在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. Dapper,当项目在开发的时候,在没有必要使用依赖注入的时候,如何做 ...
- 为什么maven 创建web工程不自动生成Deployment Descriptor:工程名
上面图切换成下面图: 点击eclipse右上角,如下图红圈,然后在选择javaEE这样就切换成javaEE视图了 如果还是不能解决,相信这个链接对你有所帮助:https://www.cnblogs.c ...
- Hadoop不同模式下关键配置属性
Hadoop分为三种模式: 独立(或本地)模式. 伪分布模式. 全分布模式 不同模式下关键配置项及属性内容如下面表格所示 组件名称 配置的文件名 属性名称 独立模式 伪分布模式 全分布模式 Commo ...
- BZOJ 4199: [Noi2015]品酒大会 后缀自动机_逆序更新
一道裸题,可以考虑自底向上去更新方案数与最大值. 没啥难的 细节........ Code: #include <cstdio> #include <algorithm> #i ...
- 简洁的MVC思想框架——Nancy(Session的使用)
前文提到关于Nancy中GET和POST以及外部引用图片,css和JS的文件等操作.今天所讲的是Nancy关于Session相关操作. Session作为web开发中极其重要的一部分,而Nancy中S ...
- BZOJ 4472 [Jsoi2015]salesman(树形DP)
4472: [Jsoi2015]salesman Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 417 Solved: 192[Submit][St ...