J2SE基础夯实系列之父类引用指向子类对象
父类引用指向子类对象应该说是比较困难的知识点,多态,面向对象等方面的知识看似很简单的话,其实包含着很多规范在里面。
从对象的内存角度来理解试试.
假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.
现在通过代码来看看内存的分配情况:
Father f = new Father();//系统将分配1M内存.
Son s = new Son();//系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用父类的方法.
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内存.示例:
这里的结果是两个Parent!!是因为static方法的原因。因为都是静态方法。所以子类方法的 getName() 就不是方法的重写,其貌似重写的作用根本没有产生,根据对象的声明,第二句只会输出的是 Parent.getName() 方法。
二 多态的好处(父类中抽象出共性,子类实现个性)
这个是实现多态要素之一,多态后就可以写出一段所有子类都通用的代码,当添加新的子类时,这段代码是不需要修改的。
比方说:父类Animal,子类Cat,Dog
//如果使用第2行,当改用Dog的时候,那么第3行也需要改变
1 Animal a = new Cat();
2 //Cat a = new Cat();
3 a.someMethod();
现在你要写一个汽车和卡车的javabean类,他们都是属于车吧,都有型号,车速,厂商,等变量和方法吧,如果他们都继承同一个父类,那个父类把他们共同的变量和方法都写好了,比如厂商。那么汽车和卡车的类就不用写厂商了,只要写他们不同的比如型号,车速就可以了。
也就是说是多态的好处,父类里面可以有共同的变量和方法写好。子类只需要写各自的东西就可以了。