Java编程思想
- 有C++编程基础的条件下, 前10章可以快速过一下,都是基本语法,不需要花太多时间. 着重中后段的一些章节,类型信息、泛型、容器、IO、并发等.
- 中文翻译版
- 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步.
每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我.
对象入门
- 类的继承一般使用'统一标记法'(UML图)来画继承的图.
- 在面向对象的程序中, 通常要用到上溯造型(向上转型)的技术, 需要动态绑定.
- Polymorphism(多态性). --- 通过动态绑定实现.
- Java中使用
abstract
实现基类的抽象. - 复用的具体实现:
- 组合(composition): 使用现有的类合成新的类. --- has-a的关系.
- 聚合(aggregation): 动态发生的组合.
- Java中动态绑定是默认行为, 不需要添加额外的关键字实现多态.
- 单根继续保证所有对象都具备某些功能.
- Java的容器库: List用于存储序列, Map关联数组, Set每种对象类型只持有一个.
- Java中也支持泛型.
- Java完全采用了动态内存分配方式, 通过new来构建一个对象. 垃圾回收机制可自动发现对象合适不再被使用, 并继而销毁它.
- 垃圾回收机制提供了更高层的保障, 可以避免暗藏的内存泄漏问题.
- Java的垃圾回收器被设计用来处理内存释放问题(不包括清理对象的其他方面).
- Java的并发是内置于语言中的, 具有大量额外的库支持.
- 超文本标记语言HTML(HyperText Markup Language).
一切都是对象
- 尽管Java是基于C++的, 但是相比之下, Java是一种更纯粹的面向对象设计语言.
用引用操作对象
- 一切都被视为对象, 操作的标识符实际上采用的是对象的一个引用(reference).
- 创建一个引用的同时便进行初始化操作.
通过new操作符(关键字)来实现一个新的对象的创建, 并把它和一个引用进行关联.
- 五个不同的地方可以进行数据存储:
- 寄存器: 最快的存储去, 处理器内部.
- 堆栈: 位于通用RAM(随机访问存储器)中, 堆栈指针下移分配新的内存, 上移释放内存, Java中的对象引用一般都存在堆栈中.
- 堆: 通用的内存池(也位于RAM区), 用于存放所有的Java对象. 编译器不需要直到堆中对象的生存期.
- 常量存储: 直接存放在代码内部, 这样做它们永远不会被改变, (ROM)只读存储器.
- 非RAM存储, 数据完全存活于程序之外, 将不受程序的任何控制, 流对象(将对象转化为字节流)和持久化对象(对象被放在磁盘上).
- Java内部的基本类型(内置类型)一般不用new来创建, 而是创建一个自动变量, 这个变量直接存储其值, 并置于堆栈中, 这样使用更加高效.
- Java程序中类型所占空间大小的不变性是它更具有可移植性的原因之一.
- Java中自动包装功能可以将基本类型转换为包装器类型, 也可以方向转换.
- Java提供了两个高进度计算的类: BigInterger(任意精度的整型)和BigDecimal(任意精度的浮点数).
- Java确保数组会被初始化, 而且不能在它的范围之外被访问, 运行时会检查下标.
- 数组引用被初始化为null, 数组所占内存被全部置零.
永远不需要销毁对象
- 作用域, 作用域决定了在其内部定义的变量名的可见性和声明和生命周期.
- Java是一种*格式(freee-form)的语言, 空格, 制表符, 换行都不会影响程序的执行结果.
- 方法, 参数和返回值: Java中的方法只能作为类的一部分来创建, 方法只有通过对象才能被调用.
- 名字可见性. 运用其他构件
import Java.util.*
.- static关键字: 为某种特定域分配单一存储空间, 不考虑究竟要创建多少对象, 甚至根本不创建对象.
- 希望某个方法不与包含它的类的任何对象关联在一起, 即使没有创建对象也可以使用这个方法.
- static关键字: 为某种特定域分配单一存储空间, 不考虑究竟要创建多少对象, 甚至根本不创建对象.
- Java的命名风格中, 类名的首字母要大写, 不用下划线分割, 驼峰代码风格, 标识符的第一个字母采用小写.
操作符
- Java中更简单的打印语句:
System.out.println("Rather a lot to type");
. - 静态导入(static import)可以创建一个小类库来简化打印语句的编写.
- 直接常量: 在后缀字符标志其类型, L(l)代表long, F(f)代表float, D(d)代表double. 指数记数法(1.39e-43f).
- Java中类型转换是一种比较安全的操作, 截尾和舍入.
控制执行流程
- if-else, while, do-while, for, return, break, switch.
- Java并不支持goto语句.
访问权限控制
- 如何把变动的事物与保持不变的事物区分开来.
- public, protected, 包访问权限(没有关键词)和private.
- Java的标准发布中有一个工具库, 它被组织在java.util名字空间之下.
包:库单元
- 当编译一个
.java
文件时, 在.java
文件中的每个类都会有一个输出文件, 而该输出文件的名称与.java
文件中每个类的名称相同, 只是多了一个后缀名.class
. - Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR, 使用Java的jar文档生成器)的
.class
文件.- Java解释器负责这些文件的查找, 装载和解释.
- 类库实际上是一组类文件. --- 每个文件都有一个public类, 以及任意数量的非public类.
- 每个文件都有一个构建, 如果希望这些构件从属于同一个群组, 就可以使用关键字package.
- 如果使用
package
语句, 它必须是文件中除注释以外的第一句程序代码.
- package和import关键字允许你做的, 是将单一的全局名字空间分割开, 使得无论多少人使用Internet以及Java开始编写类, 都不会出现名称冲突问题.
- 创建独一无二的包名: 一个包并没有把被打包的东西包装成一个单一的文件.
- 将一个特定包的所有
.class
文件都置于一个目录下. - package名称的第一部分是类的创建者的反顺序的Internet域名.
- 将一个特定包的所有
- Java解释器的运行过程:
- 找出环境变量CLASSPATH.
- 得到路径与CLASSPATH中的各个不同的项, 解释器就从这些目录中查找相关的.class文件(包括标准目录).
- Java中没有条件编译功能, import能够切换开关并产生不同的行为.
- 包的名称对应目录路径.
- 包访问权限:
- friendly: 表示当前的包中, 所有其他类对那个成员都有访问权限, 而对其他包的所有类都是private.
- 同一个包中的类可以相互访问(public方法).
- 提供访问器(accessor)和变异器(mutator)方法(也称作get/set方法).
- ubuntu中添加路径的方法:
java -cp path1:path2:
.-
javac -cp mindview.jar;. HelloWorld.java
或javac -cp .:../../../net.mindview.jar *.java
. -
java -cp mindview.jar;. HelloWorld
或java -cp .:../../../net.mindview.jar Assignment
. - 用
-cp(-classpath)
一定要包含当前路径'.'. - 编译一个包的时候一定要加入一个
-d .
选项, 把所有的.java
输出文件按照类的结构重新组织.-
javac -cp .:../../../net.mindview.jar -d . *.java cookie2/Cookie.java dessert/Cookie.java mypackage/MyClass.java
.
-
-
- 访问权限的控制常被称为是具体实现的隐藏.
- 每个单元都有单一的公共接口, 用public类来表现.
- public类的名称必须完全与该编译单元的文件名相匹配, 包括大小写.
- 编译单元完全不带public类也是可以的, 而且可以随意对文件命名.
复用类
直接在自定义的类中声明其他类型.
- 在派生类名称后紧跟关键字
extends
, 再接基类. --- 自动得到基类中所有的域和方法. - 用关键字super显示地编写调用街垒构造器的语句, 并配以适当的参数列表.
- 将清理动作置于finally子句之中, 以防异常的出现.
- final关键字: 数据, 方法, 和类.
- final 数据:
- 一个永不改变的编译时常量; --- 必须是基本数据.
- 一个在运行时被初始化的值, 而不希望它被改变.
- 空白final是指被声明为final但又未给定初值的域.
- final 方法
- 把方法锁定, 以防任何继承类修改它的含义.
- 为了效率的考虑.
- final 类:
- 不打算继承该类. 也不允许别人这么做.
- final 数据:
- final关键字: 数据, 方法, 和类.
- Java采用加载的一种方式来执行程序.
- 类的代码在初始使用时才会被加载.
多态
- 把某个对象的引用视为对其基类的引用的做法被称为向上转型.
接口
- 接口和内部类提供了一种将接口与实现分离的更加结构化的方法.
- 抽象类和抽象方法. --- interface关键字进行声明.
- 完全解耦. --- 需要将所有的接口名都置于implements关键字之后. 并用逗号将它们一一隔开.
- 通过继承来扩展接口.
内部类
- 可以将一个类的定义放在另一个类的定义内部, 这就是内部类.
- 连接到外部类.
- 使用.this和.new.
- 内部类与向上转型.
- 在方法和作用与内的内部类.
- 匿名的内部类.
- 嵌套类.
- 每个内部类都能独立地继承自一个接口的实现, 所以无论外围类是否已经继承了某个接口的实现, 对于内部类都没有影响.
- 闭包是一个可调用的对象, 它记录了一些信息, 这些信息来自于创建它的作用域.
- 编译的时候用
$
符标识内部类.