Topic: 提个初学者的问题 |
Print this page |
1.提个初学者的问题 | Copy to clipboard |
Posted by: zyj0021 Posted on: 2007-10-21 20:17 例如代码: public class Parent { static int i=1; public static void func() { //dosomething } public static void main(String[] args) { Parent P1; Parent p2=new Parent(); Child c1=new Child(); //... } } class Child extends Parent { } 问题: 1.对于上面代码中的static相关内容、main方法、p2、c1的生成顺序是怎么样的?带static相关的内容,是不是最先生成,分配的内存是在桟还是堆?如上面的静态变量,静态函数,是不是和main一起生成的?上面static工作做完了,才开始构造类的对象,是不是先默认构造父类,再默认构造子类,再显式构造类对象? 2.Parent p1这个做了什么工作?在内存中有分配吗?还是编译的时候有什么特别的?这个时候的p1是什么样的状态,null 吗??还是什么都没做,只是在编译的时候做一些工作?象Parent p2=new Parent()这个,生成了引用变量(桟),和一个对象(堆),请问那个先生成,还是一起生成? |
2.Re:提个初学者的问题 [Re: zyj0021] | Copy to clipboard |
Posted by: Cappuccino Posted on: 2007-10-22 17:55 不敢保证是标准答案哈~~ 1. 一般都是先编译static的部分的,因为static声明的是类属性而非实例属性,类属性是一个类里面共有的,放在堆里面,而实例属性是放在栈里面的。关于堆和栈的区别网上很多,比如http://blog.csdn.net/ywl102402/articles/1025419.aspx这里就有一些说明,可以自己搜一下。而static的部分肯定是先于类的构造的。至于父类和子类之间的顺序关系,自己测试运行一下下面的代码就知道了^_^
2. p1只是声明了引用,但是并没有将任何的实例与这个引用挂钩起来,因此也不会在内存里面进行分配。p1这个时候的初始值取决于他所引用的类型,如果是对于Object的引用的话,默认是为空的,如果是针对基础类型的引用的话,譬如int p1; boolean p1之类的是会根据基础类型的默认值进行赋值的,例如为0或false。后面的Parent p2=new Parent()应该是先声明一个类型为p2的引用,然后new一个Parent并且将其引用交给p2。 大部分是个人理解,还没来得及查书,如果有疏漏请随意拍砖~( ̄▽ ̄)~( ̄▽ ̄)~ |
3.一个难题 [Re: Cappuccino] | Copy to clipboard |
Posted by: shuixing Posted on: 2007-10-23 10:28 各大虾能不能告诉一下this的用法 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |