Java基础知识
对应《疯狂Java讲义(第5版)》1-3 ,4.1-4.4章节
基础概念
JVM(Java Virtual Machine),即java虚拟机,在执行字节码时,把字节码解释成具体平台上的机器指令执行。
JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)
JDK(Java Development Kit)是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)
执行方法
编译型语言
对于编译型语言,开发完成以后需要将所有的源代码都转换成可执行程序,比如 Windows 下的.exe文件,可执行程序里面包含的就是机器码。只要我们拥有可执行程序,就可以随时运行,不用再重新编译了,也就是“一次编译,无限次运行”。
如C/C++、Objective-C、Swift、kotlin
解释型语言
对于解释型语言,每次执行程序都需要一边转换一边执行,用到哪些源代码就将哪些源代码转换成机器码,用不到的不进行任何处理。
如JavaScript、Ruby、Python
先解释,后编译
Java需要先经过编译步骤,将源代码编译为与平台无关的字节码(.class文件),再由JVM解释执行相应的字节码
编译Java程序
1 |
|
-d destdir
指定编译生成字节码文件的存放路径,srcFile
为Java源文件的位置。
运行Java程序
1 |
|
交互式开发工具
jshell
文档注释
javadoc
结构化程序设计
三种基本结构:顺序结构、选择结构、循环结构
主要原则:自顶向下,逐步求精,模块化,面向功能
最小的设计单元为函数
局限性: ①设计不够直观,与人类思维不一致,需保客观世界分解为功能
②适应性差,可扩展性不强,自顶向下修改模块结构,维护成本高
面向对象程序设计
基本思想:使用类、对象、继承、封装、消息等基本概念,尽可能运用人类的自然思维方式,从客观存在的事物出发构造软件系统,把它们抽象的表示为类,作为系统的基本构成单元
类与对象
类是对象的抽象,对象是类的实例
类之间的结构关系:一般➡️特殊(继承), 整体➡️部分结构(组装)
面向对象的三种基本特性:继承、封装、多态
继承:子类继承父类,作为特殊的父类,将直接获得父类的属性和方法。
封装:将对象的实现细节隐藏起来,通过一些公用方法暴露对象功能
多态:子类对象可以直接赋给父类变量,但运行时仍然表现出子类的行为特征
抽象:忽略一个主题中与当前目标无关的方面,以便更充分的注意与当前目标有关的方面
强类型语言
也称为强类型定义语言。Java 是一种总是强制类型定义的语言
①要求变量的使用要严格符合定义
②所有变量都必须先声明后使用
可以在编译过程中发现程序的错误,保证程序更加健壮。
标识符规则
字母、下划线(_)、美元符($)开头,后可跟数字、字母、下划线(_)、美元符($)
Java严格区分大小写
所有关键字均小写
Java关键字
关键字 | 大致含义 |
---|---|
abstract | 表明类或者成员方法具有抽象属性 |
assert | 断言,用来进行程序调试 |
boolean | 基本数据类型之一,声明布尔类型的关键字 |
break | 提前跳出一个块 |
byte | 基本数据类型之一,字节类型 |
case | 用在 switch 语句之中,表示其中的一个分支 |
catch | 用在异常处理中,用来捕捉异常 |
char | 基本数据类型之一,字符类型 |
class | 声明一个类 |
const | 保留关键字,没有具体含义 |
continue | 回到一个块的开始处 |
default | 默认,例如,用在 switch 语句中,表明一个默认的分支 |
do | 用在 do-while 循环结构中 |
double | 基本数据类型之一,双精度浮点数类型 |
else | 用在条件语句中,表明当条件不成立时的分支 |
enum | 枚举 |
extends | 表明一个类型是另一个类型的子类型,这里常见的类型有类和接口 |
final | 表示不可变,最终的 |
finally | 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块 |
float | 基本数据类型之一,单精度浮点数类型 |
for | 一种循环结构的引导词 |
goto | 保留关键字,没有具体含义 |
if | 条件语句的引导词 |
implements | 表明一个类实现了给定的接口 |
import | 表明要访问指定的类或包 |
instanceof | 用来测试一个对象是否是指定类型的实例对象 |
int | 基本数据类型之一,整数类型 |
interface | 接口 |
long | 基本数据类型之一,长整数类型 |
native | 用来声明一个方法是由与计算机相关的语言(如 C/C++语言)实现的 |
new | 用来创建新实例对象 |
package | 包 |
private | 一种访问控制方式:私用模式 |
protected | 一种访问控制方式:保护模式 |
public | 一种访问控制方式:共用模式 |
return | 从成员方法中返回数据 |
short | 基本数据类型之一,短整数类型 |
static | 表明具有静态属性 |
strictfp | 用来声明 FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754 算术规范 |
super | 表明当前对象的父类型的引用或者父类型的构造方法 |
switch | 分支语句结构的引导词 |
synchronized | 表明一段代码需要同步执行 |
this | 指向当前实例对象的引用 |
throw | 抛出一个异常 |
throws | 声明在当前定义的成员方法中所有需要抛出的异常 |
transient | 声明不用序列化的成员域 |
try | 尝试一个可能抛出异常的程序块 |
void | 声明当前成员方法没有返回值 |
volatile | 表明两个或者多个变量必须同步地发生变化 |
while | 用在循环结构中 |
null | 引用数据类型默认初始值 |
数据类型分类
基本类型
boolean 和数值类型(byte、short、int、long、char、float、double)
引用类型
类似于指针,包括类、接口、数组、空类型(null)
整数常量默认为int型,如果超出int范围,需加L,如
long bigValue = 9223372036854775807L
二进制以
0b
开头,八进制以0
开头,十六进制以0x
开头,如int octalValue = 013
,十进制值为11浮点型默认为double型,加f表示float型,如
5.12f
科学计数法形式 5.12e2
特殊浮点型 Float,Double 如
Float.NaN
、Double.NEGATIVE_INFINITY
、Float.POSITIVE_INFINITY
正数除以0.0得到正无穷大,负数除以0.0得到负无穷大,0除以0.0或负数开方为非数
数值中可使用下划线分隔,如
3.14_15_92_65_36
动态类型 var
var定义的变量类型由编译器自动推断
类型转换
byte➡️short➡️int➡️long➡️float➡️double
char➡️int
0~65535的int可自动转换为char类型 ‘\u0000’~‘\uFFFF’
自动类型转换
表数范围小的可以向表数范围大的自动转换
基本类型和字符串连接时转为字符串型
强制类型转换
(targetType)value
整数直接截断高位,可能由正变负数
小数直接截断小数部分
表达式类型自动提升
- byte、short、char类型将自动提升为int
- 算数表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型
直接量与常量池
数值类型、char(’a’、’\u0061’)、Stirng(”Crazy Java”)、null型
编译时就能确定值
Java会使用(constant pool)来缓存第一次使用的直接量
运算符
自加(++):位置在左, 位置在右
右移(>> , >>>):>> 符号位代替高位,>>> 0代替高位
运算符的优先级
运算符 | |
---|---|
括号 分隔符 | ()、[ ]、. |
非、正,负号 | !、+(正)、-(负) |
自增,自减,取反 | ++、–、~ |
强制类型转换符 | (type) |
乘,除,取余 | *、/、% |
加,减 | +、- |
移位运算 | <<、>>、>>> |
大小关系 | <、<=、>、>=、instanceof |
相等关系 | ==、!= |
按位与 | & |
按位异或(在java中,这不是幂次方的符号) | ^ |
按位或 | | |
逻辑与(短路与) | && |
逻辑或(短路或) | || |
条件运算(三目运算) | ? : |
赋值运算 | =、+=、-=、*=、/=、%= |
位赋值运算 | &=、|=、^=、~=、<<=、>>=、>>>= |
循环控制
可以使用标签,直接跳出外层循环
1 |
|
1 |
|
foreach循环
遍历数组或集合,不能改变数组元素的值
1 |
|