Thinking in java 第6章 访问权限控制 笔记+习题

深入解析Java中的访问控制概念,包括包、访问修饰符的作用范围,以及如何通过private、protected、public和包访问权限来限制类成员的可访问性。同时,通过实践练习,如创建具有不同访问级别的类实例,展示各种访问控制的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Thinking in java 第6章 访问权限控制

学习目录


6.1 包:库单元

1. 每个编译单元(java源文件)只能有一个public类,否则编译器就不会接受。

2. 在文件起始声明package xxx;就表示该编译单元是名为xxx的类库的一部分。

3. Java没有C的条件编译功能。C在绝大多数情况下用此来解决跨平台问题。而Java自身可以自动跨越不同平台,因此该功能对Java没必要。

 

6.2 Java访问权限修饰词

public包之间也可以随意访问
protected继承的子类可以访问;包内可以随意访问
包内可以随意访问
private

只有类内可以访问

 

6.4 类的访问权限

1. 如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象。但有一个例外,就是你在该类的static成员内部可以创建。

 


练习:

练习1:在某个包中创建一个类,在这个类所处的包的外部创建该类的一个实例。

package Chapter6;

import Chapter2.E2_1;

public class E1 {
    public static void main(String[] args) {
        E2_1 e = new E2_1();
    }
}

练习2:将本节的代码片段改写为完整的程序,并校验实际所发生的的冲突。

Chapter2和Chapter3中都有Dog类,会提示Multiple choices...不能编译。

package Chapter6;

import Chapter2.*;
import Chapter3.*;

public class E2 {
    public static void main(String[] args) {
        Dog dog = new Dog();
    }
}

练习3:创建两个包:debug和debugoff,它们都包含一个相同类,该类有一个debug()方法。第一个版本显示发送给控制台的String参数,而第二个版本什么也不做。用静态import语句将该类导入到一个测试程序中,并示范条件编译效果。

注释第二个则输出args的地址值,注释第一个则什么都不输出。

package Chapter6.debug;

public class Debug {
    public void debug(String[] s) {
        System.out.println(s);
    }
}
package Chapter6.OffDebug;

public class Debug {
    public void debug(String[] s) {
        System.out.println("");
    }
}

 

package Chapter6;

import Chapter6.debug.*;
//import Chapter6.OffDebug.*;

public class E3 {
    public static void main(String[] args) {
        Debug bug = new Debug();
        bug.debug(args);
    }
}

练习4:展示protected方法具有包访问权限,但不是public。

package Chapter6.debug;

public class Debug {
    public void debug(String[] s) {
        System.out.println(s);
    }

    protected void func() {
        System.out.println("you can visit this protected function!");
    }
}
package Chapter6.debug;

public class test {
    public static void main(String[] args) {
        Debug bug = new Debug();
        bug.func();
    }
}

/*
you can visit this protected function!
*/

练习5:创建一个带有public,private,protected和包访问权限域以及方法成员的类。创建该类的一个对象,看看在你试图调用所有类成员时,会得到什么类型的编译信息。请注意,处于同一个目录中的所有类都是默认包的一部分。

同上,private不能调用。略。

练习6:创建一个带有protected数据的类。运用在第一个类中处理protected数据的方法在相同文件中创建第二个类。

意义不明。翻译错误。略。

练习7:根据描述access和Widget的代码片段创建类库。在某个不属于access类库的类中创建一个Widget实例。

练习1换皮。略。

练习8:效仿示例Lunch.java的形式,创建一个名为ConnectionManager的类,该类管理一个元素为Connection对象的固定数组。客户端程序员不能直接创建Connection对象,而只能通过ConnectionManager中的某个static方法来获取它们。当ConectionManager之中不再有对象时,它会返回null引用。在main()中检测这些类。

package Chapter6;

public class ConnectionManager {
    private static int cnt = 3;
    private static Connection[] connection = new Connection[]{Connection.built(), Connection.built(), Connection.built()};

    public static Connection get() {
        if(ConnectionManager.cnt > 0) {
            return ConnectionManager.connection[--ConnectionManager.cnt];
        }
        else {
            System.out.println("NULL!");
            return null;
        }
    }

    public static void main(String[] args) {
        Connection connection1 = ConnectionManager.get();
        Connection connection2 = ConnectionManager.get();
        Connection connection3 = ConnectionManager.get();
        Connection connection4 = ConnectionManager.get();
    }
}

class Connection{
    private Connection() {
        System.out.println("Connection has benn built!");
    }

    public static Connection built() {
        return new Connection();
    }
}


/*
Connection has benn built!
Connection has benn built!
Connection has benn built!
NULL!
*/

练习9:在access/local目录下编写以下文件(假定access/local目录在你的CLATHPATH中)....然后在access/local之外的另一个目录中创建下列文件.... 解释一下为什么编译器会产生错误。如果将Foreign类置于access.local包之中的话,会有改变吗?

PackagedClass无修饰符,故只有包访问权限,在同一个包中才能正常使用。

写在前面的话 引言 1. 前提 2. Java的学习 3. 目标 4. 联机文档 5. 6. 练习 7. 多媒体 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段1:要制作什么? 1.12.4 阶段2:开始构建? 1.12.5 阶段3:正式创建 1.12.6 阶段4:校订 1.12.7 计划的回报 1.13 Java还是C++? 第2 一切都是对象 2.1 用句柄操纵对象 2.2 必须创建所有对象 2.2.1 保存在什么地方 2.2.2 特殊情况:主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 总结 2.11 练习 第3 控制程序流程 3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 字串运算符 3.1.12 运算符常规操作规则 3.1.13 造型运算符 3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符总结 3.2 执行控制 3.2.1 真和假 3.2.3 反复 3.2.6 中断和继续 3.2.7 切换 3.3 总结 3.4 练习 第4 初始化和清除 4.1 由构建器保证初始化 4.2 方法过载 4.2.1 区分过载方法 4.2.2 主类型的过载 4.2.3 返回值过载 4.2.4 默认构建器 4.2.5 this关键字 4.3 清除:收尾和垃圾收集 4.3.1 finalize()用途何在 4.3.2 必须执行清除 4.4 成员初始化 4.4.1 规定初始化 4.4.2 构建器初始化 4.5 数组初始化 4.5.1 多维数组 4.6 总结 4.7 练习 第5 隐藏实施过程 5.1 包:库单元 5.1.1 创建独一无二的包名 5.1.2 自定义工具库 5.1.3 利用导入改变行为 5.1.4 包的停用 5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 5.5 总结 5.6 练习 第6 类再生 6.1 合成的语法 6.2 继承的语法 6.2.1 初始化基础类 6.3 合成与继承的结合 6.3.1 确保正确的清除 6.3.2 名字的隐藏 6.4 到底选择合成还是继承 6.6 递增开发 6.7 上溯造型 6.7.1 何谓“上溯造型”? 6.8 final关键字 6.8.1 final数据 6.8.2 final方法 6.8.3 final类 6.8.4 final的注意事项 6.9 初始化和类装载 6.9.1 继承初始化 6.10 总结 6.11 练习 第7 多形性 7.1 上溯造型 7.1.1 为什么要上溯造型 7.2 深入理解 7.2.1 方法调用的绑定 7.2.2 产生正确的行为 7.2.3 扩展性 7.3 覆盖与过载 7.4 抽象类和
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值