java中子类与父类强制转换_java中父类强制转换成子类的错觉
引言:父类引用指向子类对象在java中十分常见,比如:
Object object=new a();//a是一个类名
但是有时候我们看见子类引用指向了父类对象,就是上边的反过来,比如
图片中圈1标识的代码,反正就是怎么看都别扭,但是却一点问题没有。(图片是疯狂android讲义的截图,379页,讲述activity和service传递消息的那个章节。IBender是个接口,BinderService.MyBinder是实现该接口的类的一个子类)对此,所以我做了实验:
父类:
package testjar;
public class a {
public a() {
// TODO Auto-generated constructor stub
//System.out.println("a构造方法");
}
public a(int i) {
//System.out.println(i+"");
}
public void a_fun(){
System.out.println("a->a_fun");
}
}
子类:
package testjar;
public class b extends a {
public b() {
// TODO Auto-generated constructor stub
super();
//System.out.println("b 构造方法");
}
@Override
public void a_fun() {
// TODO Auto-generated method stub
super.a_fun();
System.out.println("b->a_fun");
}
}
main:
package testjar;
public class e {
public e() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
// TODO Auto-generated method stub
a aa=new a();//注意这里
b bb=(b)aa;//注意这里
bb.a_fun();
}
}运行后,就抛出了异常:
Exception in thread "main" java.lang.ClassCastException: testjar.a cannot be cast to testjar.b
at testjar.e.main(e.java:12)
很明显,转换失败,也算是意料之中,根本不符合逻辑,但是上边图片的android代码为什么没有问题
我们只要修改一下代码:
package testjar;
public class e {
public e() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
// TODO Auto-generated method stub
a aa=new b();//注意这里
b bb=(b)aa;//注意这里
bb.a_fun();
}
}注意我注释的注意这里的地方,就把a改成了b,就一切正常了。
打印结果:
a->a_fun
b->a_fun
看到这里,我想明白了,IBender只是个参数,android系统在调用onServiceConnected回调方法的时候就已经实现了service的指向对象,只不过肯定不是IBender接口实现后的对象,而是子对象,只是参数类型写成了IBender,(心中万马奔腾)。
我们回到java角度上来,
总结一下:
1父对象=new 父类();
2子对象=new 子类();
3父对象=new 子类();
4{
父对象=new 子类();
子对象=(子类)父对象;
}
上述四个都是正确的。
/*************************************************************************/
但是这个就不对了:
{
父对象=new 父对象();
子对象=(子类)父对象;
}
就会抛出刚刚说过的异常(注意两个红色部分)。所以我认为,4号代码块很容易迷惑我这样的新手,我叫他错觉(这个java是假的)。
不过到底为什么,在4号代码块中为什么正确,转换的过程中虚拟机到底做了什么,我就不知道了,还望高手大神解答。
java中子类与父类强制转换_java中父类强制转换成子类的错觉相关推荐
- java继承父类执行顺序_java中子类继承父类程序执行顺序问题
Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...
- java子类访问父类私有成员_Java中子类可以继承父类的私有成员,但是不能(直接)访问!!!...
今天学习Java三大特征之一:继承的时候,产生了一些疑问,最后通过网上查找和各位网友的帮助,终于拔开云雾见日出.下面进入正题: 首先:子类对象拥有父类中的所有属性和方法:在这里,很多人会问构造器可以继 ...
- JAVA子类是球父类是圆_java的父类和子类,这是矛盾...
java的父类和子类,这是矛盾... public class P134 {//父类 /*圆的半径*/ private double radius; /** * 第一个构造方法 * 构造一个单位圆 * ...
- java 父类的构造函数_java中为什么父类构造函数必须执行?
final 在java中,final可以用来修饰类,方法和变量(成员变量或局部变量).下面将对其详细介绍. 1.1 修饰类 当用final修饰类的时,表明该类不能被其他类所继承.当我们需要让一个类永远 ...
- java中集合类的转换_Java中的两个常用工具类及集合数组的相互转换
为了编程人员的方便及处理数据的安全性,Java特别提供了两个非常有用的工具类: 一.Collections 1.Collections类的特点: 集合框架的工具类.里面定义的都是静态方法. 2.Col ...
- java 泛型强制转换_java – 使用泛型强制转换为内部类
请考虑以下代码: public class Outer { public class Inner{ } public static Outer.Inner get(){ Object o = new ...
- java中基本字节输出流类是_java中基本输入输出流的解释
网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器发送的数据与读取文件没什么不同:向客户传送数据与写入一个文件也没有什么区别. Java中输入 ...
- java多态强制类型转换_java多态和强制类型转换
子类可以赋值给超类,称之为向上转型,这个是自动的. 超类不可以赋值给子类,这个是向下转型,需要我们手动实现. 赋值给超类的子类引用在运行期间将表现出不同的特性,这就是多态. 小类型 可转换为 ...
- java 抽象类与接口区别是什么_JAVA中抽象类与接口的区别,分别在什么情况下使用它们...
在网上看到很多人问关于"抽象类与接口的区别",因此本人想通过自己多年对JAVA开发的经验来总结一下抽象类与接口的区别以及分别在什么情况下使用它们. 在Java语言中, abstra ...
- java 继承 实现 会重写 方法吗_java 中继承,组合,重载,重写的实现原理 (转)...
我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...
最新文章
- java语言 U_Java语言的基础
- MySQL 慢查询日志工具之pt-query-digest
- Makefile —— Makefile的规则是什么?make是如何工作的?make的工作方式是什么?
- Atitit.异步编程 java .net php python js 对照
- Asp.net中一个页面多个表单的解决方案
- 手风琴html例子,jquery实现简单手风琴菜单效果实例
- NeurIPS 2020 所有RL papers全扫荡
- DENIED Redis is running in protected mode because protected mode is enabled
- 清华发布全国城市AI实力榜,你那里排名第几?
- 基于机器视觉的手机背光板划痕灰尘检测
- 2017中国程序员薪资生存现状调查报告
- c语言除法的作用,c语言除法(c语言除法保留小数)
- Unity 安装个人免费版步骤详解
- n维椭球体积公式_考前必背!数量关系、资料分析常用公式汇总!不再头大!...
- html无序列表转换为图片,HTML 无序列表项目符号使用图片的CSS写法
- plc梯形图转c语言,plc梯形图转换成stl程序的实例教程
- windows7创建wlan热点分享网络
- 365天英语口语学习_11,收拾餐桌碗碟
- CTF Alice与Bob
- Salesforce中国区或将解散?国产SaaS如何在竞争中扬长避短
热门文章
- Flutter进阶—质感设计之标签栏
- 中国特种可注射仿制药市场趋势报告、技术动态创新及市场预测
- 2021年中国制药机械市场趋势报告、技术动态创新及2027年市场预测
- 给所有的input设置 autocomplete=off
- IntelliJ Idea 常用快捷键 超实用!
- 【IT】jQuery AJAX Call to MVC Controller with Parameters
- 1、数据结构及算法绪论
- Java 内部类、局部内部类、静态内部类使用
- Docker、CentOS 8遭弃用,GPT-3、M1芯片撼动技术圈,盘点2020影响开发者的十大事件!
- 不知道不 OK!53 个 Python 经典面试题详解