为什么会有package

构造类库的概念以及对于谁有权取用该类库构件的控制问题都还是不完善的。其中仍存在着如何将构件捆绑到一个内聚的类库单元中的问题。
JAVA用关键字package加以控制。
访问权限修饰词会因类是存在于一个相同的包,还是存在于一个单独的包而受到影响。
提供一个管理名字空间的机制。所有类成员的名称都是彼此隔离的。


编译链接

c++: .cpp --编译--> .o --链接--> 可执行文件 JAVA:.java --编译--> .class --打包--> .jar 1.JAVA为什么不需要链接过程? 链接是为了确定在其它文件中的符号的地址。JAVA的内存是由JVM管理的,JVM一定会知道符号在哪里,所以不需要通过链接去记录符号的地址。
2.JAVA真的没有链接?
广义上说,在运行时通过JVM找到某个符号的地址并产生正确的调用,也算是链接。虽然JVM不需要通过


代码组织

JAVA可运行程序是一组可以打包并压缩为一个JAVA文档文件(JAR,使用java的JAR文档生成器)的.class文件。JAVA解释器负责这些文件的查找、装载和解释。

每个文件都有一个public类,以及任意数量的非public类。

如果使用package语句,它必须是文件中除注释以外的第一句程序代码。

一个包从未真正将被打包的东西包装成单一的文件。
将特定包的所有.class文件都置于一个目录下。利用操作系统的层次化的文件结构来解决混乱问题。


JAVA解释器的运行过程

1.找出环境变量CLASSPATH
CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。
2.从根目录开始,解释器获取包的名称,并将每个.替换成/,以从CLASSPATH根中产生一个路径名称。
例如package foo.bar.baz -> foo\bar\bazfoo/bar/baz
3.得到的路径会与CLASSPATH中的各个不同的项相连接
4.解释器就在这些目录中查找与你所要创建的类名称相关的.class文件。

使用JAR文件时,必须在类路径中将JAR文件的实际名称写清楚,而不仅是指明它所在位置的目录

CLASSPATH=.;D:\JAVA\LIB;C:\flavors\grape.jar

包冲突

impoart了两个package,这两个package中包含了同一个类,只要不写导致冲突的代码,就不会有问题。


用import改变行为

JAVA没有C的条件编译功能。
JAVA去掉此功能可能因为C在绝大多数情况下是用此功能来解决跨平台问题的。
条件编译的另一个常见用途是调试。
JAVA可以通过修改被导入的package的方法来实现调试。
同一功能两套代码,增加维护成本。


类成员访问权限

没有任何关键字的默认访问权限即包访问权限。

public成员 包访问权限的成员 protected成员 private成员
包外的类 V X X X
包内的其它类 V V X X
在包外的子类 V X V X
在包内的子类 V V V X

1.1. 一般将public成员置于开头,后面顺序依次是protected, 包访问权限、private。

默认包

A.java和B.java在同一目录下,B.java没有给自己设定包名,B.f()是默认访问权限,则:
A可以访问B.f()
因为B.java自动看作是隶属于该目录的默认包中。


类的访问权限

类的访问权限可以是public或者包访问权限。
一个文件至多一个(也可以没有)public类。

results matching ""

    No results matching ""