A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

因为Zi继承了Fu,所以new Zi包括的东西要多于new Fu,也可以说是new Zi 包括 newFu,那不是应该是
Zi z = Fu;

3 个回复

倒序浏览
大哥,你写错了。 Fu f=new Zi();  子类继承了父类,所以使用父类引用指向子类对象是可以的,这就是多态的特性。如果你的父类是抽象类,或者父类的构造方法被私有化,或者父类是接口,你是不能直接创建父类对象的。

子类对象在创建时,确实拥有了父类的所有非私有的功能,甚至可以追溯到Object类。

使用Fu f=new Zi(); 这样的好处是,以后你又创建了一个OtherZi类继承自Fu类,那么你还是可以使用该Fu类的引用指向OtherZi类对象。这样做很通用。这就是多态的好处!

一个典型的例子  List<String> lists=ArrayList<String>();  
回复 使用道具 举报
栈中的变量名是父类类型的,只认父类
回复 使用道具 举报
Fu f = new Zi ();
父类引用可以指向子类对象,
左边Fu f是定义了一个叫f的父类型变量,在栈中开辟了一个空间
栈中的变量名是父类类型的,因而去堆中找对应地址值时只找父类类型
所以在编译时无论成员变量、成员函数、静态函数全部看左边
而运行时由于子类的成员函数动态绑定,所以才会运行子类的方法。
父类比子类更抽象,因此更加通用,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作

而如果反过来,父类的很多抽象的特性就会消失了,功能效果和Zi z = new Zi(); 一样了,而且还要写向下转行的代码,没有意义。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马