[6]访问控制权限 0X01(隐藏具体实现)
前言
参考《java编程思想》一书,发现好的程序并不是一成不变的,可能是在多次的反复修改后才会变的完美,因此就会存在一些问题:比如通常会有一些消费者(负责其他模块的程序员)需要你的代码在某些方面保持不变,而你却可能需要修改,这时,合理的使用访问修饰符可以有效解决这一问题。
java访问修饰符(权限从大到小)
- public
- protected
- 包访问权限(没有关键字)
- private
包:库单元
然而要较好的理解访问修饰符,就先得了解java的package机制:
java用关键字package加以控制如何将构件捆绑到一个内聚的类库单元中。
包内含有一组类,它们在单一的名字空间之下被组织在了一起。
- 比如使用java标准库的工具库,可以使用下面三种方式:
1.使用类的全名
public class Test1{
java.util.ArrayList list=new java.util.ArrayList();
}
2.使用import导入需要使用的类
import java.util.ArrayList;
public class Test1{
ArrayList list=new ArrayList();
}
3.import包中所有类
import java.util.*;
- 避免冲突
可能的冲突:如果两个包中含有同名的类,并且像下面这样同时导入类,编译器就会提示错误:
import me.funnyzhao.simple.*;
import java.util.* ;
...
Vector v=new Vector();//<--程序会报错
因此,最好使用单独导入的方式。
静态导入
在之前,一直都是自动import类,然后实例化类 || 使用类名.静态方法;现在java编程思想中看到一种静态导类的方式,节省了部分代码,如下:package me.funnyzhao.util; import java.io.PrintStream; public class Print { public static void print(Object obj){ System.out.println(obj); } public static void print(){ System.out.println(); } public static void printbb(Object obj){ System.out.print(obj); } public static PrintStream printff(String format, Object... args){ return System.out.printf(format, args); } }
使用:
package me.funnyzhao.main; import static me.funnyzhao.util.Print.*; public class TestDo { public static void main(String[] args) { print("Hello"); printff("ff", 3); } }
用import改变行为
这也是书上提到的一个包的应用:一般在产品上线之前,可能程序中会存在大量调式代码,当正式发布时,可以通过修改被导入的package的方法来实现上线产品禁用调式代码。例:
//有两个包,一个是未上线前,一个是正式上线,它们都拥有一个相同的打印log的类 package me.funnyzhao.util.debug; ... package me.funnyzhao.util.reslese; ...