今天楼主结课测试,结果被一道说难不难,说简单不简单的题目搞晕了,充分说明了楼主的基础不扎实,很多细节没有搞清晰,就包括这一个经典的父类与子类的转换问题。今天总结一下。
1、子类对象转换为父类对象
看一段代码:
package com;
public class Test {
public static void main(String[] args) {
Fu foo = new Zi();
foo.print_info();
}
}
class Fu{
public void print_info(){
System.out.println("父类的print_info");
fun();
}
public void fun(){
System.out.println("我是父类!");
}
}
class Zi extends Fu{
public void fun(){
System.out.println("我是子类!");
}
}
这段程序的输出是:父类的print_info 我是子类!
楼主之前觉得答案是:父类的print_info 我是父类!觉得既然将子类的对象转换为了父类的对象,为何会调用子类的fun()方法?
看了看别人写的理解,这个foo是一个引用类型的变量,new这个关键字才表明在在堆中分配了一段空间来存放类Zi中的数据,并返回一个Zi的对象,并赋值给Fu的引用foo,即foo指向子类的对象,此时,子类的对象并没有定义一个名字。相当于,Zi s = new Zi(); Fu foo = s;
2、父类对象转换为子类对象
package com;
import java.util.Arrays;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Fu foo = new Zi();
Zi zoo = (Zi)foo;//将父类的对象强制转换为子类对象,只能通过父类指向子类对象的引用来强制转换
zoo.print_info();
}
}
class Fu{
public void print_info(){
System.out.println("父类的print_info");
fun();
}
public void fun(){
System.out.println("我是父类!");
}
}
class Zi extends Fu{
public void fun(){
System.out.println("我是子类!");
}
}
上面的代码的运行结果也是:父类的print_info 我是子类!
如果我们用Zi zoo = new Fu();这里时会报错的,我们可以这样理解,子类继承了父类,肯定会比父类拥有更多的东西,所以这样直接转换,报错。
也可以这样:
在前面加一条判断语句 if(father instanceof Son);防止报ClassCastExcept异常。
如:
Father f = new Son(); //父类引用指向子类对象
if(father instanceof Son)
{
Son s2 = (Son)f;
}
本文探讨了Java中关于父类与子类对象转换的问题,包括子类对象如何转换为父类对象,以及如何将父类对象转换为子类对象,通过实例代码进行解析。
9691

被折叠的 条评论
为什么被折叠?



