您的位置:首页 > 编程语言 > Java开发

JAVA自学笔记(二):类生存周期及访问权限

2009-07-26 23:25 274 查看
这个部分的笔记对应Thinking in JAVA 3rd的第四章和第五章(P140-P202)。这部分的主要内容是类的创建和销毁过程及数据访问权限

一、对象的创建

在第一部分的笔记当中提到过JAVA当中的类对象只能通过new在堆上创建。这部分关心的主要议题是,创建时刻各种类数据成员(JAVA当中应该称之为域)的初始化过程。

JAVA有别于C++的一个重要方面是在类成员初始话上,我们可以看到C++的类成员初始化被放在构造函数的一个所谓初始化列表当中进行,但是在JAVA当中则不存在这样的列表,相反他采用一种一般CPP新手程序员经常想用但是每次都被丢ERROR的方法:即在写成员声明的时候直接初始化,大致的写法如下:

public class myobj

{

public int a_ = 0;

}

另外,由于JAVA对安全性的考量,即使在这里不进行初始化所有的成员都会被默认初始化为0或者等价值而不会像CPP一样初始化为随机值。

JAVA跟CPP一样有构造函数用来初始化,并且JAVA的构造函数当中允许用this来调用自己的另外一个重载构造函数,但是这里有一个限制,即this的调用必须被放在构造函数体的第一行,并且只允许调用一个。 JAVA支持这样的两种初始化的方式,那么初始化的顺序应该是什么?跟CPP规则类似,JAVA也是先是成员声明时的初始化(程序员没有明确写就用0来初始化各个成员)然后调用构造函数。于是这里出现了一个问题,如果类的某个成员的初始值必须通过构造函数参数表当中某个参数来确定,因此程序员不可能在该成员声明的时候写一个初始值,但是JAVA还是会按照规则给这个成员用0(或者等价值如null跟false)来初始化,然后在构造函数当中再赋值一遍,于是出现了一次无效的初始化动作,是的,这的确是个问题,但是JAVA认为给所有成员一个0值比一个内存随机值要安全,这样的效率损失是合适的。

二、对象的销毁

JAVA不同于CPP的另一个重要方面是JAVA拥有一个称之为垃圾回收的机制,这种机制使得不需要程序员显示地调用delete来销毁一个在堆上创建的对象(JAVA对象都创建在堆上)。但是问题又来了,CPP程序员习惯在一个称之为析构函数的地方来释放一些类对象在运行过程中动态获取的资源,JAVA怎么办?JAVA也有类似的东西,但是略有不同。

JAVA有个称之为finalize的成员函数,这个成员函数能在对象被垃圾回收时由垃圾回收器在回收前调用。但是正是因为这种由垃圾回收器调用的机制产生了与CPP的些许不同。因为垃圾回收器有自身的算法,所以一些对象并不保证在不用后立即被调用finalize并销毁,基于性能的考虑,垃圾回收器可能在内存数量足够的情况下不销毁这些对象。因此如果对象当中使用了系统的独占资源(比如COM口),那么就不能依赖于finalize函数来释放这个资源。那么如何解决呢,其实也很简单,就是再写一个释放这些关键资源的成员函数,然后由类的使用者在确认使用完毕后调用它。

三、包--JAVA的名字空间

CPP当中为了防止名字的冲突于是引入了一个名字空间的概念。JAVA也有这样的概念,但是称之为包。使用方法很简单,在需要并入包的源码文件的除注释外的第一行写入packet 包名即可。不同于CPP的namespace,因为JAVA是一种解释型语言,因此包名本身包含了源文件的路径,JAVA的包名例如com.csdn表示的是一个com/csdn/的路径。所以,这个包当中的所有源码文件必须在这个路径当中。可以看到的是这样的路径是一个相对路径,那么这个相对路径对应的绝对路径应该是怎么样的呢?查看操作系统的CLASSPATH环境变量,里面的所有参数按与这个相对路径加起来得到一组绝对路径,解释器在这组路径当中进行查找,知道找到源码文件进行解释,否则报错。

当然,源码文件可以不包括packet 包名这一行,那么这个源码文件将被放入一个匿名的默认包中。另外需要注意的是一个源码文件当中只能包含一个或零个public类(public类的概念在后面介绍)。

四、访问权限

CPP程序员对这部分应该是比较熟悉的,但是新增的概念有两个,一个是包访问权限另一个是类访问权限。 在CPP当中我们做的只有一个即成员访问权限(包括数据和方法),权限用public/protected/private来表示,这个部分JAVA跟CPP完全一样,唯一的区别是JAVA需要在每个成员前明确的写上访问权限(再说一次JAVA没有头文件这东西,并且再抱怨一次,这真的很乱!)。JAVA新增了一种访问权限,叫做包访问权限,所谓包访问权限就是这个类成员允许包内其他的类访问,但是对于包外的类这个成员就像是private成员一样。包访问权限的写法很简单,就是在成员前的访问权限修饰符部分留空什么都不写即可。顺便提一句,protected成员其实也具有包访问权。那么写protected与不写有什么区别呢?很简单如果写,那么包外的继承类也能访问这个成员,否则包外的继承类就不能访问这个成员了(继承一个类的时候并不限制继承类和积累必须在同一个包内)。

JAVA新增的另外一个东西是类访问权限。类访问权限与成员权限类似,但他之分两种:public和包内权限,public权限的类允许包内包外访问,包内权限则只能包内访问。写法很简单

public class myclass{} //public权限

class myclass{} //包内权限

再强调一句,JAVA的每个源码文件当中只允许有0或者1个public类!

这个部分就是这些~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: