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

本帖最后由 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 个回复

正序浏览
Liveei 发表于 2015-8-22 19:34
真没有看的不认真,我是那种搞不懂原理就不想死记硬背的那种人,我想知道变量为什么没被覆盖,变量在内存 ...

想知道原理看视频比较好  老毕讲的比较好理解
回复 使用道具 举报
a1ccwt 中级黑马 2015-8-22 20:09:11
8#
这样用非常容易出问题
回复 使用道具 举报
Liveei 中级黑马 2015-8-22 19:34:59
7#
sunsteam 发表于 2015-8-22 00:11
你视频看的不够仔细啊  非静态方法是存在重写的  这是多态存在的根本意义   但是变量是不存在重写的呀   ...

真没有看的不认真,我是那种搞不懂原理就不想死记硬背的那种人,我想知道变量为什么没被覆盖,变量在内存中的存储、读取及变更遵循的原则是什么?
回复 使用道具 举报
也跟着学习了
回复 使用道具 举报
Liveei 发表于 2015-8-21 23:23
多谢,只是输出  f.变量  会是父类中的值,输出 f.方法 为毛会是子类重写的方法? ...

你视频看的不够仔细啊  非静态方法是存在重写的  这是多态存在的根本意义   但是变量是不存在重写的呀  如果按照父类进行引用  父类有就调用他自己的  父类没有就编译失败   另外静态方法跟类名绑定 引用谁就调用谁的
回复 使用道具 举报
sunsteam 发表于 2015-8-21 00:01
你这不能编译通过吧   分号都没写 new Zi后面要加括号的

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

多谢,只是输出  f.变量  会是父类中的值,输出 f.方法 为毛会是子类重写的方法?
回复 使用道具 举报
谢谢楼上,连小纰漏都看出来了,只是还是不太明白,如果输出  f.变量  会是父类中的值,输出 f.方法 为毛会是子类重写的方法?
回复 使用道具 举报
你这不能编译通过吧   分号都没写 new Zi后面要加括号的

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

之所以要把子类对象当成父类来调用  是提高扩展性  就是以后加了功能相似的新子类 不用回头改代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马