练习7:根据描述access和Widget的代码片段创建类库。在某个不属于access类库的类中创建一个Widget实例
package com.access;
class Widget {
public void say(){
System.out.println("haha");
}
}
package com.jicheng;
public class Test extends JiChengTest{
public static void main(String[] args) {
// Widget w = new Widget();
// w.say();
}
}
这大概就是作者想要表达的思想:3.类中可以不带有public类,这情况很少,当想隔离外部使用,则可以把public关键字去掉,外部包的类,就无法访问该类了。方便想删除就删除。
练习8:效仿实例Lunch.java的形式,创建一个名为ConnectionManager的类,该类管理一个元素为Connection对象的固定数组。客户端程序员不能直接创建Connection对象,而只能通过ConnectionManager中的某个static方法来获取他们。当ConnectionManager之中不再有对象时,它会返回null引用。在main()之中检测这些类。
package com.fangwenquanxian;
public class Connection {
private static Connection connection = new Connection();
private Connection(){};
public static Connection makeConnection(){
return connection;
}
}
package com.fangwenquanxian;
import java.util.Arrays;
public class ConnectionManager {
public static Connection[] cons = new Connection[5]; //声明了一个Connection类型,数量为5的数组,
static{ //静态加载,先装子弹的角色,先创建5个对象
System.out.println("--------初始化Connection对象--------");
for (int i = 0; i < 5; i++) {
cons[i] = Connection.makeConnection();
}
}
public static Connection getConnection(){
int l = cons.length;
if(l>0){
Connection con = cons[--l]; // 数量先减后运算 l = 4
cons = Arrays.copyOf(cons, l);
return con;
}else{
return null;
}
}
public static void main(String[] args) {
try {
for (int i = 0; i < 7; i++) {
Connection con = ConnectionManager.getConnection();
System.out.println(i+"、"+con);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
--------初始化Connection对象--------
0、com.fangwenquanxian.Connection@1db9742
1、com.fangwenquanxian.Connection@1db9742
2、com.fangwenquanxian.Connection@1db9742
3、com.fangwenquanxian.Connection@1db9742
4、com.fangwenquanxian.Connection@1db9742
5、null
6、null
编译不能通过,因为PackagedClass类的访问权限是默认的,不同包,不能访问。
总结:控制访问权限有两个原因。
1.代码消费者,只暴露允许接触的代码,隐藏不允许接触的代码,做到了安全隔离。
2.代码生产者,就可以知道哪些方法可以修改,换种方式实现,而不会影响代码消费者的编辑。