Java - Thinking in Java 第5章 习题

###1

//: Main.java

/**
 * String初始化
 */

class Test {
    String s;
}

class Main {
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println("s = " + t.s);
    }
}
/**
 * Output:
 s = null
 *///:~

###2
初始化效果相同, 成员变量定义初始化定义时确定, 构造初始化构造时确定.

//: Main.java

/**
 * 初始化
 */

class Test {
    String s1;
    String s2 = "haha";
    String s3;
    Test () {
        s3 = "hehe";
    }
}

class Main {
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println("s1 = " + t.s1);
        System.out.println("s2 = " + t.s2);
        System.out.println("s3 = " + t.s3);    }
}
/**
 * Output:
 s1 = null
 s2 = haha
 s3 = hehe
 *///:~

###3

//: Main.java

/**
 * 默认构造器
 */

class Test {
    Test () {
        System.out.println("This is Test");
    }
}

class Main {
    public static void main(String[] args) {
        Test t = new Test();
    }
}
/**
 * Output:
 This is Test
 *///:~

###4

//: Main.java

/**
 * 默认构造器
 */

class Test {
    Test () {
        System.out.println("This is Test");
    }
    Test (String s) {
        System.out.println("Test : " + s);
    }
}

class Main {
    public static void main(String[] args) {
        Test t = new Test("Hello");
    }
}
/**
 * Output:
 Test : Hello
 *///:~

###5

//: Main.java

/**
 * 构造器重载
 */

class Dog {
    Dog() {
        System.out.println("Wang! Wang! Wang!");
    }

    Dog(String s) {
        System.out.println("Barking!");
    }

    Dog(int i) {
        System.out.println("Howling!");
    }
}

class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Dog d2 = new Dog("Hello");
        Dog d3 = new Dog(1);
    }
}
/**
 * Output:
 Wang! Wang! Wang!
 Barking!
 Howling!
 *///:~

###6

//: Main.java

/**
 * 构造器重载-参数顺序不同
 */

class Dog {
    Dog() {
        System.out.println("Wang! Wang! Wang!");
    }

    Dog(String s, int i) {
        System.out.println("Barking!");
    }

    Dog(int i, String s) {
        System.out.println("Howling!");
    }
}

class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Dog d2 = new Dog("Hello", 1);
        Dog d3 = new Dog(1, "Hello");
    }
}
/**
 * Output:
 Wang! Wang! Wang!
 Barking!
 Howling!
 *///:~

###7

//: Main.java

/**
 * 默认构造器
 */

class Test {
    String s = "Hello World";
}

class Main {
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.s);
    }
}
/**
 * Output:
 Hello World
 *///:~

###8

//: Main.java

/**
 * 默认构造器
 */

class Test {
    private void method1() {
        System.out.println("This is method 1.");
    }
    public void method2() {
        method1();
        this.method1();
    }
 }

class Main {
    public static void main(String[] args) {
        Test t = new Test();
        t.method2();
    }
}
/**
 * Output:
 This is method 1.
 This is method 1.
 *///:~

###9

//: Main.java

/**
 * 默认构造器
 */

class Test {
    Test (int t) {
        System.out.println("This is " + t);
    }
    Test (String s, int t) {
        this(t);
        System.out.println("This is " + s);
    }
 }

class Main {
    public static void main(String[] args) {
        Test t = new Test("Hello", 42);
    }
}
/**
 * Output:
 This is 42
 This is Hello
 *///:~

###10&11
finalize()被调用的条件, (1)类未被调用(置null), (2)调用System.gc().
注意: Java1.6以下可以, 1.8不可以.

//: Main.java

/**
 * 垃圾回收
 * 注意: Java环境1.6可以, 1.8不可以, 垃圾回收机制改变.
 */

class Test {
    @Override
    protected void finalize(){
        System.out.println("finalize");
//        super.finalize();
    }
}

class Main {
    public static void main(String[] args) {
        Test t = new Test();
        t = null; // 确保finalize()会被调用
        System.gc();
    }
}
/**
 * Output:
 finalize
 *///:~

###12
清理对象时, 会调用finalize()函数, 并且会保留存储数据, 如T2;
在清理对象时, 会入栈出栈, 先入后清理, 后入先清理.

//: Main.java

/**
 * 垃圾回收
 * 注意: Java环境1.6可以, 1.8不可以, 垃圾回收机制改变.
 */

class Tank {
    boolean isFull = false;
    String name;
    Tank(String name) {
        this.name = name;
    }
    void setEmpty() {
        isFull = false;
    }
    void setFull() {
        isFull = true;
    }

    @Override
    protected void finalize(){
        if (!isFull) {
            System.out.println(name + ": 清理");
        }
//        super.finalize();
    }
}

class Main {
    public static void main(String[] args) {
        Tank t1 = new Tank("T1");
        Tank t2 = new Tank("T2");
        Tank t3 = new Tank("T3");
        t1.setFull();
        t2.setEmpty();
        t1 = null;
        t2 = null;
        t3 = null;
        System.gc();
    }
}
/**
 * Output:
 T3: 清理
 T2: 清理
 *///:~

###13

//: ExplicitStatic.java
/**
 * 显示静态初始化
 * 静态初始化在首次调用类时执行
 *
 * Created by C.L.Wang on 15/7/27.
 */

class Cup {
    Cup(int marker) {
        System.out.println("Cup(" + marker + ")");
    }
    void f(int marker) {
        System.out.print("f(" + marker + ")");
    }
}

class Cups {
    static Cup cup1;
    static Cup cup2;
    static {
        cup1 = new Cup(1);
        cup2 = new Cup(2);
    }
    Cups() {
        System.out.println("Cups()");
    }
}

public class ExplicitStatic {
    public static void main(String[] args) {
        System.out.println("Inside main()");
        Cups.cup1.f(99);
    }
}
/**
 * Output:
 Inside main()
 Cup(1)
 Cup(2)
 f(99)
 *
 *///:~

###14

//: StaticInitialization.java
/**
 * 定义初始化和静态块初始化
 *
 * Created by C.L.Wang on 15/7/27.
 */
class Something {
    String str;
    Something(String str) {
        this.str = str;
        System.out.println("Something is " + str);
    }

    @Override
    public String toString() {
        return str;
    }
}

class Girl {
    static Something name = new Something("Caroline");
    static Something favor;
    static {
        favor = new Something("Dolls");
    }
    @Override
    public String toString() {
        return name + " loves " + favor + ".";
    }
}

public class StaticInitialization {
    public static void main(String[] args) {
        Girl girl = new Girl();
        System.out.println(girl);
    }
}

###15

//: StaticInitialization.java
/**
 * 非静态示例初始化, 为了支持匿名内部类.
 *
 * Created by C.L.Wang on 15/7/27.
 */
class Something {
    String str;
    Something(String str) {
        this.str = str;
        System.out.println("Something is " + str);
    }

    @Override
    public String toString() {
        return str;
    }
}

class Girl {
    Something name;
    Something favor;
    {
        name = new Something("Caroline");
        favor = new Something("Dolls");
    }
    @Override
    public String toString() {
        return name + " loves " + favor + ".";
    }
}

public class StaticInitialization {
    public static void main(String[] args) {
        Girl girl = new Girl();
        System.out.println(girl);
    }
}
/**
 * Output:
 Something is Caroline
 Something is Dolls
 Caroline loves Dolls.
 *///:~

###16

//: StringArray.java
import java.util.Arrays;

/**
 * String 数组
 * 
 * Created by C.L.Wang on 15/7/27.
 */
public class StringArray {
    public static void main(String[] args) {
        int num = 5;
        String[] sa = new String[num];
        for (int i=0; i<num; ++i) {
            sa[i] = "Girl[" + i + "]";
        }
        System.out.println(Arrays.toString(sa));
    }
}
/**
 * Output:
 [Girl[0], Girl[1], Girl[2], Girl[3], Girl[4]]
 */

###17&18

//: StringArray.java
import java.util.Arrays;

/**
 * String类型数组初始化
 *
 * Created by C.L.Wang on 15/7/27.
 */
class StringExample {
    String str;
    StringExample(String str) {
        this.str = str;
        System.out.println("para = " + str);
    }

    @Override
    public String toString() {
        return str;
    }
}

public class StringArray {
    public static void main(String[] args) {
        int num = 5;
        StringExample[] sea = new StringExample[5];
        System.out.println(Arrays.toString(sea));
        for (int i=0; i<num; ++i) {
            sea[i] = new StringExample("Girl[" + i + "]");
        }
        System.out.println(Arrays.toString(sea));
    }
}
/**
 * Output:
 [null, null, null, null, null]
 para = Girl[0]
 para = Girl[1]
 para = Girl[2]
 para = Girl[3]
 para = Girl[4]
 [Girl[0], Girl[1], Girl[2], Girl[3], Girl[4]]
 */

###19

//: VariableArguments.java

/**
 * 可变参数
 * <p/>
 * Created by Wang on 15/7/30.
 */
public class VariableArguments {
    public VariableArguments(String... strs) {
        for (String s : strs) {
            System.out.print(s + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        new VariableArguments("Hello", "World", "Kitty");
        new VariableArguments(new String[]{"Haha", "Hehe", "Heihei"});
    }
}
/**
 * Output:
 Hello World Kitty
 Haha Hehe Heihei
 */

###20

//: OtherMain.java

/**
 * 测试main的可变参数形式
 * Created by wang on 15/7/30.
 */
public class OtherMain {
    public static void main(String... args) {
        for (String s : args) {
            System.out.print(s + " ");
        }
        System.out.println();
    }
}
/**
 * Output:
 * haha ahah haah ahha
 *///:~

###21&22

//: TestEnum.java

/**
 * 练习使用Enum, values(), ordinal(), switch
 * Created by wang on 15/7/30.
 */
public class TestEnum {
    private enum Money {
        HUNDRED, FIFTY, TWENTY, TEN, FIVE, TWO, ONE
    }

    public static void main(String[] args) {
        for (Money m : Money.values()) {
            System.out.print(m + ":" + m.ordinal() + " ");
            switch (m) {
                case HUNDRED:
                    System.out.println("$" + 100);
                    break;
                case FIFTY:
                    System.out.println("$" + 50);
                    break;
                case TWENTY:
                    System.out.println("$" + 20);
                    break;
                case TEN:
                    System.out.println("$" + 10);
                    break;
                case FIVE:
                    System.out.println("$" + 5);
                    break;
                case TWO:
                    System.out.println("$" + 2);
                    break;
                case ONE:
                    System.out.println("$" + 1);
                    break;
                default:
                    break;
            }
        }
        System.out.println();
    }
}
/**
 * Output:
 HUNDRED:0 $100
 FIFTY:1 $50
 TWENTY:2 $20
 TEN:3 $10
 FIVE:4 $5
 TWO:5 $2
 ONE:6 $1
 *///:~

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
写在前面的话 引言 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
发出的红包

打赏作者

SpikeKing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值