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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Liveei 于 2015-8-21 23:19 编辑

class Fu{
int a=10
}
class Zi extends Fu
{
int a=20
}
class Test
{
public static void main (String[] args)
{
Fu f = new Zi();
}
}
这里 Fu f = new Zi() 中    f 是父类类型的 ,但又是一个子类的对象,
上课老师讲 f.a 的输出值是 10      我不太理解,然后内存图也不会画,绕晕死了{:3_62:}   

8 个回复

倒序浏览
你这不能编译通过吧   分号都没写 new Zi后面要加括号的

简单来说 等号左边代表引用类型  就是作为父类还是作为子类来用    等号右边是实际在堆内存中创建的对象类型. 一个多态的对象无论怎么引用 本身还是创建出来的那个类型  

之所以要把子类对象当成父类来调用  是提高扩展性  就是以后加了功能相似的新子类 不用回头改代码
回复 使用道具 举报
谢谢楼上,连小纰漏都看出来了,只是还是不太明白,如果输出  f.变量  会是父类中的值,输出 f.方法 为毛会是子类重写的方法?
回复 使用道具 举报
sunsteam 发表于 2015-8-21 00:01
你这不能编译通过吧   分号都没写 new Zi后面要加括号的

简单来说 等号左边代表引用类型  就是作为父类还 ...

多谢,只是输出  f.变量  会是父类中的值,输出 f.方法 为毛会是子类重写的方法?
回复 使用道具 举报
Liveei 发表于 2015-8-21 23:23
多谢,只是输出  f.变量  会是父类中的值,输出 f.方法 为毛会是子类重写的方法? ...

你视频看的不够仔细啊  非静态方法是存在重写的  这是多态存在的根本意义   但是变量是不存在重写的呀  如果按照父类进行引用  父类有就调用他自己的  父类没有就编译失败   另外静态方法跟类名绑定 引用谁就调用谁的
回复 使用道具 举报
也跟着学习了
回复 使用道具 举报
Liveei 中级黑马 2015-8-22 19:34:59
7#
sunsteam 发表于 2015-8-22 00:11
你视频看的不够仔细啊  非静态方法是存在重写的  这是多态存在的根本意义   但是变量是不存在重写的呀   ...

真没有看的不认真,我是那种搞不懂原理就不想死记硬背的那种人,我想知道变量为什么没被覆盖,变量在内存中的存储、读取及变更遵循的原则是什么?
回复 使用道具 举报
a1ccwt 中级黑马 2015-8-22 20:09:11
8#
这样用非常容易出问题
回复 使用道具 举报
Liveei 发表于 2015-8-22 19:34
真没有看的不认真,我是那种搞不懂原理就不想死记硬背的那种人,我想知道变量为什么没被覆盖,变量在内存 ...

想知道原理看视频比较好  老毕讲的比较好理解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马