Thinking in Java 第四版完整版 第六章练习题 访问权限控制

本文通过具体示例演示了Java中不同访问修饰符的作用范围,包括public、private、protected及包访问权限,并展示了如何在不同包中引用类成员。

Thinking in Java 第四版完整版 第六章练习题,记录一下(jdk1.8.0)

1.

package com.test.c06;

/**
 * 练习1:在某个包中创建一个类,在这个类所处的包的外部创建该类的一个实例。
 * @author admin11
 * @date 2018年3月20日
 */
public class Exercise601 {

}
package com.test;

import com.test.c06.Exercise601;

public class Exercise601out {

    public static void main(String[] args) {
        new Exercise601();
    }
}

2.

package com.test.c06;

// import net.mindview.simple.*; 该包下也存在名字为Vector的类时,会产生冲突
import java.util.Vector;

/**
 * 练习2:将本节中的代码片段改写为完整的程序,并校验实际所发生的冲突。
 * @author admin11
 * @date 2018年3月20日
 */
public class Exercise602 {

    public static void main(String[] args) {
        // java.util.Vector v = new java.util.Vector();
        Vector v = new Vector();
        // 当该类的导入有多个时,会产生冲突,编译器不知道用的是哪个Vector类。
        // 建议:1.避免导入多个 2.指定全名的方式创建类
    }
}

3.

package com.test.c06;

// import com.test.c06.debugoff.Test;
// import com.test.c06.debug.Test;
/**
 * 练习3:创建两个包:debug和debugoff,它们都包含一个相同的类,
 * 该类有一个debug()方法。第一个版本显示发送给控制台的String参数,
 * 而第二个版本什么也不做。使用静态import语句将该类导入一个测试程序中,
 * 并示范条件编译效果。
 * @author admin11
 * @date 2018年3月20日
 */
public class Exercise603 {

    public static void main(String[] args) {
        com.test.c06.debugoff.Test.debug("debugoff"); // Test.debug("debugoff");
        com.test.c06.debug.Test.debug("debug"); // Test.debug("debug");
    }
}
package com.test.c06.debug;

public class Test {

    public static void debug(String msg) {
        System.out.println("Message: " + msg);
    }
}
package com.test.c06.debugoff;

public class Test {

    public static void debug(String msg) {}
}

这里写图片描述

4.

package com.test.c06.local;

/**
 * 练习4:展示protected方法具有包访问权限,但不是public。
 * @author admin11
 * @date 2018年3月20日
 */
public class Exercise604 {

    protected static void greeting() {
        System.out.println("Hello everyone!");
    }
}
package com.test.c06.local;

public class Exercise604in {

    public static void main(String[] args) {
        Exercise604.greeting();
    }
}
package com.test.c06;

public class Exercise604out {

    public static void main(String[] args) {
        //com.test.c06.local.Exercise604.greeting();
        // The method greeting() from the type Exercise604 is not visible
    }
}

这里写图片描述

5.

package com.test.c06;

/**
 * 练习5:创建一个带有public,private,protected和包访问
 * 权限域以及方法成员的类。创建该类的一个对象,看看在你试图调用所有类
 * 成员时,会得到什么类型的编译消息。请注意,处于同一目录中的所有类都是
 * 默认包的一部分。
 * @author admin11
 * @date 2018年3月20日
 */
public class Exercise605main {

    public int a;
    private int b;
    protected int c;
    int d;
    public void f1() {}
    private void f2() {}
    protected void f3() {}
    void f4() {}

    public static void main(String[] args) {
        Exercise605main e = new Exercise605main();
        e.a = 1;
        e.b = 2;
        e.c = 4;
        e.d = 5;
        e.f1();
        e.f2();
        e.f3();
        e.f4();
    }
}
package com.test.c06;

public class Exercise605test {

    public static void main(String[] args) {
        Exercise605main e = new Exercise605main();
        e.a = 1;
        //e.b = 2; 
        // The field Exercise605main.b is not visible
        e.c = 4;
        e.d = 5;
        e.f1();
        //e.f2(); 
        // The method f2() from the type Exercise605main is not visible
        e.f3();
        e.f4();
    }
}
package com.test;

import com.test.c06.Exercise605main;

public class Exercise605out {

    public static void main(String[] args) {
        Exercise605main e = new Exercise605main();
        e.a = 1;
        //e.b = 2;
        // The field Exercise605main.b is not visible
        //e.c = 4;
        // The field Exercise605main.c is not visible
        //e.d = 5;
        // The field Exercise605main.d is not visible
        e.f1();
        //e.f2();
        // The method f2() from the type Exercise605main is not visible
        //e.f3();
        // The method f3() from the type Exercise605main is not visible
        //e.f4();
        // The method f4() from the type Exercise605main is not visible
    }
}

6.

package com.test.c06;

/**
 * 练习6:创建一个带有protected数据的类。运用在
 * 第一个类中处理protected数据的方法在相同的文件
 * 中创建第二个类。
 * @author admin11
 * @date 2018年3月20日
 */

class WithProtected {
    protected int i;
}

public class Exercise606 {

    public static void main(String[] args) {
        WithProtected wp = new WithProtected();
        wp.i = 47;
        System.out.println(wp.i);
    }
}

这里写图片描述

7.

package com.test.c06;

import com.test.c06.access.Widget;

/**
 * 练习7:根据描述access和Widget的代码片段创建类库。在某个
 * 不属于access类库的类中创建一个Widget实例。
 * @author admin11
 * @date 2018年3月20日
 */
public class Exercise607 {

    public static void main(String[] args) {
        new Widget();
    }
}
package com.test.c06.access;

public class Widget {

    public Widget() {
        System.out.println("Making a Widget");
    }
}

这里写图片描述

8.

package com.test.c06;

import com.test.c06.access.connection.Connection;
import com.test.c06.access.connection.ConnectionManager;

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

    public static void main(String[] args) {
        Connection c = ConnectionManager.getConnection();
        while(c != null) {
            System.out.println(c);
            c.doSomething();
            c = ConnectionManager.getConnection();
        }
    }
}
package com.test.c06.access.connection;

public class Connection {

    private static int counter = 0;
    private int id = counter++;
    Connection() {} // 包访问权限

    public String toString() {
        return "Connection " + id;
    }

    public void doSomething() {}
}
package com.test.c06.access.connection;

public class ConnectionManager {

    private static Connection[] pool = new Connection[10];
    private static int counter = 0;
    static {
        for (int i = 0; i < pool.length; i++) {
            pool[i] = new Connection();
        }
    }

    public static Connection getConnection() {
        if(counter < pool.length) {
            return pool[counter++];
        }
        return null;
    }
}

这里写图片描述

9.

package com.test.c06.access.foreign;

/**
 * 练习9:在access/local目录下编译一下文件
 * (假定access/local目录在你的CLASSPATH中):
 * // access/local/PackagedClass.java
 * package access.local;
 * class PackagedClass {
 *      public PackagedClass() {
 *          System.out.println("Craeting s packaged class");
 *      }
 * }
 * 然后在access/local之外的另一个目录中创建下列文件:
 * // access/foreign/foreign.java
 * package access.foreign;
 * public class foreign {
 *    public static void main(String[] args) {
 *      PackagedClass pc = new PackagedClass();
 *    }
 * 
 * }
 * 解释一下为什么编译器会产生错误。如果将foreign类置于access.local
 * 包之中的话,会有所改变吗?
 * @author admin11
 * @date 2018年3月21日
 */
public class foreign {

    public static void main(String[] args) {
        // PackagedClass cannot be resolved to a type
        //PackagedClass pc = new PackagedClass();
        // 编译器会产生错误原因:PackagedClass具有包访问权限,在该包外的其它类中则无法访问;
        // 如果该类用public修饰,则在其它包的其它类中可以访问。
        // 如果将foreign类置于access.local包之中的话,则可以访问PackagedClass,
        // 不会报错,因为在同一个包下。
    }
}
package com.test.c06.access.local;

class PackagedClass {

    public PackagedClass() {
        System.out.println("Craeting s packaged class");
    }
}
package com.test.c06.access.local;

public class foreign {

    public static void main(String[] args) {
        // PackagedClass cannot be resolved to a type
        PackagedClass pc = new 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、付费专栏及课程。

余额充值