思考问题:形式参数和子类

[url]https://www.zhihu.com/question/49065157[/url]这是我在知乎上面的提问, 后来自己学了就回去自答2333
//
作者:黄干干
链接:https://www.zhihu.com/question/49065157/answer/131055655
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

看了下自己提的问题, 不能再拖下去了, 一定要及时复习和填坑...
当时我提出的问题描述不够清晰, 我的意思是: 为什么超类变量赋予一个子类对象的实例时, 在代码中该超类变量是无法子类自身声明的方法的, 但是为什么利用反射机制的时候却可以调用到呢?
//
在阅读thinking in java(TIJ)的RTTI这章中, 我先是认识到运行时类型信息这么一个概念, 虽然以前有Class类的一点知识, 但是不清楚在程序运行中起什么作用.

JDK1.6API上面对Class的解释:Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

core java(JDK7版本)上对Class类的解释:在程序运行期间, Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识. 这个信息跟踪着每个对象的所属类.

在我理解来, 在运行期间, Class类的实例保存着每一个类的信息(成员变量, 方法, 构造方法等), 按照这种情况, 只要程序可以找到某个Class实例, 那么就可以获得这个Class的全部信息, 利用这些信息来进行某些操作(比如利用构造新的实例).
当然, 根据TIJ 和Core Java上面了解的知识, 在编译期间产生的.class文件 都是在已知路径下编译.Java文件所产生的.(那个时候我对什么运行时类型信息和反射根本就是一知半解), 这个已知路径可能是本地硬盘上的某些.Java文件或者是某些地方的, 总之是在编译期间可以确切得到的. 然而如果有一段来自某个次元(手动滑稽)的神秘字节码, 并且告诉了正在运行的JVM, 本字节码可以代表着一个Class信息, 是一个Class实例! 那么懵懂的JVM怎么解析和利用这段神秘的.class字节码呢?
TIJ上明确告诉了, reflection 和 Class 一起支撑了反射帝国(好吧, 是反射机制).
只要知道这些字节码是代表着一个类型信息(这里如果获知该字节码是类型信息, 我暂时不懂, 以后学会了再来填坑), 那么利用该字节码生成一个class实例, 那么根据Class类提供的方法就可以获取得到该class的信息, 比如说这个class实例有什么成员变量, 有哪有构造方法, 每个成员变量声明的类型是啥等等.(貌似我偏离话题了......下面回归到我提出问题的解析).

有了一些对CLass 和 reflection的肤浅了解, 在我前段日子刚好买了core Java的时候, 翻阅多态这一章节信息的时候, 了解到动态绑定这么一个知识, 原来虚拟机会为每个类创建一个方法表, 确切知道该类的实例调用哪些方法.

那么回到我提出的问题, "为什么超类变量赋予一个子类对象的实例时, 在代码中该超类变量是无法子类自身声明的方法的, 但是为什么利用反射机制的时候却可以调用到呢?"

我现在的理解是:该实例是子类在内存中是确确实实存在的一段字节, 只是我在栈中用超类的变量引用了.那么反射机制检查的时候, 应该检查的是该实例自身, 而不是单单检查超类变量(毕竟这仅仅只是一个引用阿!), 因为这个实例时子类的实例嘛, 那么当然可以调用子类的方法啦(这里面的实例应该引用了实例对应的Class类的实例, 我想就是应该有那么一个机制可以知道实例对应自身的class实例, 哪位大大告诉我下, 谢谢.).
顺带一句, 这反射不就破坏了封装性么...
感觉差不多了...欢迎各位指出我的不正确之处~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值