练习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.代码生产者,就可以知道哪些方法可以修改,换种方式实现,而不会影响代码消费者的编辑。