Java - Thinking in Java 第7章 习题

1

/**
 * 惰性初始化
 * <p/>
 * Created by wang on 15/8/6.
 */
class Init {
    public Init() {
        System.out.println("Init init");
    }
}

public class LazyInit {
    Init init;

    @Override
    public String toString() {
        System.out.println("Print");
        init = new Init();
        return super.toString();
    }

    public static void main(String[] arg) {
        System.out.println(new LazyInit());
    }
}
/**
 * Output:
 Print
 Init init
 [email protected]
 */

2

/**
 * 继承
 * <p/>
 * Created by wang on 15/8/7.
 */

class Cleaner {
    private String s = "Cleaner";

    public static void main(String[] args) {
        Cleaner x = new Cleaner();
        x.dilute().apply().scrub();
        System.out.println(x);
    }

    public void append(String a) {
        s += a;
    }

    public Cleaner dilute() {
        append(" dilute");
        return this;
    }

    public Cleaner apply() {
        append(" apply");
        return this;
    }

    public Cleaner scrub() {
        append(" scrub");
        return this;
    }

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

class Detergent extends Cleaner {
    public static void main(String[] args) {
        Detergent d = new Detergent();
        ((Detergent) d.dilute().apply()).scrub().foam();
        System.out.println(d);
    }

    @Override
    public Detergent scrub() {
        append(" Detergent: scrub()");
        super.scrub();
        return this;
    }

    public Detergent foam() {
        append(" foam");
        return this;
    }
}

public class Disinfectant extends Detergent {
    public static void main(String[] args) {
        Disinfectant d = new Disinfectant();
        ((Disinfectant) d.dilute().apply()).scrub().sterilize();
        System.out.println(d);
        Detergent.main(args);
        Cleaner.main(args);
    }

    @Override
    public Disinfectant scrub() {
        append(" Disinfectant: scrub()");
        super.scrub();
        return this;
    }

    public Disinfectant sterilize() {
        append(" sterilize");
        return this;
    }
}
/**
 * Output:
 Cleaner dilute apply Disinfectant: scrub() Detergent: scrub() scrub sterilize
 Cleaner dilute apply Detergent: scrub() scrub foam
 Cleaner dilute apply scrub
 */

3

/**
 * 默认构造器
 * <p/>
 * Created by wang on 15/8/7.
 */
class Art {
    public void show() {
        System.out.println("show");
    }
}

class Drawing extends Art {
    public void draw() {
        System.out.println("draw");
    }
}

public class Cartoon extends Drawing {
    public void play() {
        System.out.println("play");
    }

    public static void main(String[] args) {
        Cartoon c = new Cartoon();
        c.show();
        c.draw();
        c.play();
    }
}

4

/**
 * 基类构造器
 * <p/>
 * Created by wang on 15/8/7.
 */
class Art {
    public Art(String author) {
        System.out.println("Art:" + author);
    }
}

class Drawing extends Art {
    public Drawing(String author) {
        super(author);
        System.out.println("Drawing:" + author);
    }
}

public class Cartoon extends Drawing {
    public Cartoon(String author) {
        super(author);
        System.out.println("Cartoon:" + author);
    }

    public static void main(String[] args) {
        new Cartoon("Caroline");
    }
}
/**
 * Output:
 Art:Caroline
 Drawing:Caroline
 Cartoon:Caroline
 */

5

/**
 * 构造函数先于其他函数调用.
 * <p/>
 * Created by wang on 15/8/7.
 */
class A {
    public A() {
        System.out.println("A");
    }
}

class B {
    public B() {
        System.out.println("B");
    }
}

class C extends A {
    private B mB = new B();
}

public class Cross {
    public static void main(String[] args) {
        C c = new C();
    }
}
/**
 * Output:
 A
 B
 */

6

报错: 对super的调用必须是构造函数中的第一个语句.

/**
 * 带参数的构造器
 * <p/>
 * Created by wang on 15/8/8.
 */
class Game {
    Game(int i) {
        System.out.println("Game Constructor:" + i);
    }
}

class BoardGame extends Game {
    BoardGame(int i) {
        super(i);
        System.out.println("BoardGame Constructor:" + i);
    }
}

public class Chess extends BoardGame {
    public Chess() {
        super(11);
        System.out.println("Chess Constructor");
//        super(11); // 报错
    }

    public static void main(String[] args) {
        new Chess();
    }
}
/**
 * 报错: 对super的调用必须是构造函数中的第一个语句
 */

7

/**
 * 继承带参数的构造器
 * <p/>
 * Created by wang on 15/8/7.
 */
class A {
    public A(String s) {
        System.out.println("A:" + s);
    }
}

class B {
    public B(String s) {
        System.out.println("B:" + s);
    }
}

class C extends A {
    public C(String s) {
        super(s);
    }

    private B mB = new B("Caroline");
}

public class Cross {
    public static void main(String[] args) {
        new C("Wendy");
    }
}
/**
 * Output:
 A:Wendy
 B:Caroline
 */

8

/**
 * 构造器
 * Created by wang on 15/8/8.
 */
class Haha {
    public Haha(String s) {
        System.out.println(s + ": Haha");
    }
}

public class DConstructor extends Haha {
    public DConstructor() {
        this("Caroline");
    }

    public DConstructor(String s) {
        super(s);
    }

    public static void main(String[] args) {
        new DConstructor();
    }
}
/**
 * Output:
 * Caroline: Haha
 */

9

/**
 * 派生类自动创建基类的成员变量
 * <p/>
 * Created by wang on 15/8/8.
 */
class Component1 {
    public Component1() {
        System.out.println("Component1");
    }
}

class Component2 {
    public Component2() {
        System.out.println("Component2");
    }
}

class Component3 {
    public Component3() {
        System.out.println("Component3");
    }
}

class Root {
    Component1 c1 = new Component1();
    Component2 c2 = new Component2();
    Component3 c3 = new Component3();
}

public class Stem extends Root {
    public static void main(String[] args) {
        new Stem();
    }
}

10

/**
 * 派生类自动创建基类的成员变量
 * <p/>
 * Created by wang on 15/8/8.
 */
class Component1 {
    public Component1(String s) {
        System.out.println("Component1:" + s);
    }
}

class Component2 {
    public Component2(String s) {
        System.out.println("Component2:" + s);
    }
}

class Component3 {
    public Component3(String s) {
        System.out.println("Component3:" + s);
    }
}

class Root {
    Component1 c1 ;
    Component2 c2 ;
    Component3 c3 ;

    public Root(String s1, String s2, String s3) {
        c1 = new Component1(s1);
        c2 = new Component2(s2);
        c3 = new Component3(s3);
    }

}

public class Stem extends Root {
    public Stem(String s1, String s2, String s3) {
        super(s1, s2, s3);
    }

    public static void main(String[] args) {
        new Stem("Hello", "Caroline", "Wendy");
    }
}
/**
 * Output:
 Component1:Hello
 Component2:Caroline
 Component3:Wendy
 */

11

/**
 * 继承
 * <p/>
 * Created by wang on 15/8/7.
 */

class Cleaner {
    private String s = "Cleaner";

    public static void main(String[] args) {
        Cleaner x = new Cleaner();
        x.dilute().apply().scrub();
        System.out.println(x);
    }

    public void append(String a) {
        s += a;
    }

    public Cleaner dilute() {
        append(" dilute");
        return this;
    }

    public Cleaner apply() {
        append(" apply");
        return this;
    }

    public Cleaner scrub() {
        append(" scrub");
        return this;
    }

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

public class Detergent {

    private Cleaner c;

    public Detergent() {
        c = new Cleaner();
    }

    public static void main(String[] args) {
        Detergent d = new Detergent();
        d.dilute().apply().scrub();
        System.out.println(d);
    }

    public Detergent dilute() {
        c.append(" dilute");
        return this;
    }

    public Detergent apply() {
        c.append(" apply");
        return this;
    }

    public Detergent scrub() {
        c.append(" Detergent: scrub");
        return this;
    }

    @Override
    public String toString() {
        return c.toString();
    }
}

/**
 * Output:
 Cleaner dilute apply Detergent: scrub
 */

12

/**
 * 确保正确的清理
 * <p/>
 * Created by wang on 15/8/8.
 */
class Component1 {
    public Component1(String s) {
        System.out.println("Component1:" + s);
    }

    void dispose() {
        System.out.println("Dispose Component1");
    }
}

class Component2 {
    public Component2(String s) {
        System.out.println("Component2:" + s);
    }

    void dispose() {
        System.out.println("Dispose Component2");
    }
}

class Component3 {
    public Component3(String s) {
        System.out.println("Component3:" + s);
    }

    void dispose() {
        System.out.println("Dispose Component3");
    }
}

class Root {
    Component1 c1 ;
    Component2 c2 ;
    Component3 c3 ;

    public Root(String s1, String s2, String s3) {
        c1 = new Component1(s1);
        c2 = new Component2(s2);
        c3 = new Component3(s3);
    }

    void dispose() {
        c1.dispose();
        c2.dispose();
        c3.dispose();
        System.out.println("Dispose Root");
    }

}

public class Stem extends Root {
    public Stem(String s1, String s2, String s3) {
        super(s1, s2, s3);
    }

    @Override
    void dispose() {
        System.out.println("Dispose Stem");
        super.dispose();
    }

    public static void main(String[] args) {
        Stem s = new Stem("Hello", "Caroline", "Wendy");
        s.dispose();
    }
}
/**
 * Output:
 Component1:Hello
 Component2:Caroline
 Component3:Wendy
 Dispose Stem
 Dispose Component1
 Dispose Component2
 Dispose Component3
 Dispose Root
 */

13

/**
 * 继承重载
 * Created by wang on 15/8/17.
 */
class OneClass {
    void sayHello(String s) {
        System.out.println(s);
    }

    void sayHello(int i) {
        System.out.println(i + "-Hello");
    }

    void sayHello(float f) {
        System.out.println(f + "~Hello");
    }
}

class Doll {
    @Override
    public String toString() {
        return "Doll";
    }
}

class TwoClass extends OneClass {
    public void sayHello(Doll d) {
        System.out.println(d + " say Hello");
    }
}

public class OverloadClass {
    public static void main(String[] args) {
        TwoClass t = new TwoClass();
        t.sayHello(new Doll());
        t.sayHello("Caroline");
        t.sayHello(2);
        t.sayHello(0.5f);
    }
}
/**
 * Output:
 Doll say Hello
 Caroline
 2-Hello
 0.5~Hello
 */

14

/**
 * 使用组合处理对象
 * <p/>
 * Created by wang on 15/8/17.
 */
class Engine {
    public void start() {
        System.out.println("Start Engine");
    }

    public void rev() {
        System.out.println("Rev Engine");
    }

    public void stop() {
        System.out.println("Stop Engine");
    }

    public void service() {
        System.out.println("Service Engine");
    }
}

class Wheel {
    public void inflate(int psi) {
        System.out.println("Wheel psi-" + psi);
    }
}

class Window {
    public void rollUp() {
        System.out.println("Window roll up");
    }

    public void rollDown() {
        System.out.println("Window roll down");
    }
}

class Door {
    public Window window = new Window();

    public void open() {
        System.out.println("Window open");
    }

    public void close() {
        System.out.println("Window close");
    }
}

public class Car {
    public Engine engine = new Engine();
    public Wheel[] mWheels = new Wheel[4];
    public Door left = new Door(), right = new Door();

    {
        for (int i = 0; i < mWheels.length; ++i) {
            mWheels[i] = new Wheel();
        }
    }

    public static void main(String[] args) {
        Car c = new Car();
        c.engine.start();
        c.engine.rev();
        c.engine.service();
        c.engine.stop();
        c.mWheels[1].inflate(20);
        c.mWheels[3].inflate(25);
        c.left.window.rollUp();
        c.right.open();
    }
}
/**
 * Output:
 Start Engine
 Rev Engine
 Service Engine
 Stop Engine
 Wheel psi-20
 Wheel psi-25
 Window roll up
 Window open
 */

15

package access.local;

/**
 * protected方法类
 * Created by wang on 15/8/17.
 */
public class BabaoClass {
    protected void drink() {
        System.out.println("Babao Drink");
    }
}
package access.local;

/**
 * protected提供包内访问权限
 * Created by wang on 15/8/17.
 */
public class DrinkBabao {
    public static void main(String[] args) {
        BabaoClass b = new BabaoClass();
        b.drink(); // protected提供包内访问权限
    }
}
/**
 * Output:
 * Babao Drink
 */
package access.foreign;

import access.local.BabaoClass;

/**
 * 包外访问继承Protected
 * Created by wang on 15/8/17.
 */
public class LotusBabaoClass extends BabaoClass {
    public static void main(String[] args) {
        LotusBabaoClass l = new LotusBabaoClass();
        l.drink();
    }

    @Override
    protected void drink() {
        System.out.print("Lotus ");
        super.drink();
    }
}
/**
 * Output:
 Lotus Babao Drink
 */

16&17

/**
 * 向上转型
 * Created by wang on 15/8/18.
 */
class Amphibian {
    public void crawl(){
        System.out.println("Amphibian Crawl");
    }

    protected void color() {
        System.out.println("Amphibian Gray");
    }
}

class Frog extends Amphibian {
    @Override
    protected void color() {
        System.out.println("Frog Green");
    }
}

public class UpCastClass {
    static public void show(Amphibian a) {
        a.crawl();
        a.color();
    }

    public static void main(String[] args) {
        Frog frog = new Frog();
        show(frog);
    }
}
/**
 * Output:
 Amphibian Crawl
 Frog Green
 */

18

/**
 * final和static final
 * <p/>
 * Created by wang on 15/8/18.
 */
class Value {
    public int i;

    public Value(int i) {
        this.i = i;
    }

    @Override
    public String toString() {
        return i + "";
    }
}

class Corn {
    public static final Value SV = new Value(22);
    public final Value fv = new Value(11);
}

public class FinalTest {
    public static void main(String[] args) {
        Corn c1 = new Corn();
        Corn c2 = new Corn();

//        c1.fv = new Value(12); // 静态变量不变
        System.out.println(c1.SV.i = 20);
        System.out.println(c1.fv.i = 10);

        // 静态变量类共享
        System.out.println(c1.SV);
        System.out.println(c2.fv);
    }
}
/**
 * Output:
 20
 10
 20
 11
 */

19

/**
 * 空白final
 * <p/>
 * Created by wang on 15/8/18.
 */
public class EmptyFinal {
    public final int i;

    public EmptyFinal() {
        i = 12;
    }

    public EmptyFinal(int i) {
        this.i = i;
    }

    public static void main(String[] args) {
        EmptyFinal ef1 = new EmptyFinal();
        System.out.println(ef1.i);
//        ef.i = 10; // 无法为最终变量 i 指定值

        EmptyFinal ef2 = new EmptyFinal(2);
        System.out.println(ef2.i);
    }
}
/**
 * Output:
 12
 2
 */

20

/**
 * 重载
 * <p/>
 * Created by wang on 15/8/20.
 */
class HahaClass {
    protected void f() {
        System.out.print("HAHA");
    }
}

class HeheClass extends HahaClass {
    @Override
    protected void f() {
        super.f();
        System.out.println(" and HEHE");
    }

    protected void f(String s) {
        System.out.println(s + " say HEHE");
    }
}

public class OverrideClass {
    public static final void main(String[] args) {
        HeheClass h = new HeheClass();
        h.f();
        h.f("Caroline");
    }
}
/**
 * Output:
 HAHA and HEHE
 Caroline say HEHE
 */

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-28 16:38:36

Java - Thinking in Java 第7章 习题的相关文章

java JDK8 学习笔记——第16章 整合数据库

第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程序. 2.JDBC标准主要分为两个部分:JDBC应用程序开发者接口和JDBC驱动程序开发者接口.应用程序需要联机数据库,其相关API主要在java.sql和javax.sql两个包中. 3.应用程序使用JDBC联机数据库的通用语法: Connection conn = DriverManager.g

《Java编程思想》第一二章

前段时间一直通过网络教程学习Java基础,把面向对象部分学完之后本来打算继续深入学习,但是感觉自己操之过急了,基础根本不够扎实,所以入手了一本<Java编程思想>,希望先把基础打好,再深入学习. 不得不说这本书真的不是浪得虚名,对于我这样的新手看完一二章之后也觉得这本书值得买了.跟网上教程不同,这本书一开始便直接全面深入论述Java面向对象编程中对对象的理解,值得注意的是如果之前没有Java编程的基础,第一章看起来会比较吃力,而且效果也不太好,因为都是理论没有使用代码进行演示说明,所以作者也支

Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

第一章 Thread导论 为何要用Thread ? 非阻塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机执行的应用程序任务(task). 只有一个线程的例子: public class Factorial { public static void main(String[] args) { int n = 5; System.ou

《深入理解Java虚拟机》读书笔记---第二章 Java内存区域与内存溢出异常

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来.这一章就是给大家介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产生的问题. 1.运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 1.1程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型中里,字

JAVA: httpclient 详解——第五章;

相对于httpurlconnection ,httpclient更加丰富,也更加强大,其中apache有两个项目都是httpclient,一个是commonts包下的,这个是通用的,更专业的是org.apache.http.包下的,所以我一般用后者: httpclient可以处理长连接,保存会话,重连接,以及请求过滤器,连接重用等等... 下面是测试代码(全部总结来自官方文档,以及翻译) 须要下载核心包:httpclient-4.3.4.jar ,也可在官网下载:http://hc.apache

Java 线程第三版 第九章 Thread调度 读书笔记

一.Thread调度的概述 import java.util.*; import java.text.*; public class Task implements Runnable { long n; String id; private long fib(long n) { if (n == 0) return 0L; if (n == 1) return 1L; return fib(n - 1) + fib(n - 2); } public Task(long n, String id)

201671010105 2016-2017-2《Java程序设计》第一、第二章学习心得

我们大一的时候学习的是C语言程序设计,C语言是面向程序的,而老师也说过我们后面会学习一种面向对象的程序设计语言--Java程序设计,而在二年级开学第一周,我们第一次真正意义上接触到了它. 令人意外的是和往常老师讲学生听不同,这一周我们对Java程序设计第一.第二章的学习完全是自主的,通过一周对Java第一.第二章的学习,心得体会如下: 第一章 Java程序设计概述 1.通过对第一章的学习,对Java有了比较深入的了解,Java和C一样,是一种语言,但它又不止是一种语言,它是一个完整的程序设计平台

[Java学习笔记] Java核心技术 卷1 第四章

第4章 对象与类 4.1 类和对象的基本概念 描述了类和对象的基本概念,以及类之间的关系介绍. 程序中的很多对象来自于标准库,还有一些自定义的. 结构化程序设计:通过设计一系列的过程(算法),选择合适的存储方式来解决问题. 算法+数据结构 4.1.1 类/封装/继承 类是构造对象的模板,由类构造对象的过程称为创建类的实例. 封装:也称为数据隐藏.从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式.优点4.2.3 实例域:对象中的数据. 方法:操纵数据的过程.

《深入理解Java虚拟机》读书笔记---第一章 走进Java

一.为什么要读此书 <深入理解Java虚拟机>这本书读了很多次,每次读都会有不一样的感受.首先说一下为什么要读这本书,如果把Java比喻成乾坤大挪移,那了解虚拟机的工作原理就是练习九阳神功,java语言是招式,对虚拟机的认识是内功心法,只有内功心法强大,所使的招式才强大,这就是为什么阳顶天只能把乾坤大挪移练到第四层,而张无忌能练到第七层.由于java虚拟机的强大,把很多功能都隐藏了,例如内容管理,垃圾回收机制等,使得很多java程序猿对这一块的知识所有缺失,编码的时候也是似懂非懂的,以至于遇到

《Java并发编程实战》第二章 线程安全性 读书笔记

一.什么是线程安全性 编写线程安全的代码 核心在于要对状态访问操作进行管理. 共享,可变的状态的访问 - 前者表示多个线程访问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与其规范完全一致. 多个线程同时操作共享的变量,造成线程安全性问题. * 编写线程安全性代码的三种方法: 不在线程之间共享该状态变量 将状态变量修改为不可变的变量 在访问状态变量时使用同步 Java同步机制工具: synchronized volatile类型变量 显示锁(Explicit Lock