[JAVA]学习笔记(三)——访问权限控制

时间:2022-02-20 15:19:44
一、 包:库单元。
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) {
<span style="white-space:pre"></span>Type t = new Type();
<span style="white-space:pre"></span>out.println(t.get());
<span style="white-space:pre"></span>}
}


该例中对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()访问。