1.java 某个类的几个对象,这些对象调用类中一个函数(普通的函数),是各自拥有自己的函数代码还是使用同一段代码?
2.java 继承中,子类从父类得到一些普通函数,这些函数的代码,是子类自己独自拥有一份还是和父类使用同一段函数代码。
3.第一次发帖,积分什么的不会搞,貌似自己也没有积分,呵呵,大家包涵!
[quote]1.java 某个类的几个对象,这些对象调用类中一个函数(普通的函数),是各自拥有自己的函数代码还是使用同一段代码?[/quote]
这几个对象调用的当然是同一段代码了。jvm中有一个java 栈的概念,每个线程有且仅有一个java栈,每次方法调用jvm都会向当前的java栈中压入一个栈帧,使用这个帧来存数参数、局部变量、中间运算结果等等数据。方法退出的时候就出栈,弹出了。
[quote]2.java 继承中,子类从父类得到一些普通函数,这些函数的代码,是子类自己独自拥有一份还是和父类使用同一段函数代码。[/quote]
子类编译后生成的字节码本身并不会包含父类特有的方法字节码,jvm会在运行时,当子类要调用到父类的方法是,会将父类的方法调用以栈帧(上面提到的)的方式压入并调用方法的指令集执行。
从楼主的提问中可以看得出来,楼主本身对于JVM本身可能并不太了解,建议楼主可以看看《Inside JVM》、jvm规范等,亦可参考我的一个基础的JVM入门系列[url=http://boy00fly.iteye.com/blog/1095263]自己动手写写:关于jvm的理解(1)[/url]
[url=http://boy00fly.iteye.com/blog/1095744]自己动手写写:关于jvm的理解(2)[/url]
[url=http://boy00fly.iteye.com/blog/1096637]自己动手写写:关于jvm的理解(3)[/url]
1.同一段吧。几个对象的变量是保存在堆栈里的各自的具体的实例中,代码的话只有一段吧
2.继承后应该是同一段的,除非用@override把函数重写了,继承的话本质上应该是之类的对象中包含了一个父类的对象
我感觉JAVA实现的内部结构和C C++应该差别不大,
刚搜索了一下,是这么说的:
继承是一种静态共享代码的手段,通过子类对象的创建,可以接受某一消息,启动其父类所定义的代码段,从而使父类和子类共享这一段代码。
个人见解都是各自独立的。
[quote]
个人见解都是各自独立的。
[/quote]
代码段必然不是独立的 不然内存都不够。。。。
那要看你实现什么功能了?一般用继承是为了让代码的重用性强
[quote]http://hllvm.group.iteye.com/group/wiki/3053-JVM[/quote]
看看这篇文章和这个群组中的文章吧,相信对你的疑问有所帮助。
我想楼主知道了答案也可能忘。。建议下本《深入JAVA虚拟机》的PDF看看。就是豁然开朗,哈哈。 :D
函数代码肯定是能够复用尽量复用的啦,设计者也肯定考虑到这个,所以是同一段代码.
src是一个,代码段自然也是一个,否则内存怎么够。当然,这个不考虑多个classloader的情况
堆内存有段PermGen区专门储存字节码信息。
每个类只在首次调用时加载一次,另外如果长时间不用的类会被从内存移除。以后再次调用 时会被加载。
类的加载顺序是:首先加载Object类,如果Object类已成功加载,会再加载类的父类,最后再加载要调用的类;也就是说,类按照继承顺序加载。
楼主是学习java的吗?
我的理解是 代码只有一段
但是不同的调用放调用同一段代码所分配的内存空间是不同的
代码段是共享的,数据段和堆栈段是独立的。但真正将代码段的函数调入栈里面准备执行的时候是独立的,这时候他是作为指令等待着被执行的。
楼主,当你遇见这种问题的时候你要自己问问自己,如果让我设计这个问题我会怎么设计呢?!
你想,如果两个对象要调用同一个方法,如果我是为他们分别分配储存这个方法的内存,那么如果我用一个循环来创建对象,那么就会分配出很多内存,但是内存的内容都是一样的,你觉得这样设计合理吗!?
每个面向对象的都会回答,明显不合理啊!
所以结论很简单他们是同一段代码。(另外为什么String这个类不是基本类型也是这个原因)
1 类的多个对象,方法共用,属性各自有。
2 子类继承父类,方法也是共用。
3 你悬赏的积分很高啊。
继承要看你怎么用了,如果不重写父类的方法,那就是执行同一段代码。如果重写的话,就执行子类的代码。。
代码是同一段代码,但是调用都是独立的。
:o