第一章 java语言概述
1.1 java语言的发展简史
1990末: sun公司“Green计划”(James Gosling领导) ----目的是智能家电编写一个通用嵌入式控制系统,为此创建oak
1992夏天: "Green计划"完成新平台的部分功能
1992年11月: "Green计划"被转为"FirstPerson有限公司"-一个sun的全资子公司,致力于创建一个高度互动的设备
1994夏天: 互联网浏览器给Oak带来信的生机,Gosling开始对Oak进行小规模的改造
1994秋: WebRunner完成,Oak更名为java
1995初: Sun发布java语言,公开源代码 ,applet小程序风
1996初: Sun发布jdk1.0,包括jre(API,JVM,发布技术等)和jdk(javac等)
1997.2.18: 发布jdk1.1,增加JIT编译器
1998.12: Sun发布jdk1.2/jsp/servlet/EJB等规范,将java分成j2se,j2ee,j2me三个版本 ----最重要的jdk版本
2002.2: jdk1.4 ----最成熟的一个版本,出现各种开源框架
2004.10: jdk1.5 ----增加了泛型/增强for循环/可变数量型参/注释/自动拆箱和装箱
目录 2006.12: jdk1.6
2007.11: Android问世
2009.4.20: Oracle收购sun(java和solaris)
2011.7.28:Oracle发布jdk1.7
1.2 java的竞争对手即各自优势
1.2.1 c#: 和java由90%的重叠度,依赖windows平台,具有许多windows特性
1.2.2 ruby: 拥有Roby on Rails这个MVC框架,简洁,是与开发中小型应用
1.2.3 python: 高可扩展性/清晰的语法
1.3 java程序运行机制
1.3.1 高级语言的运行机制
1.3.2 java程序的运行机制和jvm
1.4 开发java的准备
1.4.1 下载和安装java 7的jdk
1. jre和jvm的关系
jre包含:类加载器,字节码校验器以及大量的基础类库
2. 为什么不安装公共jre
公共jre是一个独立的jre系统,系统上任何一个程序都可以使用公共jre,网页上的applet很少了,没必要。jdk中包含的jre就够用了。
1.4.2 设置path环境变量
1. 用户变量与系统变量的区别: 用户变量只对当前用户有效,系统变量对所有用户有效。系统变量比用户变量优先级高。
1.5 第一个java程序
1.5.1 编辑java程序源代码
1.5.2 编辑java程序
1. 为和不需要指定.class文件的名称
1.5.3 运行java程序
$ mkdir -p ~/git/github/practice/read/classfile; cd ~/git/github/practice/read/classfile
$ vim HeloWorld.java
$ javac -d classfile/ HelloWorld.java ---- -d 指定编译文件放置的目录
$ java -classpath classfile/ HelloWorld ---- -classpath 指定搜索的目录
1.5.4 根据classpath环境变量定位类
1. jdk1.4之前需要设置CLASSPATH环境变量: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar ----指定jvm运行时搜索当前路径和那两个jar包,因为那两个jar中有必需的编译/运行工具
2. 后来的jre会自动搜索当前目录下的类文件,使用java的编译和运行工具时系统也会自动加载那两个jar包中的java类。
3. 运行时指定搜索路径
$ java -classpath dir1;dir2;...;dirN java类名 ----win下在多个目录中搜索的方式
$ java -classpath dir1:dir2:...:dirN java类名 ----linux下
1.6 java程序的基本规则
1.6.1 java程序的组织形式
1. java程序都必需以类的形式存在;
2. main方法作为程序的入口的形式是固定的;
3. 没有main方法的class HelloWorld{}这个最小的类是正确的,编译可以成功,但这个类不能作为程序的入口来解释执行;
4. 源文件的名字必需与public的类名相同,因此一个java源文件有且只有一个Public类;
1.6.2 java程序的组织形式
1.6.3 初学者容易犯的错误
1.7 垃圾回收机制
1.8 何时开始使用ide工具
第二章 理解面向对象
2.1 面向对象
2.1.1 结构化程序设计简介
2.1.2 程序的三种基本结构
1. 顺序结构
2. 选择结构
3. 循环结构
2.1.3 面向对象程序设计简介
1. 是一种更加优秀的程序设计方法,它的基本思想是使用类/对象/继承/封装/消息等基本概念进行程序设计。
2.1.4 面向对象的基本特征
1. 封装: 将对象的实现细节隐藏起来,然后通过一些共有方法来暴露该对象的功能
2. 继承: 是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类直接继承父类的属性和方法
3. 多态: 指的是子类对象可以直接赋给父类对象,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时可以有多种行为特征
2.2 UML(统一建模语言)介绍
2.2.1 用例图
1. 开发阶段: 需求分析阶段
2. 用途: 帮助开发团队以一种可视化的方式理解系统的需求功能
3. 元素: 用例(椭圆) + 角色(人形)
4. 注意: 描述系统的功能,方便和客户交流;不要指望用例图和系统的各个类之间由任何联系;不要将用例做的过多难以理解;尽可能多地使用文字说明。
2.2.2 类图
1. 表示方法
2. 三种基本关系:关联(聚合/组合),泛化(继承),依赖
2.2.3 组件图
2.2.4 部署图
2.2.5 顺序图
2.2.6 活动图
2.2.7 状态机图
2.3 java面向对象特征
2.3.1 一切都是对象
2.3.2 类和对象
第三章 数据类型和运算符
3.1 注释
3.1.1 单行注释和多行注释
3.1.2 文档注释
1. api文档是什么
1. 生成java api的工具使用案例
$ javadoc -d apidoc -docencoding UTF-8 -charset UTF-8 -windowtitle 测试 -doctitle 学习javadoc工具测试 -header 我的类 -author -version TestDoc.java
-------------------------------------------------------------------------------------------------------------------------------------------------------
-d <dir>: 将生成的api文档放在apidoc这个目录下
-docencoding <name>: 指定输出编码的名称
-charset <name>: 指定夸平台查看文档的字符集
-windowtitle <text>: 指定API文档的浏览器窗口标题
-doctitle <html-code>: 指定html格式的文本,用于指定概述页面的标题(针对源文件有多个包的情况),这里是单文件所以其实不应该加这个参数
-header <html-code>: 每个页面的页眉
-version -author: 如果有的话,提取源代码中的版本和作者信息(默认不提取)
----------------------------------------------------------------------------------------------------------------------------------------------------------
$ javadoc ----查看详细帮助信息
2. 为什么要掌握查看api文档的方法
3. 文档注释标记
1. 类/接口文档注释:
@see: "参见",用于指定交叉参考的内容
@deprecated: 不推荐使用的方法
@author: 作者信息
@version: 指定源文件的版本
2. 方法/构造器文档注释
@see: "参见",用于指定交叉参考的内容
@deprecated: 不推荐使用的方法
@param: 方法的参数说明信息
@return: 方法的返回值说明信息
@throws: 抛出的异常,和exception同义
@exception: 抛出异常的类型
3. Field文档注释
@see: "参见",用于指定交叉参考的内容
@deprecated: 不推荐使用的方法
3.2 标识符和关键字
3.2.1 分隔符
3.2.2 标识符规则
3.2.3 java关键字
3.3 数据类型分类
3.4 基本数据类型
3.4.1 整数: byte,short,int,long
3.4.2 java 7新增的二进制整数
1. 0b或0B打头,后面只接二进制数字为32位,后面还有L或l为64位
2. 二进制相关
原码: 直接将数字换算为二进制
反码: 反码是原码最高位不变,其余取反
补码: 正数的补码就是原码,复数是其反码+1
3.4.3 字符型(16位)
1. 表示方式
‘A’: 单个字符
‘\n’: 转义字符
‘\uxxxx’: 十六进制编码('\0000' - '\uFFFF')
2. 使用16位unicode字符集编码
3.4.4 浮点型(IEEE754)
1. 使用二进制的科学计数法表示浮点数,无法精确表示浮点数
2. 分类
float(32位): 符号位(1)+指数(8)+尾数(23)
double(64位): 符号位(1)+指数(11)+尾数(52)
3. 表示方法
float: 5.5f 或 5.5F
double: 5.5 或 5.5d 或 5.5D
4. 3个特殊的浮点数值
Double.POSITIVE_INFINITY或Floate.POSITIVE_INFINITY: 正无穷大(1/0)
Double.POSITIVE_INFINITY或Floate.NEGATIVE_INFINITY: 负无穷大(-1/0)
Double.NaN或Float.NaN: 非数(0.0/0.0 or (-2)^2)
3.4.5 java 7新增的数值中使用下划线分隔
1. 举例
int binVal = OB1000_0000_0000_0000_0000_0000_0000_0001;
float pi = 3.14_15_92_65_36;
2. 便于阅读
3.4.6 布尔型
1. boolean: true or false
2. 用途
流程控制: if/while/for/do
三目运算符: ?:
3. 注意
1. boolean类型不能转化为其他类型
2. 其它类型不能转化为boolean型
3 true和false不会直接转换为boolean类型
4. String str = true+"";
3.5 基本类型的类型转换
3.5.1 自动类型转换
1. 基本数据类型自动转换: 范围小的转换成范围大的
char
|
v
byte ->short->int->long->float->double
2. 基本数据类型自动转换为字符串类型: 从左到右,能计算就计算,和字符串连接即转换为字符串
3+4 + "Hello" -> "34Hello"
"hello" + 3 + 4 -> "hello34"
3.5f + "" -> "3.5"
3.5.2 强制类型转换
1. 缩小转换(溢出)
int - > byte: 从低位截取8位
3.5.3 表达式类型的自动提升
1. 不管有没有int,运算中byte,short,char被提升为int
2. 自动提升为最高类型
3.6 直接量
3.6.1 直接量的类型
1. int(byte/short):
二进制: 0b10000 or 0B10000
八进制: 020
十进制: 16
十六进制: 0xf or 0Xf
2. long:
[int]l or [int]L
3. float:
534f or 5.34E2f or 534F or 5.34E2F
4. double:
534 or 5.34E2
5. boolean:
true or false
6. char:
'a' or '\n' or '\u0061'
7. String:
"hello"
8. null(特殊):
null: 可以赋给任何引用类型
3.6.2 直接量的赋值
1. 常量池: 指的是编译期间已确定,并被保存到已编译的.class文件中的一些数据。包括关于类/方法/接口中的常量,也包括字符串直接量。
2. java会确保每个字符串常量只有一个,没有副本
("hello"和"hel" + "lo"一样,因为编译时就进行了优化。)
3.7 运算符
3.7.1 算术运算符
1. 分类: "+", "-", "*", "/", "%", "++", "--"
2. 重点:
1. ”+“除了作为数学加法运算符外还可以作为字符串连接符
2. “++”或“--”只能用于变量,不能用于直接量,比如5++是错误的
3. 没有平方,乘方运算符,可以用库中的方法实现(java.lang.Math)
3.7.2 赋值运算符
1. 变量 = 直接量;
2. 变量 = 变量;
3. 变量 = 变量 = ... =变量 = 直接量; ----java支持连续赋值,但会降低可读性,因此不推荐
4. 增强的赋值表达式: += -= /= *= %= &= |= ^= >>= <<= >>>= ----拥有更好的性能
3.7.3 位运算符(注意计算机中的运算都是基于补码的)
1. &: 按位与: 只有都为1是才为1
2. |: 按位或: 只要有一个为1就为1
3. ~: 按位非: 单目运算,1->0,0->1
4. ^: 按位亦或: 两者不同才为1
5. <<: 左移运算符: 二进制补码整体左移指定位数,空出的位补0
6. >>: 右移运算符: 二进制补码整体右移,正数补0,复数补1
7. >>>: 无符号右移运算符: 二进制补码整体右移,无论正负都补0
注意事项:
1. 只有整数类型可以进行移位操作
2. byte/short/char类型进行移位操作时自动提升为int
3. 32的类型移位超过32位时将对位数求余,a>>33等价于a>>1
4. 64位类型(long)移位超过64位时将对64求余
3.7.4 扩展后的赋值运算符
1. 分类:+= -= /= *= %= &= |= ^= >>= <<= >>>=
2. 扩展后的赋值运算符拥有更好的性能,底层机制更加健壮(a+=b和a=a+b底层是不一样的)
3.7.5 比较运算符: > < == >= <= !=
1. 基本类型变量或直接量不能与引用类型变量或值进行==比较
2. boolean类型的值或变量不能与其它任何类型进行==比较
3. 不同引用类型变量之间没有父子继承关系也不能进行==比较
3.7.6 逻辑运算符
1. &&: 逻辑与
2 ||: 逻辑或
3. !: 逻辑非
4. &: 不短路与
5. |: 不短路非
6. ^: 亦或
(位运算符的操作数是整数类型,逻辑运算符操作的是boolean)
3.7.7 三目运算符
1. 结构: (expression)?if-true-statement:if-false-statement;
2. 举例: String str = 3 > 5?"3大于5":"3小于5";
3.7.8 运算符的结合性和优先级
第四章 流程控制与数组
4.1 顺序结构
4.2 分支结构
4.2.1 if条件语句
1. if(boolean)
{
expression;
}
2. if(boolean)
{
expression;
}
else
{
expresion
}
3. if(boolean)
{
expression;
}
else if(boolean)
{
expresion
}
...
else
{
expression;
}
4.2.2 java 7的switch分支语句
1. 结构
switch(expression)
{
case condition1:
{ ----可省略
statement;
break;
} ----可省略
...
case conditionN:
{
statement;
break;
}
default:
{
statement;
}
}
2. 控制表达式的数据类型
1. 传统: byte, short, char, int
2. jdk 7: byte, short,char, int, java.lang.String
4.3 循环结构
4.3.1 while循环语句
while(boolean)
{
循环体;
}
4.3.2 do while循环语句
do
{
循环体;
}while(boolean);
4.3.3 for循环
1. 结构
for([init_statement]; [test_statement]; [iteration_statement])
{
statement;
}
2. [init_statement]初始化语句只在循环开始前执行一次
3. for循环圆括号中只有两个";"是必需的,其它都可以省略,在语法上没有问题: for(;;){}
4. 习惯选择i,j,k作为循环变量
4.3.4 嵌套循环
4.4 控制循环结构
4.4.1 使用break结束循环
1. 单纯使用break: 结束所在的整个循环
2. 配合标签使用: 结束外层循环
outer: ----通常紧跟在break后面的标签必需在break所在的循环之前定义才有意义
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 3; j++ )
{
System.out.println(i);
if(j == 1)
{