在Java当中父类和子类之间的强制转换

接下来的三点是我从百度知道上引用来的。嘻嘻~,感觉不错。

1.从对象的内存角度来理解.
假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,里面的变量需要占用0.5M内存.
现在通过代码来看看内存的分配情况:
2.f = new Father();//系统将分配1M内存.
Son s = new Son();//系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用父类的方法.
3.Son s1 = s;//s1指向那1.5M的内存.
Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存,即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).
Son s2 = (Son)f;//这句代码运行时会报ClassCastException.因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.
Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.

然后是我自己读完的想法:

1, 这句话挺重要的:在子类的构造函数中,子类会隐藏的引用super指向父类实例,所以在实例化子类之前,会先执行父类的构造函数。子类对象包含了父类的实例。

2, 在强制转化时,子类可以向父类转化,因为可以砍掉(忽略。。)一些,然而父类却不能向子类转化,你不能一句强制转化就让它凭空增加一些内存。

如有错误欢迎评论指正!!!

时间: 2024-10-10 13:48:17

在Java当中父类和子类之间的强制转换的相关文章

override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被定义为final不能被重写。 overload(重载,过载) 1、参数类型、个数、顺序至少有一个不相同。 2、不能重载只有返回值不同的方法名。 3、存在于父类和子

override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之间. 5.方法被定义为final不能被重写. overload(重载,过载) 1.参数类型.个数.顺序至少有一个不相同.   2.不能重载只有返回值不同的方法名. 3.存在于父类和子类.同类中. 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现. 重写(O

java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题

1 /* 2 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 3 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 4 */ 5 import static java.lang.System.out; 6 7 public class PersonDemo 8 { 9 public static void main(String[] args) 10 { 11 //*********测试父类与子类之间的循环调用的问

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

Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就是一个对象多态的问题. 既然多态,那么访问控制权限就要让父类也能访问. 也就是说,子类重写方法时不能使该方法拥有比父类更严格的访问控制权限. 否则违背了多态,导致向上类型转换后,使用父类变量无法调用该子类私有方法.

java中父类与子类的关系以及使用

java中父类与子类的关系以及使用 在java中规定:一个父类可以有多个子类,但是一个子类只能有一个父类.子类可以通过extends关键字来继承父类.做个比较通俗的比喻,就像一个父亲可以有多个亲孩子,但是一个孩子只能有一个亲生父亲. 1.继承以及重写:子类继承父类是对父类属性和方法的全面继承,同时子类在继承了父类的方法后,可对父类的方法进行重写. public class Son extends Fat{ private int b; private String h1; public void

C#中父类和子类之间相互转换

所用到的类文件: Person.cs: Student.cs: Teacher.cs: 问题1: 总结: 1 父类不能直接强制转换成子类 2 只有父类对象指向子类,那么父类是可以强制转换成子类,如果父类对象没有指向子类,那么强制转换就会报错的. 即:Person p = new Student()这种情况下 才能将父类强制转成子类. 子类转换成父类: 原文地址:http://blog.51cto.com/11871779/2147440

基类与子类之间的引用转换

(一) 从该源代码中可看出,子类可直接赋给基类(“基类变量=子类对象”):基类的引用类型要传递给子类必须通过强制转换(“子类变量=(子类名)基类对象”): 子类之间不可以进行转换. (二) 该源代码可总结出: 当基类与子类有同名的变量时,以引用变量为准,引用变量是谁,就调用哪个类的变量:当基类与子类有同名的方法时,以具体对象类型为准,对象是什么类型,就调用哪个类的方法:基类与子类之间的转换:基类变量可以直接引用子类对象,或者直接将子类对象赋给基类变量:但是基类对象要转换为子类变量时,就必须进行强

父类和子类之间的转换

结论: 1.父类(基本类)转子类(扩展类),报错 2.子类(扩展类)转父类(基本类),成功 实验如下: 父类(基本类) public class Person { private String name; private String doc; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDoc() { return

父类和子类之间的关系操作方法

一.随机数的声称 1. arc4random()%10 2. arc4random_uniform(10) 两种方法产生的效果都是一样的! 二.UIView的常见方法 1.addSubview [self.view addSubview:newView]; 2.NSarrary* subviews这是一个数组,用以返回view中的组件 3.获取当前view中的最后一个组件 [self.view.subviews lastObject]; 4.删除当前的view中的最后一个组件 [last rem

Java当中数组和容器之间的相互转换

一.容器转化到数组使用toArray()方法 二.数组转化为容器,使用Arrays.asList(数组)会返回一个ArrayList,然后使用容器的方法可以对其进行操作. [1] http://my.oschina.net/laigous/blog/28470