一、
包:库单元。
a)
之所以要导入包,是为了提供一个管理名字空间的机制,所有类成员的名称都是彼此隔离的。
b)
每个java源代码文件对应一个编译单元,每个编译单元只能有一个public类,否则编译器就会报错。编译单元内部的其他类在包之外是无法看见这些类的,因为它们不是public类,主要是为public类提供支持的。
c)
Java的可运行程序是一组可以打包并压缩为一个Java文档文件(JAR)的.class文件。
d)
为了将一个类MyClass加入一个包/类库文件mypackage中,必须在该类所对应的编译单元中除注释外的第一行加入
package package_name;
Java命名规则中包全部使用小写字母。
使用该类时要加入
import mypackage.MyClass;
e)
当同时导入的两个包中含有两个相同的类,则在创建类对象时要加入包名来解决歧义。如:
java.util.Vector v = new java.util.Vector();
f)
import static:
e.g.
import static java.lang.System.out;
public class Type {
int i;
double d;
int get() {
return this.i;
}
public static void main(String[] args) {
Type t = new Type();
out.println(t.get());
}
}
该例中对System类中的out对象进行静态导入。
注意:要防止含糊不清的静态导入,如Integer和Long中都有MAX_VALUE常量。
g)
用import改变行为
C语言中有条件编译功能(如#IFNDEF, #DEFINE, #ENDIF等),可以不改变代码就能通过切换开关来产生不同的行为,有时主要用来解决跨平台问题。而java不存在跨平台问题,它的条件编译可以用import来实现,如两个包debug和debugoff,都有相同的类,并含有一个debug方法,通过import不同的包可以实现不同效果。
h)
无论何时创建包,都已经在指定包名称时隐含的确定了目录结构,该包要在该目录中且该目录在CLASSPATH中。
二、
访问权限修饰词。
a)
包访问权限:不提供任何访问权限修饰词时。包中所有其他类对该成员都有访问权限,但对于这个包之外的所有类,其成员都是private。
当处于相同目录的编译单元没有给自己设定任何包名称时,所有在该目录下的编译单元会被认为在一个默认包中。
b)
public接口访问权限:均可访问。
c)
private私有访问权限:即使同一个包中的其他类也是不可以访问的。
用处:
i.
多线程环境下进行访问控制;
ii.
控制对象的创建,将构造器部分/全部设置为private,只能通过所提供的其他接口进行对象创建;
iii.
将构造器设置为private可以阻止类的继承。
d)
protected继承访问权限:只有该类的派生类可以访问。
三、
接口和实现。
a)
封装:把数据和方法包装入类中,隐藏具体的实现。
b)
访问权限控制将权限的边界划在了数据类型的内部,原因:
i.
需要设定可以使用和不可使用的界限;
ii.
将接口和具体实现分离,内部代码改变但保证接口不变。
四、
类的访问权限。
类只有包访问权限和public两个访问权限。如果不希望其他人对类具有访问权限时,将构造器指定为private即可,此时只有类内部的静态static成员函数可以进行创建。有两种方法:
i.
class Soup1 {
private Soup1() {}
public static Soup1 makeSoup() {
return new Soup1();
}
}
可以用来记录创建了多少个soup1对象。
ii.
class Soup2 {
private Soup2() {}
private static Soup2 s2 = new Soup2();
public static Soup2 access() {
return s2;
}
}
该方法采用了设计模式,称为singelton单例,只有一个创建好的对象,且只能通过access()访问。