Think in Java笔记(一)

1.1抽象过程

1.万物皆对象
2.程序是对象的集合,他们通过发送消息来告知彼此要做的。
3.每个对象都有自己的由其他对象所构成的存储。(组合composition)
4.每个对象都拥有其类型。
5.某个特定的所有对象都可以接收同样的消息。

1.2每个对象都有一个接口

1.每一个对象都属于定义了特性和行为的某个特定的类。
2.类是描述具有相同特性(数据类型)和行为(功能)的对象集合。
3.有用的对象必须有某种方式产生对对象的请求,使对象完成任务,而这些请求都是由对象的接口(interface)定义。

Created with Raphaël 2.1.0 对象 对象 接口 接口 请求 请求 特性和行为的特定类 实现 定义 必须有某种方式产生请求

1.3每个对象都提供服务

1.因为程序本身是向用户提供服务,而程序是对象的集合。
2.将整个程序划分为以对象为单位的多个服务,将有利于程序设计时对实体的抽象;同时提高对象的内聚性。

1.4被隐藏的具体实现

程序员
–> 类创建者(创建新数据类型的程序员)
–> 客户端程序员(应用中使用数据类型的程序员)

隐藏数据类型(访问控制public、private、protected)

1.保护对象内部脆弱的部分
2.便于理解哪些是重要的,哪些是可以忽略的
3.允许类创建者改变类内部工作方式而不影响客户端程序员
4.可以实现全局优化

1.5复用具体实现

最简单的复用即“创建一个成员对象”

//创建一个电池对象
class Battery 
{
    //充电功能
    public void chargeBattery(double p)
    {
        if (this.power < 1.) {
            this.power = this.power + p;
        }
    }
    //用电功能
    public boolean useBattery(double p)
    {
        if (this.power >= p) {
            this.power = this.power - p;
            return true;
        }
        else {
            this.power = 0.0;
            return false;
        }
    }
    private double power = 0.0;
}
//创建一个手电筒
class Torch
{
    /** 
     * 电筒开
     * 10% power per hour use
     * warning when out of power
     */
    public void turnOn(int hours)
    {
        boolean usable;
        usable = this.theBattery.useBattery( hours*0.1 );
        if (usable != true) {
            System.out.println("No more usable, must charge!");
        }
    }
    /**
     * 充电
     * 20% power per hour charge
     */
    public void charge(int hours)
    {
        //直接调用该私有电池的充电方法
        this.theBattery.chargeBattery( hours*0.2 );
    }
    /**
     * 创建一个私有的电池对象
     * composition组合
     */
    private Battery theBattery = new Battery();
}

Torch类使用了一个Battery类型的对象(theBattery)来作为数据成员。在Torch的方法中,我们通过操纵theBattery对象的接口,来实现Battery类所提供的功能(functionality)。
我们说,一个Torch对象拥有(has-a)一个Battery对象。

1.6继承

1.继承即表示不仅包括现有类型的所有成员,更重要的是它复制了基类的接口。
基类和导出类产生差异:
(1)直接在导出类中添加新方法
(2)覆盖(overriding)

1.7伴随多态的可互换对象

1.一个非面向对象编程的编译器产生的函数调用会引起“前期绑定”,意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。
2.面向对象程序设计语言使用了“后期绑定”的概念,当对象发送消息时,被调用的代码指导运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查。

Created with Raphaël 2.1.0 非面向对象编程 函数 函数 编译器 编译器 代码 代码 运行前 产生调用 运行时 解析到绝对地址 运行后
Created with Raphaël 2.1.0 面向对象编程 对象 对象 编译器 编译器 运行时 确保被调用方法的存在 并对调用参数和返回值执行类型检查

后期绑定实现:java使用一小段特殊的代码来替换绝对地址调用,使其计算方法体的地址。

1.8单根继承结构

除C++以外的所有OOP语言,最终都继承自单一的基类——Object
1.你可以在每一个对象上执行某些基本操作
2.很容易在堆上创建,而参数传递会得到极大的简化
3.使垃圾回收器的实现变得容易得多
4.异常处理更为灵活

1.9容器

定义:因为无法确定需要多少空间来创建多少对象,所以创建了另一种对象类型,用于持有对其他对象的引用——容器。
C++的容器:标准模板类库(Standard Template Library,STL)
Object Pascal的容器:可视化构件库(Visual Component Library,VCL)
java的容器:List、Map和Set
1、参数化类型(泛型)
为了将原先置入容器中的Object对象还原为具有实用接口的对象:向下转型和参数化类型(泛型)
由于向下转型和运行时的检查需要额外的程序运行时间,所以运用参数化类型,编译器可以定制一个只接纳和取出特定对象的容器。<>

ArrayList<Shape> shapes = new ArrayList<Shape>();

1.10对象的创建和生命期

1、第一种:堆栈——为追求最大的执行素的,将对象至于堆栈或静态存储区域内,将存储空间分配和释放至于优先考虑的位置。
2、第二种:堆(heap)——在内存池中动态地创建对象,因为存储空间是在运行时被动态管理的,所以需要大量的时间在对重分配存储空间。
java提供了“垃圾回收器”的机制,可以自动发现对象何时不再被使用,继而销毁它。

1.11异常处理:处理错误

java的异常处理在众多的编程语言中格外引人注目,因为java一开始就内置了异常处理,而且强制你必须使用它。

1.12并发编程

并发——同一时刻处理多个任务
有多个并行任务都要访问同一项资源,则会出现问题。为解决这个问题,必须在使用期间将资源锁定。

Created with Raphaël 2.1.0 任务 任务 资源 资源 任务完成 任务完成 锁定 释放资源锁

java的并发是内置于语言中的,java SE5已经增添了大量额外的库支持。

java与Internet

服务器——信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群
客户机——通过驻留在用户机器上的软件与服务器进行通信,以获取信息、处理信息
中间件——为了将延时最小化,将负载分散给在服务器端的其他机器。
Web最初的“服务器——浏览器”设计是为了能够提供交互性的内容,但是其交互性完全由服务器提供。
通用网关接口(common gateway interface,CGI)——用于传递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值