如果类成员被引用,类不被引用,类会被释放吗?

问题描述

直接写例子:packagecom.test;publicclasstest{publictest(){//TODOAuto-generatedconstructorstub}publicclassnothing{Stringhah;nothing(Stringhh){hah=hh;}}publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubtesttt=newtest();nothingll=tt.newnothing("uno");Stringlll=ll.hah;ll=null;System.gc();System.out.println(lll);}}上例中ll一开始所引用的对象会被释放吗?

解决方案

解决方案二:
这个是会释放的.类对类成员的管理也只是保留了类成员的引用而已.而类成员并没有反向引用类.所以对类设置NULL后,没有指向该类的引用了.所以该类可以被回收.
解决方案三:
tt.newnothing("uno");这里创建的对象是会被释放的。但你可能理解错了?因为即使ll=null;System.gc();ll对应的内存对象立刻被释放掉,后面System.out.println(lll);依然可以打印出"uno",因为ll.hah也只是引用了一个String对象,lll同样引用这个String("uno")。虽然ll被清理,但这个String对象还是存在的,它还有一处引用就是lll。你不能从是否打印出null来看ll是否被回收
解决方案四:
会释放的,明显是被释放了啊,没看都设置为null了吗,何况ll是基本类型,会自动制定到内存中,
解决方案五:
不好说,现在我也不确定了
解决方案六:
还是会回收的,因为ll.hah是基本类型
解决方案七:
你可以这样想,如果一个类被释放了,那他的成员变量和方法还会在内存里吗?因为成员类毕竟还是其成员,皮之不存毛将焉附,就是这个道理呀
解决方案八:
引用4楼jintianhen1的回复:

不好说,现在我也不确定了

ll是基本类型?
解决方案九:
||这个对象不会被立即释放掉吧,应该是等GC自己来释放。||=null这里释放的是||指向uno的引用吧
解决方案十:
我把||=null去掉,gc只回收了||这个对象的引用,|||对象依然存在,这是怎么回事?调用system.gc()不是释放当前内存么。
解决方案十一:
如果没有一个引用指向这个对象,java虚拟机就会释放这个垃圾对象,程序员完全不用理会。
解决方案十二:
引用7楼Asura_X_Y_Y的回复:

Quote: 引用4楼jintianhen1的回复:
不好说,现在我也不确定了

ll是基本类型?

应该说是简单类型,字符串指向的是引用
解决方案十三:
释放不释放只要自己测试一下就OK了。你可以重写finalize方法,在里面打印提示信息,运行一遍看提示信息是否打印就知道了。
解决方案十四:
忘了说结论了,只要没有引用指向的对象照理说都应该被回收,但是垃圾回收机制什么时候回收也不确定。如果不显示调用System.gc()的话,也不会被回收,但是显示调用肯定被回收,即释放。

时间: 2024-11-03 11:23:16

如果类成员被引用,类不被引用,类会被释放吗?的相关文章

java-内部类和匿名内部类的区别,内部类和类成员的区别,忘详解!?大侠指教!

问题描述 内部类和匿名内部类的区别,内部类和类成员的区别,忘详解!?大侠指教! 在主程序的调用中内部类和匿名内部类区别和使用方法!内部类和类成员的区别! 解决方案 静态嵌套类和内部类的区别静态嵌套类和内部类的区别各种内部类的区别 解决方案二: http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html 解决方案三: http://zhidao.baidu.com/link?url=p1LWkqBDH3R4ULFWPhxDiJ0R-s

"派生类实例化时要首先要执行基类的静态构造函数"这句话对吗?

问题描述 例如:publicclassA{staticA(){Console.WriteLine("a");}}publicclassB:A{staticvoidMain(){Bkkk=newB();}}例子运行结果为a.但是,下面这个例子:publicclassA{staticA(){Console.WriteLine("a");}}publicclassB:A{Bkk=newB();staticvoidMain(){Bkkk=newB();}}例子运行结果:不是

class-C++托管类私有成员怎么在其他命名空间里引用?

问题描述 C++托管类私有成员怎么在其他命名空间里引用? rt,在托管类中建立个成员函数,在调用私有成员,不过托管类好像不支持指针这样操作 解决方案 私有成员只能反射调用,不管什么语言.lz采纳不及时.先把之前的采纳了,给你代码 解决方案二: namespace命名空间成员类的声明 解决方案三: http://blog.csdn.net/liyifei21/article/details/34838375 关键是 BindingFlags.NonPublic | BindingFlags.Ins

利用反射动态调用类成员

动态 (C#)利用反射动态调用类成员 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args ); 参数 name String,它包含要调用的构造函数.方法.属性或字段成员的名称. - 或 - 空字符串 (""

学习AS3:delete关键字和类成员

关键字 delete关键字在Flash中是用来删除定义的变量,但是并不将对象从内存中清除掉(这是垃圾收集器的工作).它只是将一个变量的引用设置成无效,让内存中的这个对象无法再被引用和使用,也无法再使用for in来枚举. 事实上,垃圾处理器(GC)将在特定的时候,自动的从内存中删除那些不再被引用和使用的变量.比如,你创建了两个对象引用A和B,都指向了对对象ObjectX的引用,如果delete了A,并不会让垃圾收集器把ObjectX从内存中删除,因为B的引用还是指向了这个对象.如果将A和B都de

(C#)利用反射动态调用类成员

动态 (C#)利用反射动态调用类成员 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args ); 参数 name String,它包含要调用的构造函数.方法.属性或字段成员的名称. - 或 - 空字符串 (""

初始化C++类成员和在你的MFC应用中加入位置栏

问题 我的问题是关于初始化C++类成员的.我见过许多这样的代码(包括在你的栏目中也见到过): CSomeClass::CSomeClass() { x=0; y=1; } 而在别的什么地方则写成下面的样子: CSomeClass::CSomeClass() : x(0), y(1) { } 我的一些程序员朋友说第二种方法比较好,但他们都不知道为什么是这样.你能告诉我这两种类成员初始化方法的区别吗? 回答 从技术上说,你的程序员朋友是对的,但是在大多数情况下,两者实际上没有区别.有两个原因使得我们

关于初始化C++类成员

在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种: 第一种方法: CMYClass::CSomeClass() { x=0; y=1; } 第二种方法: CSomeClass::CSomeClass() : x(0), y(1) { } 本文将要探讨这两种方法的异同以及如何使用这两种方法. 从技术上说,第二种方法比较好,但是在大多数情况下,两者实际上没有什么区别.第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑

C++中static类成员

static局部变量 static局部变量确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化 这种对象一旦被创建,在程序结束前不会被撤销.在该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值. #include<iostream> #include<string> #include<assert.h> using namespace std; size_t count_calls() { static size_t ctr=0; return ++