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反射与多态(父类调用子类)的代码演示的更多相关文章

  1. Java特性之多态父类与子类之间的调用

    问题描述: Java三大特性,封装.继承.多态,一直没搞懂其中多态是什么,最近研究了一下,关于父类和子类之间的调用.下面是一个测试类,源代码如下: package com.test; public c ...

  2. 多态&&父类调用子类特有的方法

    /* 多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数使用的是父类对象,可以传入父类.子类对象 4.局限性: 1>父类类型的变量,不能直接调 ...

  3. java 多态 ---父类调用子类方法

    package test1;//多态的体现import javax.print.attribute.standard.RequestingUserName;import java.util.Scann ...

  4. Java 多态 父类和子类方法的访问控制权限

    Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...

  5. php 父类调用子类方法和成员

    在C和C++里,父类都不允许调用子类的方法,但在php里可以.下面是一个调用的例子: <?php abstract class Animal { protected $name; public ...

  6. PHP面向对象-看父类调用子类方法

    大部分面向对象编程语言中,父类是不允许调用子类的方法的,但是PHP中可以 1.父类调用子类方法示例 class A { public function testa() { $this->test ...

  7. php面向对象编程 父类调用子类编程

    使用父类调用子类的实现代码

  8. this引用逃逸(使用内部类获取未外部类未初始化完的变量),多态父类使用子类未初始化完的变量

    1,this引用逃逸 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了. 这是危及到线程安全的,因为其他线程有可能 ...

  9. Java多态性详解 (父类引用子类对象)

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

  10. Java多态性详解——父类引用子类对象

    来源:http://blog.csdn.net/hikvision_java_gyh/article/details/8957456 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实 ...

随机推荐

  1. ES索引模板——就是在新建索引时候指定的正则匹配来设置mapping而已,对于自动扩容有用

    索引模板 扩容设计 » 索引模板 Elasticsearch 不要求你在使用一个索引前创建它. 对于日志记录类应用,依赖于自动创建索引比手动创建要更加方便. Logstash 使用事件中的时间戳来生成 ...

  2. [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)

    题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...

  3. ServiceStack.Redis之IRedisClient<第三篇>【转】

    事实上,IRedisClient里面的很多方法,其实就是Redis的命令名.只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这 ...

  4. 解决Windows下git需要每次都要ssh-add的问题

    顽皮的很: 不知道怎么回事,每次打开git提交代码都需要ssh-add一下秘钥才可以正常提交: 不然就报错权限之类的问题: 怎么才能更方便一些? 卸了重装!我没试... 再或者是在 git 的安装目录 ...

  5. 【jQuery05】通过按键 来切换 class

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. C语言运行时数据结构

    段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...

  7. HDFS架构与原理

    HDFS HDFS 全称hadoop分布式文件系统,其最主要的作用是作为 Hadoop 生态中各系统的存储服务 特点 优点 • 高容错.高可用.高扩展 -数据冗余多副本,副本丢失后自动恢复 -Name ...

  8. Innodb中的事务隔离级别和锁的关系(转载)

    nodb中的事务隔离级别和锁的关系 原文:https://tech.meituan.com/innodb-lock.html ameng ·2014-08-20 15:50 前言: 我们都知道事务的几 ...

  9. sed 替换 引用变量值,记录一个自己学习错误的地方。

    先上脚本,脚本的目的是虚拟机克隆-连接克隆,然后修改ip这个搞定,修改hostname就很简单了 declare oldipdeclare -i Anamedeclare newipoldip=`ca ...

  10. Camera Calibration 相机标定:原理简介(五)

    5 基于2D标定物的标定方法 基于2D标定物的标定方法,原理与基于3D标定物相同,只是通过相机对一个平面进行成像,就可得到相机的标定参数,由于标定物为平面,本身所具有的约束条机,相对后者标定更为简单. ...