Java 中一个对象a持有对象b中的静态常量?下面的两种写法有区别么

时间:2017-12-21 19:00:02   浏览:次   点击:次   作者:   来源:   立即下载

举个简单的例子,下面为类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

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息