作者csihcs (非天夜翔)
看板java
标题Re: [问题] 资源回收的问题
时间Sun May 13 22:25:38 2012
※ 引述《SusanTakumi (〒△〒被水桶了...)》之铭言:
: Dear 大家,
: 这题是 SCJP JAVA 6.0 的习题
: @@" 看半天还是不知道为什麽
: 所以上来请教大家一下
: class Beta {
: }
: class Alpha {
: static Beta b1;
: Beta b2;
: }
: public class Tester {
00 : public static void main(String[] args) {
01 : Beta b1 = new Beta();
02 : Beta b2 = new Beta();
03 : Alpha a1 = new Alpha();
04 : Alpha a2 = new Alpha();
05 : a1.b1 = b1;
06 : a1.b2 = b1;
07 : a2.b2 = b2;
08 : a1 = null;
09 : b1 = null;
10 : b2 = null;
: // 做一些事情
: }
: }
在 00 结束
Alpha.b1
└→┌──┐
│null│
└──┘
目前有 0 个物件等待被回收
在 01 结束
Alpha.b1
└→┌──┐
│null│
└──┘
b1@main
└──→┌────┐
│Beta实体│
└────┘
目前有 0 个实体等待被回收
在 02 结束
Alpha.b1
└→┌──┐
│null│
└──┘
b1@main b2@main
└──→┌────┐ └──→┌────┐
│Beta实体│ │Beta实体│
└────┘ └────┘
目前有 0 个实体等待被回收
在 03 结束
Alpha.b1
└→┌──┐
│null│
└──┘
b1@main b2@main
└──→┌────┐ └──→┌────┐
│Beta实体│ │Beta实体│
└────┘ └────┘
目前有 0 个实体等待被回收
在 04 结束
*a1.b1 编译後 等同 Alpha.b1
Alpha.b1 [a1.b1]
└→┌──┐
│null│
└──┘
b1@main b2@main
└──→┌────┐ └──→┌────┐
│Beta实体│ │Beta实体│
└────┘ └────┘
a1@main
└──→┌──-──┐
│Alpha实体│
│┌─┐ │
││b2│ │
│└┼┘ │
└─┼-──┘
└→null
目前有 0 个实体等待被回收
在 05 结束
*a2.b1 编译後 等同 Alpha.b1
Alpha.b1 [a1.b1][a2.b1]
└→┌──┐
│null│
└──┘
b1@main b2@main
└──→┌────┐ └──→┌────┐
│Beta实体│ │Beta实体│
└────┘ └────┘
a1@main a2@main
└──→┌──-──┐ └──→┌──-──┐
│Alpha实体│ │Alpha实体│
│┌─┐ │ │┌─┐ │
││b2│ │ ││b2│ │
│└┼┘ │ │└┼┘ │
└─┼-──┘ └─┼-──┘
└→null └→null
目前有 0 个实体等待被回收
在 06 结束
Alpha.b1 [a1.b1][a2.b1]
│
│
│
b1@main ↓ b2@main
└──→┌────┐ └──→┌────┐
│Beta实体│←┐ │Beta实体│
└────┘ │ └────┘
a1@main │a2@main
└──→┌──-──┐ │└──→┌──-──┐
│Alpha实体│ │ │Alpha实体│
│┌─┐ │ │ │┌─┐ │
││b2│ │ │ ││b2│ │
│└┼┘ │ │ │└┼┘ │
└─┼-──┘ │ └─┼-──┘
└────┘ └→null
目前有 0 个实体等待被回收
在 07 结束
Alpha.b1 [a1.b1][a2.b1]
│
│
│
b1@main ↓ b2@main
└──→┌────┐ └──→┌────┐
│Beta实体│←┐ │Beta实体│←┐
└────┘ │ └────┘ │
a1@main │a2@main │
└──→┌──-──┐ │└──→┌──-──┐ │
│Alpha实体│ │ │Alpha实体│ │
│┌─┐ │ │ │┌─┐ │ │
││b2│ │ │ ││b2│ │ │
│└┼┘ │ │ │└┼┘ │ │
└─┼-──┘ │ └─┼-──┘ │
└────┘ └────┘
目前有 0 个实体等待被回收
在 08 结束
Alpha.b1 [a1.b1][a2.b1]
│
│
│
b1@main ↓ b2@main
└──→┌────┐ └──→┌────┐
│Beta实体│←┐ │Beta实体│←┐
└────┘ │ └────┘ │
a1@main │a2@main │
↓
┌──-──┐ │└──→┌──-──┐ │
null
│Alpha实体│ │ │Alpha实体│ │
│┌─┐ │ │ │┌─┐ │ │
││b2│ │ │ ││b2│ │ │
│└┼┘ │ │ │└┼┘ │ │
└─┼-──┘ │ └─┼-──┘ │
└────┘ └────┘
目前有 1 个实体等待被回收,
Alpha 实体
在 09 结束
Alpha.b1 [a1.b1][a2.b1]
│
│
│
b1@main ↓ b2@main
↓ ┌────┐ └──→┌────┐
null │Beta实体│←┐ │Beta实体│←┐
└────┘ │ └────┘ │
a1@main │a2@main │
↓
┌──-──┐ │└──→┌──-──┐ │
null
│Alpha实体│ │ │Alpha实体│ │
│┌─┐ │ │ │┌─┐ │ │
││b2│ │ │ ││b2│ │ │
│└┼┘ │ │ │└┼┘ │ │
└─┼-──┘ │ └─┼-──┘ │
└────┘ └────┘
目前有 1 个实体等待被回收,
Alpha 实体
在 10 结束
Alpha.b1 [a1.b1][a2.b1]
│
│
│
b1@main ↓ b2@main
↓ ┌────┐ ↓ ┌────┐
null │Beta实体│←┐null │Beta实体│←┐
└────┘ │ └────┘ │
a1@main │a2@main │
↓
┌──-──┐ │└──→┌──-──┐ │
null
│Alpha实体│ │ │Alpha实体│ │
│┌─┐ │ │ │┌─┐ │ │
││b2│ │ │ ││b2│ │ │
│└┼┘ │ │ │└┼┘ │ │
└─┼-──┘ │ └─┼-──┘ │
└────┘ └────┘
目前有 1 个实体等待被回收,
Alpha 实体
: 当程式执行到"做一些事情",有多少物件有资格被资源回收?
: A. 0
: B. 1
: C. 2
: D. 3
: E. 4
: F. 5
: 答案:
: B 是正确的。
: 很清楚的,
: a2 有指涉到一个物件,
: a2.b2有指涉到一个物件。
: 可能比较看不清楚的是,
: 你仍然可能透过 a2.b1 这个静态变数来存取另外一个 Beta 物件,
: 因为那个变数是静态的。
: ...
: 解答如上所示
: 但是它没有交代的是
: 究竟是那一个变数有资格被资源回收?
: 所以我一直不是很了解
: 感谢大家
※ 引述《SusanTakumi (〒△〒被水桶了...)》之铭言:
: Dear 大家,
: 这题是 SCJP JAVA 6.0 的习题
: @@" 看半天还是不知道为什麽
: 所以上来请教大家一下
: class Beta {
: }
: class Alpha {
: static Beta b1;
: Beta b2;
: }
: public class Tester {
: public static void main(String[] args) {
: Beta b1 = new Beta();
: Beta b2 = new Beta();
: Alpha a1 = new Alpha();
: Alpha a2 = new Alpha();
: a1.b1 = b1;
: a1.b2 = b1;
: a2.b2 = b2;
: a1 = null;
: b1 = null;
: b2 = null;
: // 做一些事情
: }
: }
: 当程式执行到"做一些事情",有多少物件有资格被资源回收?
: A. 0
: B. 1
: C. 2
: D. 3
: E. 4
: F. 5
: 答案:
: B 是正确的。
: 很清楚的,
: a2 有指涉到一个物件,
: a2.b2有指涉到一个物件。
: 可能比较看不清楚的是,
: 你仍然可能透过 a2.b1 这个静态变数来存取另外一个 Beta 物件,
: 因为那个变数是静态的。
: ...
: 解答如上所示
: 但是它没有交代的是
: 究竟是那一个变数有资格被资源回收?
: 所以我一直不是很了解
: 感谢大家
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.163.135.112
1F:推 SusanTakumi:@@" 感谢你 csihcs大 05/14 08:13