Java不支持pointer,只提供reference,初学者常常因此颇为困惑,特别是修过数据结构的信息系学生,他们心中第一个想到的是:「没pointer,这怎么成,那不就做不出linkedlist和tree的数据结构?」殊不知reference就是一种智能型的pointer,它具有pointer的好处,而且不用像pointer一样要程序员自行reference(*)以及dereference(&),更不会像pointer一样会误闯内存禁区造成crash。
因为好处多多,所以reference已经是现代化程序语言的重要必备功能了。什么!你说xx高级语言没支持reference,那你可以把它埋葬在二十世纪的历史灰烬中。Java对于资料的处理方式是:只要是基本型态(包括boolean,byte,short,int,long,float,double,char)一律使用passbyvalue,其它型态一律passbyreference。但是我发现这在未来有可能变动,因为Javalanguage将byvalue订为reservedword(非keyword)。当Java将byvalue变成keyword之时,非基本型态的值就可以passbyvalue了,但我相信,此时Java也必须开始支持copyconstructor
作为配套措施,毕竟使用deepcopy或shallowcopy(甚至deep和shallow兼而有之的copy)还是要让programmer决定。
前面提到:只要是基本型态(包括boolean、byte、short、int、long、float、double、char)一律使用passbyvalue,其它型态一律passbyreference。到底什么是passbyvalue?什么又是passbyreference呢?打个比方,passbyvalue就是资料的「分身」传递过去,passbyreference就是资料的「本尊」传递过去。(注:自从发生那件新闻,有了「本尊」和「分身」的名词之后,我发现要向学生解释refere
nce的观念也就容易多了)。因为对象一律是passbyreference,所以一个对象常常同时被多个variable所指到。Java提供自动内存管理的机制,也就是俗称的garbagecollection(垃圾收集)。当一个对象不再被任何variable所指到,就代表此对象从此不可能再被利用,Java虚拟机器内一个负责收集垃圾的thread就会在适当的时机出来将此块内存回收。
记得在Java之父JamesGosling应邀到台湾时(1997年12月),我曾经问他:Java的这种自动内存管理方式造成某些程序(例如debugger)的困扰,Java有没有打算支持weakreference。JamesGosling回答:未来的版本将会支持weakreference,果然在后来的JDK1.2就提供此支持了。JDK1.2除了weakreference(也就是java.lang.ref.WeakReference)之外,还多了一个强化的weakreference(也就是java.lang.ref.SoftReference)以及一个弱化的weakreference(也就是java.lang.ref.PhantomReference),这个设计考虑得相当仔细。
这些reference依照「强度」排列如下:
DirectReference>SoftReference>WeakReference>PhantomReference其中,directreference就是一般的reference。只要被任何directreference所reference到的对象就不会被garbagecollector清除。其它的三种reference(包括softreference,weakreference,phantomreference)则不然,他们不会影响garbagecollection。
如果你对这些特殊的reference感兴趣,不妨去看看java.lang.ref的Javadoc,顺便写几个程序试试看。
因为好处多多,所以reference已经是现代化程序语言的重要必备功能了。什么!你说xx高级语言没支持reference,那你可以把它埋葬在二十世纪的历史灰烬中。Java对于资料的处理方式是:只要是基本型态(包括boolean,byte,short,int,long,float,double,char)一律使用passbyvalue,其它型态一律passbyreference。但是我发现这在未来有可能变动,因为Javalanguage将byvalue订为reservedword(非keyword)。当Java将byvalue变成keyword之时,非基本型态的值就可以passbyvalue了,但我相信,此时Java也必须开始支持copyconstructor
作为配套措施,毕竟使用deepcopy或shallowcopy(甚至deep和shallow兼而有之的copy)还是要让programmer决定。
前面提到:只要是基本型态(包括boolean、byte、short、int、long、float、double、char)一律使用passbyvalue,其它型态一律passbyreference。到底什么是passbyvalue?什么又是passbyreference呢?打个比方,passbyvalue就是资料的「分身」传递过去,passbyreference就是资料的「本尊」传递过去。(注:自从发生那件新闻,有了「本尊」和「分身」的名词之后,我发现要向学生解释refere
nce的观念也就容易多了)。因为对象一律是passbyreference,所以一个对象常常同时被多个variable所指到。Java提供自动内存管理的机制,也就是俗称的garbagecollection(垃圾收集)。当一个对象不再被任何variable所指到,就代表此对象从此不可能再被利用,Java虚拟机器内一个负责收集垃圾的thread就会在适当的时机出来将此块内存回收。
记得在Java之父JamesGosling应邀到台湾时(1997年12月),我曾经问他:Java的这种自动内存管理方式造成某些程序(例如debugger)的困扰,Java有没有打算支持weakreference。JamesGosling回答:未来的版本将会支持weakreference,果然在后来的JDK1.2就提供此支持了。JDK1.2除了weakreference(也就是java.lang.ref.WeakReference)之外,还多了一个强化的weakreference(也就是java.lang.ref.SoftReference)以及一个弱化的weakreference(也就是java.lang.ref.PhantomReference),这个设计考虑得相当仔细。
这些reference依照「强度」排列如下:
DirectReference>SoftReference>WeakReference>PhantomReference其中,directreference就是一般的reference。只要被任何directreference所reference到的对象就不会被garbagecollector清除。其它的三种reference(包括softreference,weakreference,phantomreference)则不然,他们不会影响garbagecollection。
如果你对这些特殊的reference感兴趣,不妨去看看java.lang.ref的Javadoc,顺便写几个程序试试看。
2152

被折叠的 条评论
为什么被折叠?



