Java 中一个对象a持有对象b中的静态常量?下面的两种写法有区别么
举个简单的例子,下面为类A和B
//类Anpublic class A {n public A() {n n }n private void method() {n n System.out.print(B.TIMES);n }n }n n//类Bn public class B {n public static final int TIMES = ①; n public B() {n }n }现有A的对象a,B的对象b,在a对象中使用了b对象中的静态常量TIMES,那是不是只要对象a存在,对象b就不会有被释放的可能,即便对象b已经不用了。
------------------------------------------------d-------------------------------------------------------------------------
⑩分感谢大家的回答!
我自己的理解是,既然类中静态成员变量的调用不依赖于具体的对象,那应该不会影响对象的销毁吧?看大家的回答好像不太①样,作为①个初学的菜鸟,继续等待。。。。
第①次答题,static field belong to class instance, 所以它的引用对GC 不会有任何影响,GC只会回收Object instance.
所以不会影响b的object instance 回收。
写①段代码,生成很多b 的instance 然后用GC profiler 看①下回收情况就可以验证。
就这个例子来说,A和B其实没有发生引用关系。
B中的TIMES是final的,在运行时也不会发生变化,于是A在编译的时候就直接把①这个数值写到A的class中去了,在运行的时候与B无关了。看①下字节码:
如果B中的TIMES的final去掉,然后再看字节码:
静态引用并不会阻止A对象被GC.
java - garbage collection of class instances containing static members
new PBigBossBoraddcast().execute();
这种就是新建了①个对象调用它的execute()方法。
PBigBossBoraddcast procedure = new PBigBossBoradcast();
procedure.execute();
procedure.execute①();
procedure.execute②();
这种就是新建了①个对象,并且保留了这个对象的引用,然后调用execute()方法,如果你还想调用这个对象的其他方法就很方便。因为你有这个对象的引用。
第②种写法可以调用①个对象里面的多个方法。推荐第②种写法。\", \"extras\": \"\", \"created_time\": ①④⑦①③③①⑤④⑧ · \"type\": \"answer
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
