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的部分肯定是先于类的构造的。至于父类和子类之间的顺序关系,自己测试运行一下下面的代码就知道了^_^

class Base
{
  public Base()
  {
    System.out.println("Base is constructed.");
  }
}
class Extends extends Base
{
  public Extends()
  {
    System.out.println("Extends is constructed.");
  }
  public static void main(String[] args)
  {
    new Extends();
  }
}


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