Java
文章目录
Chapter1 Java概述
组成
计算机包括硬件与软件两部分
一台计算机主要硬件:
-
中央处理器(CPU)
-
- 计算机的大脑。从内存中获取指令并执行。
- 由控制单元(控制与协调其他组件的动作)与算术逻辑单元(完成数值运算和逻辑运算)组成
-
内存(主存)
-
- 由一个有序的字节序列组成,用于存储程序及程序所需要的数据
- 每个字节都有唯一的地址。使用这个地址确定字节的位置,以便于存储和获取数据。因为可以按任意顺序存储字节,所以内存也被称为随机访问存储器(RAM)
- 内存中字节内容完全非空
-
存储设备(例如,磁盘和光盘 )
-
- 磁盘驱动器
-
- 每台计算机至少一个。
- 用于永久地存储数据和程序
- 光盘驱动器
- USB闪存驱动器
-
- 通用串行总线(USB)接口允许用户将多种外部设备连接到计算机上
- USB闪存驱动器是用于存储和传输数据的设备。
-
输入设备(例如,鼠标和键盘)
-
输出设备(例如,显示器和打印机)
-
通信设备(例如,调制解调器和网卡)
这些组件通过一个称为总线(bus)的子系统连接
计算机中字节(byte)是最小的存储单元,每个字节由8个比特(bit)构成
各种类型的数据都被编码为字节序列
编程语言
- 机器语言
-
- 计算机原生语言,即一套内嵌的原子指令集
- 指令以二进制代码的形式存在,必须以二进制输入指令
- 汇编语言
-
- 使用短的描述性单词(助记符)来表示每一条机器语言指令
- 需要汇编器将汇编语言程序转换为机器代码
- 需要知道CPU如何工作
- 高级语言
-
- 指令称为语句
- 用高级语言编写的程序称为源程序或源代码
- 需要解释器/编译器将源代码翻译成可执行的机器代码
-
- 解释器从源代码中读取一跳语句,将其翻译为机器代码或者虚拟机器代码,然后立刻运行(来自源代码的一跳语句可能被翻译为多条机器指令)
- 编译器将整个源代码翻译为机器代码文件,然后执行该机器代码文件
操作系统
- 控制和监视系统的活动
-
- 执行基本任务
- 确保不同的程序和用户同时使用计算机时不会相互干扰
- 负责安全处理,确保未经授权的用户和程序无权访问系统
- 分配和调配系统资源
-
- 却动一个程序需要使用哪些计算机资源,并进行资源分配和调配以运行程序
- 调度操作
-
- 多道程序设计允许多个程序通过共享CPU同时运行
- 多线程允许单个程序同时执行多个任务
- 多处理,即并行处理,使用两个或多个处理器共同并行执行子任务,然后将子任务的结果合并以得到整个任务的结果
Java及Java语言规范
Java承诺,一次编写,任何地方都可以执行
简单的、面向对象的、分布式的、解释性的、健壮的、安全的、体系结构中立的、可移植的、高性能的、多线程的和动态的
Java语言规范是对语言的技术定义,包括Java程序设计语言的语法和语义
应用程序接口(API)也称为库,包括为开发Java程序而预定义的类和接口。
Java开发工具包(JDK)是由一套独立程序构成的集合,每个程序都是从命令行调用的,用于开发和测试Java程序
集成开发环境(IDE)
创建、编译和执行Java程序
Java源程序保存为.java文件,编译(javac .java)为.class文件。.class文件由Java虚拟机(JVM)执行(java)
Chapter2 基本程序设计
每一个Java应用程序都必须有一个main方法,程序从该方法处开始执行
Java提供简单的数据类型来表示整数、实数、字符以及布尔类型,这些类型称为原始数据类型或基本类型
实数也称为浮点数
源代码中,字符串常量不能跨行
从控制台读入
Java使用System.out来表示标准输出设备,而用System.in来表示标准输入设备
Java不支持控制台直接输入,但是可以使用Scanner类创建它的对象,以读取来自System.in的输入
Scanner input = new Scanner(System.in);
//创建一个Scanner对象,并将它的引用值赋值给变量input
Scanner类包含在java.util里
import语句由两种类型:明确导入(在import语句中指定单个的类)和通配符导入(通过使用*作为通配符,导入一个包中所有的类)
import java.util.Scanner;//明确导入
import java.util.*;//通配符导入
除非要在程序中使用某个类,否则关于被导入包中的这些类的信息在编译时或运行时是不被读入的。导入语句只是告诉编译器在什么地方找到这些类。声明明确导入和声明通配符导入在性能上没有差别
大部分程序分三个步骤执行:输入、处理、输出,这被称为IPO
输入是从用户那里获得输入,处理时使用输入产生结果,而输出是显示结果
标识符
标识符是为了标识程序中诸如类、方法和变量的元素而采用的命名
- 标识符是由字母、数字、下划线(_)、和美元符号($)构成的字符序列
- 标识符必须是以字母、下划线(_)、和美元符号($)开头,不能以数字开头
- 标识符不能是保留字
- 标识符不能是true、false、null
- 标识符可以为任意长度
- 不要用 命 名 标 识 符 , 习 惯 上 命名标识符,习惯上 命名标识符,习惯上只用在机器自动产生的源代码中
变量
变量用于存储程序后面要用到的值,一个变量在使用前,必须被声明和初始化
变量声明告知编译器根据数据类型为变量分配合适的内存空间
在赋值给变量之前,必须先声明变量。方法中声明的变量在使用之前必须被赋值
变量的使用范围指变量可以被引用道德程序的部分
赋值语句和赋值表达式
变量 = 表达式
Java中,赋值语句的本质是计算出一个值并将它赋给操作符左边的一个表达式
赋值语句中,左边变量的数据类型应与右边值得数据类型兼容
命名常量
命名常量是一个代表不变值得标识符
final datatype CONSTANTNAME = value ;
常量必须在同一条语句中声明和赋值,单词final是声明常量得Java关键字
- 不必重复输入同一个值
- 如果必须修改常量值,只需要在源代码得一个地方改动
- 给常量赋一个描述性文字会提高程序易读性
数值数据类型和操作
Java提供了八种基本数据类型
四种整数:byte、short、int、long
两种浮点数:double、float
字符型:char
布尔型:boolean
幂运算
使用方法Math.pow(a,b)计算a的b次方。pow方法定义在Java API的Math类中
数值型直接量
一个直接量是一个程序中直接出现的常量值
整型直接量默认是int型的,,为表示一个long型直接量,需要在其后追加字母L或l
默认情况下,整型直接量是一个十进制整数,要表示一个二进制整数直接量,使用0b或0B开头,表示一个八进制整数直接量,就用0开头,而要表示一个十六进制整数直接量,就用0x或0X开头
浮点型直接量带小数点,默认情况是double型的,可以通过在数字后加字母f或F表示该数为float型直接量
Java允许在数值直接量的两个数字之间使用下划线
数值类型转换
总可以将一个数值赋给支持更大数值范围类型的变量
类型转换是一种将一种数据类型的值转换成另一种数据类型的操作。将一个小范围类型的变量转换为大范围类型的变量称为拓宽类型,把大范围类型的变量转换为小范围类型的变量称为缩窄类型。缩窄类型必须显式完成。
目标类型放在括号里,紧跟其后的是要转换的变量名或值
类型转换不改变被转换的变量
Java中,x op= y形式的增强赋值表达式,执行为 x = (T)(x op y),T为x的类型
Chapter3 选择
单分支if语句,双分支if-else语句,嵌套if语句,多分支if-else语句,switch语句和条件表达句
浮点数比较
可以通过测试两个数的差距小于某个阈值,来比较他们是否已经足够接近,也就是对于一个非常小的值ε,如果|x-y|<ε,那么x与y非常接近。通常将ε设为10(-14)来比较两个double类型的值,而设为10(-7)来比较两个float类型的值
final double EPSILON = 1E-14;
double x = 1.0 -0.1 -0.1 -0.1 -0.1 -0.1;
if(Math.abs(x - 0.5) < EPSILON)
System.out.println(x + "is approximately 0.5");
产生随机数
Math.random()来获得一个0.0到1.0之间的随机double值,不包括1.0
(int)(Math.random()*10)返回一个随机的一位整数(即0到9之间的数)
(int)(Math.random()*2)返回0或1
对所有的程序都应该先编写少量代码然后测试,之后再添加更多代码,这个过程称为递进式开发和测试
逻辑运算符
!非
&& 与
|| 或
^ 异或(当且仅当两个操作数具有不同的布尔值时,两个布尔操作数的异或才为true)
德模佛定理用来简化表达式:
!(condition1 && condition2)和 !condition1 || !condition2 等价
!(condition1 || condition2)和 !condition1 && !condition2 等价
switch语句
switch(switch表达式){
case 1:语句组1;
break;
case 2:语句组2;
break;
……
default:默认情况下执行的语句组
}
- switch表达式必须能计算出一个char、byte、short、int或者String型值,并且必须总是用括号括住
- value1,……,valueN必须与switch表达式的值具有相同的数据类型,且value1,……,valueN都是常量表达式
条件表达式
boolean-expression ? expression1 : expression2;(布尔表达式?表达式1:表达式2)
如果布尔表达式的值为true,则条件表达式的结果为表达式expression1 ;否则,结果为expression12
符号?和:在条件表达式中同时出现。他们构成一种条件操作符,因为操作数有3个,所以称为三元操作符。
操作符优先级和结合规则
除赋值运算符外,所有二元操作符都是左结合,赋值操作符右结合
数学函数、字符和字符串
数学函数
Math类的方法分三类:三角函数方法、指数函数方法和服务方法,服务方法包括取整、求最大值、求最小值、求绝对值和随机方法
可以在任意程序中用Math.PI和Math.E表示常量PI和E(自然对数的底)
字符数据类型和操作
字符型直接量直接用单引号括住
字符串直接量必须括在双引号中。而字符直接量时括在单引号里的单个字符
Unicode和ASCII
将字符映射到它的二进制形式的过程称为编码
一个16位的Unicode码占两个字节,用以\u开头的4位十六进制数表示,范围"\u0000"到"\uFFFF"
ASCII码是表示所有大小写字母、数字、标点符号和控制字符的8位编码表
自增和自减也可以用到char类型上,这会得到该字符之前或之后的Unicode字符