当前位置: 代码迷 >> J2SE >> Java内部类对象对外部类对象引用的有关问题
  详细解决方案

Java内部类对象对外部类对象引用的有关问题

热度:25   发布时间:2016-04-23 21:16:27.0
Java内部类对象对外部类对象引用的问题.

因为没有系统的学过Java, 但现在很多项目都是JAVA语言,所以就以已经有的一点点C语言基础开始做java项目. 有一个内部类的问题想不明白,所以想请教一下.


下面有代码:

定义了2个类,一个是MainClass, 一个是SeviceClass. 还有一个接口. 在MainClass中实现这个接口定义了一个匿名类对象, 按照书上讲的, 这个匿名类对象会保存一个对MainClass对象的引用. 然后又将这个匿名类对象注册给ServiceClass对象, 假设这个ServiceClass对象一直在运行. 
那么假设MainClass对象运行完毕了, 系统是不是不会去回收这个对象占用的内存空间? 因为有一个内部类对象一直引用着它?

那么如果将内部类对象的引用 mListener 置为 null 后, 系统会回收MainClass对象占用的内存空间吗




public class main
{
public static void main(String args[])
{
MainClass mInstance = new MainClass();
mInstance.RegisterListener();
//mInstance.UnRegisterListener();
}
}

interface IInterface
{
public void onStatusChanged(int newStatus);
}

class ServiceClass
{
IInterface mListener = null;

public void RegisterListener(IInterface ls)
{
mListener = ls;
}

private void notifyMainClass(int newStatus)
{
if (mListener != null)
{
try
{
    mListener.onStatusChanged(newStatus);
}
catch(NullPointerException e)
{
mListener = null;
e.printStackTrace();
}
}
}
}


class MainClass
{
private int mNewStatus = -1;
ServiceClass mService = new ServiceClass();

private IInterface mListener = new IInterface()
{
public void onStatusChanged(int newStatus)
{
/* process newStatus */
System.out.println("" + newStatus);
mNewStatus = newStatus;
}
};


void RegisterListener()
{
    mService.RegisterListener(mListener);
}

void UnRegisterListener()
{
mListener = null;
}


}





------解决方案--------------------
楼主  Java里不像C++有析构函数 对象的销毁内存的回收是JVM的工作 C/C++里我个人认为是程序员在管理内存 但是Java程序里内存是由JVM来管理的 有gc专门负责垃圾回收 但是我们无法得知gc会在什么时候销毁对象 回收内存
------解决方案--------------------
Java中有垃圾回收机制,就像楼上说的,有GC专门负责垃圾回收 但是我们无法得知GC会在什么时候销毁对象 回收内存 ,所以是不确定的
  相关解决方案