从delphi到java (3) -动态对象的创建和释放(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
假如我有一个动态创建(new)的数组,其中的每个元素是一个Panel对象,
而这每个Panel上面又有动态创建的一系列小的Panel对象,形象的说
就象下面这个样子:
Array[0]: MainPanel0( subPanel0:subPanel1:subPanel2:subPanel3 )
Array[1]: MainPanel1( subPanel0:subPanel1:subPanel2:subPanel3 )
Array[2]: MainPanel2( subPanel0:subPanel1:subPanel2:subPanel3 )
Array[3]: MainPanel3( subPanel0:subPanel1:subPanel2:subPanel3 )
1.(100分)在运行过程中我想删除最后一个数组元素(也就是从屏幕上删掉最后一个
MainPanel),该怎么办? 好像没有类似Delete(MainPanel3)的方法. 有一个方法比较象,
就是父包容器的remove方法,但是如果用Parent.remove(Array[3])之后,Array数组
的下标是否会自动减一呢? 或者我还要自己重新设置Array的长度?
2.(50分)当我删除一个数组元素MainPanel的时候,上面的subPanel是否也要先删除掉?
如果不删除掉会不会一直存在于内存中?
3.(150分)结合前面两个问题,在Java的awt中是否有类似Delphi控件的Owner的概念,就是说
当父包容器被删除后,上面的子awt对象是否能自动删除?
4.(100分)另一方面,如果我要动态添加一个数组元素,我怎样把新创建的MainPanel添加
到Array里面去呢?
 
Java中需要用动态数组的话,可以用vector类。vector类似array,不同的是它的大小可以
在运行时动态变化。所以说:
1。用vector代替array,用vector的remove方法删除任意一个数组元素。
>>数组的下标是否会自动减一呢? 或者我还要自己重新设置Array的长度?
这些你都不用考虑了。
2。从理论上说,不用先删除subPanel,因为在MainPanel中,subPanel不过是一个引用而已,当
MainPanel被删除后,其内部对subPanel的引用也失效了。当垃圾回收器注意到没有subPanel
的有效引用时,会自动释放资源。但是谁也不能保证垃圾回收器什么时候运行,它的级别运行
级别很低。
3。能
4.又回到1了。用vector的add方法添加数组元素。
 
java.awt.Container
里有方法处理你的问题,一般没有必要自己写。确实需要的话用Vector就可以了。
建议多看看JDK附带的源程序,很有收益的。
borland的天才程序员在VCL中融入了他们的理念,sun的也一样。
 
1、分两步做:
. TPanel(Array[3]).Free;
. SetLength(Array,3);
如果你是释放的中间的元素,如 Array[1],需要手工向前调整,再 SetLength。
2、如果子 Panel 创建的时候指定了 Owner (不是 Parent) ,Delphi 会自动释放 SubPanel。
否则需要手工释放。
3、Java 好像也要视编译平台而定,其实我写程序时,所有的动态对象全部手工释放,个人认为
这个习惯比较好。
4、动态添加好办:
SetLength(Array, High(Array)+1);
Array[High(Array]] := NewMainPanel;
Any Question ?
 
多谢!答案我比较满意,除了巴库巴库看错了题意---我说的是Java编程呀!
JJams_King到外面拿剩下的100分.
 
Faint !
开始我也奇怪, CAkk 怎么会问这种常识性问题呢?
但是 CAkk 在 1、2、4 题里都没有提到 Java 啊。
Faint Again ! :-(
 
后退
顶部