语法部分
- java的技术结构:
A. J2SE---标准版
B. J2EE---企业版
C. J2ME---移动版
- java的跨平台---JVM
- JVM是Java语言能够跨平台的前提。
- JVM不是跨平台
- JRE包含JVM,JDK包含JRE
- 入门程序
- 编译---将代码翻译成字节码的过程
- 类名与Java文件名不对应,class文件名和类名对应
- 每一个类或者接口在编译完成之后必然产生一个class文件
- javac -d 路径 Java文件---编译命令
- java -classpath 路径 class文件名
---指定类的运行路径(1.7之后不强制要求)
- 关键字
A. 53个,51个在用,2个没用---goto,const
B. 都是小写(例:String是标识符)
- 标识符
- 命名规则:字母(不只是英文字母)、数字、‘_’、‘$’
- 数组不能开头
- 不能用关键字
- 见名知意
- 驼峰命名法
- 注释
a) 单行、多行、文档
b) 作用:解释说明、调试排错
- 计算机常量
a) 整数、小数、字符、字符串、布尔、空
b) 字面量
- 进制
a) 二---0b、八---0、十、十六---0x(不区分大小写)
b) 进制的转换
- 变量
a) 变量必须先定义后使用
b) 变量先赋值后使用
- 数据类型及其转换
a) 基本数据类型
- 数值型---全部都是有符号
a) 整数型
byte - 1个字节 --- -128~127
short - 2 --- -32768~32767
int - 4 --- -2^16-2^16
long - 8 --- -2^63-2^63 - 需要L作为结尾
b) 浮点型
float---4字节
-3.4*1038~3.4*1038(-2^128~-2^149~2^128)
需要以f作为结尾
double--- 8 -10308~10308 (-21024~21024)
---小数默认为double---结尾可以添加D
---小数在计算机中无法精确存储
- 字符型
a) char---2字节 0~65535(可以认为无符号整形)
- 布尔型
a) boolean---true/false
(不同系统不同版本大小不确定)(JDK1.7之后4字节)
b) 引用数据类型---类、接口、数组
c) 数据类型的转换
1.自动类型转换---小转大,整转小
2.强制类型转换---大转小,小转整
- 运算符
a) 算数、赋值、比较、逻辑、位、三元
b) 小类型和大类型符合和运算的时候,结果一定是大类型
c) 同一类型运算的时候,结果一定是这个类型
d) byte/short在运算的时候会自动提升为int
byte = 1+2;(正确)b = b + 1;(不行)
e) 整数除以0---算数异常,小数除以0---无穷大,0/0=NaN
Nan和任何数都不想等,和本身也不想等
f) %可以针对任何数字,小数也可以,符号看第一位
g) ++/-- 放在变量前后的位置不同,计算顺序也不同;byte和short类型可以参与++/--运算,结果类型不变
h) 除了=以外,其他的赋值运算都要求变量必须先有值
i) byte和short可以参与赋值运算
j) instanceof---判断对象是否是类的实例---对象对应实际类只要是后边的类或者接口的子类就可以
k) 记住^的运算规则
l) &&和||的短路特性,&和&&的区别。
(&可以是位运算;短路特性)
m) 位运算符只能针对于整数,操作的是数据的补码---计算机中存储的是补码,正数原反补三码一致,负数反码是原码最高位不变其余为取反;补码数反码+1
n) 位运算中的^可以用于交换数据
- o) 三元运算在运算完成之后必须有结果。前后两个表达式的值要相容
- 流程控制
a) 判断结构---if,if-else;if-else-if
b) 选择结构
---switch-case---byte/short/char/int,JDK1.7以后支持String
break表示终止当前的选择语句,当case之间只要缺少了一个break,case之间的顺序会对结果产生影响
c) 循环结构---while、do-while,for
- do-while循环体至少执行一次
- 不确定次数或者变化不规律的情况下常用while
- 确定次数或者变化比较规律,常用for
d) break和continue
- break---用于选择或者是循环结构中,表示终止当前一层结构。
- continue---用于循环结构,跳出一层循环继续下次循环
- break和continue的标号形式
- 数组
a) 是一个大小固定的存储一组同一类型的数据的容器
b) 数组的排序---冒泡、选择---时间复杂度都是O(n2)
c) 元素的查找---折半查找---时间复杂度是O(log2n)
d) 数组反转
e) 数组扩容---复制
- 方法/函数
a) 方法有具体返回值类型,必须确保这个方法有返回值
b) 任何实体方法中都可以写return语句
c) 方法重载---必须发生在一个类中,方法名一致而参数列表不同,和修饰符,返回值类型、异常都没有关系,是一个编译时多态
d) 方法重写---继承,方法签名必须一致,两等两小一大,是一个运行时多态
e) 递归---方法在调用自己本身,实际上就是在调用一个方法---控制递归结束的条件
f) 作用:
- 复用性;
- 使代码结构更加清晰
- 便于模块化开发
- 面向对象本与面向过程
面向对象
a) 面向过程注重的是过程,强调的是动作。面对对象寻找的是对象
- 类和对象的关系
a) 类是对象的抽取
b) 对象是类的实例化
- 构造函数
a) 与类同名,没有返回值类型
b) 允许重载,但是不允许重写---因为不能被继承
c) 创建对象
d) 如果一个类没有手动指定构造函数,这个时候JVM在编译的时候会自动添加一个无参的构造函数。
- this
a) 代表了当前对象的引用---虚拟对象(Java中所有非静态都是通过对象引用)
b) this在本类中用于调用本类中的方法和属性(只要子类没有重写方法,就可以在子类中通过this调用父类中能够继承过来的方法)
c) this语句---在本类的构造函数中去调用本类的其他构造函数。this语句必须放在首行
- 成员变量和局部变量
a) 定义位置---成员变量类内方法外;局部变量在方法内
b) 作用域---成员变量是整个类;局部在方法或者语句内
c) 存储位置---成员变量在堆内存中,并且自动赋予初始值;局部在栈中
d) 生命周期---成员变量随着对象的创建而加载到堆中,随着对象的回收而被销毁;局部变量在方法或者语句执行完成之后立即移除
- 构造代码块
a) 在类内用{}括起来的代码---在创建对象的时候在构造函数之前执行
b) 作用:在对象创建之前完成一些初始化的操作
- 局部代码块
a) 定义在方法或者与局内用{}括起来的代码
b) 作用:限制变量的生命周期来提高内存的利用率,
- 匿名对象
a) 没有名字的对象---这个对象只存在堆内存中,在栈内存中没有引用
b) 只能使用一次---匿名对象可以作为参数传递
- 面向对象的特征
封装、继承、多态
- 封装
a) 函数、属性私有化(类的封装)、内部类
b) 复用性,安全性
- 继承
a) 在Java中实行的是单继承---extends
b) 单继承和多继承的比较
c) 复用性、安全性
d) 子类无法继承:private、构造函数、代码块
- 多态
a) 编译时多态---函数的重载
b) 运行时多态---函数的重写,向上造型--基于继承的
行为多态---重载和重写
对象多态---向上造型
c) 多态对函数重写的限制和理解
d) 灵活性,配合反射实现解耦
- 权限修饰符
a) public protected private 默认
b) 最大范围public,最小private
- super
a) 代表父类对象的引用
b) 在子类中用super调用父类中的方法或者属性
c) super语句---每一个子类构造函数中都直接或者间接的有一个super语句,在子类中通过super语句来调用父类中对用形式的构造函数---super语句必须放在构造函数的首行
- static
a) 静态变量(类变量)---在类加载的时候加载到了方法区中的静态区,并且在静态区中自动赋予默认值。先于对象存在,所以静态变量可以不通过对象而通过类名调用,也可以利用对象调用;所有的对象共享这个静态变量---减少使用静态变量
b) 静态方法(类方法)---随着类的加载而加载到方法区中的静态区,只是存储在静态区,在调用的时候去栈内存中执行;静态方法先于对象而存在,习惯上通过类名来调用,在静态方法中不允许直接使用本类中的非静态方法和非静态属性;可以重载,可以被继承不可被重写,然而在父子类中允许方法签名完全一致的静态方法---如果父子类中存在方法签名完全一致的方法,只要一个是静态,另一个必须也是静态
c) 静态代码块---再类加载的时候执行---只执行一次---执行顺序---父类静态->子类静态->父类非静态->子类非静态
- final
a) 常量---直接之不可变---成员常量只要在对象创建完成之前给值即可;静态常量需要在类加载完成之前给值
b) 最终方法---可以重载,可以继承但是不能被重写
c) 最终类---不可被继承---最终类不能用匿名内部类
- abstract
a) 修饰类或者方法
b) 抽象类---不可以创建对象,但是有构造函数(构造函数可以私有化);可以定义任何的方法和属性,还可以定义抽象方法---可以继承和实现接口
c) 抽象方法---没有方法体;抽象方法之间可以重载,也可以和实体方法之间构成重载;static、final(不允许方法重写)、private(不能继承)不能修饰抽象方法。;如果类中存在了用默认权限修饰符修饰的抽象方法,那么要求子类必须同包。
- 接口
a) 用interface定义---在Java中支持的是单继承、多实现---以类作为主体单位计算。
b) 接口之间允许多继承---出现多继承的问题(会出现方法调用混乱度)
c) 接口中只允许存在抽象方法(JDK1.7及其以前)---接口中的方法默认使用而且只能使用public、abstract修饰
d) 接口中可以定义属性---默认且只能使用 public static final修饰
e) 一个类在实现接口之后必须实现接口中的所有的抽象方法,抽象类除外
f) 作用:
- 统一了结构;
- 配合反射实现解耦,便于模块化开发
- 内部类
a) 方法、成员、静态、匿名内部类
b) 除了静态内部类以外,其他内部类中均不可以定义静态变量和静态方法,但是都可以定义静态常量
c) 注意成员内部类和静态内部类在类外创建对象的方式
d) 方法内部类在使用当前方法中的数据的时候,要求这个数据是一个常量
e) 匿名内部类定义在方法中的时候使用规则和方法内部类一致;定义在类内的时候和成员内部类使用规则一致
f) 匿名内部类本质上是继承了对应的类或者实现了对应的接口---最终类不存在匿名内部类的形式
g) 在一个函数中如果一段代码需要重复使用而这段代码又独属于当前函数,这个时候可以把这段代码封装到一个方法内部类中---限制某些功能的适用范围,提高代码的复用性
- 包
a) 声明包用package,导入包用import
b) 一个Java文件中只允许存在 一个声明包的语句,并且package语句只能放在Java文件的第一行
c) 需要导入一个包下的多个类,可以用*做通配符---导入这个包而不包括包下的所有类
d) 包起了路径分隔的作用
- 垃圾分代回收机制
a) 针对的是堆内存
b) 将堆内存分为了两块:新生代(伊甸园区和幸存区(不是均分))和老生代(8:1:1)
c) 对象移动过程:从伊甸园区开始->幸存区->老生代
d) 幸存区的回收频率略低于伊甸园区,老生代的回收频率是远远低于新生代
e) 老生袋中的对象产生回收会导致程序的卡顿甚至崩溃
f) 初代回收,完全回收
g) 在Java中,gc的启动与回收不由程序员手动控制,最多可以起一个通知的作用---finalize()、System.gc()
API
- Object
a) 顶级父类---是Java中唯一一个没有父类的类
b) getClass()---获取对象的运行时类型/实际类型
c) toString()---在打印对象的时候,默认调用对象的该方法---底层默认打印对象的地址
d) equals()---比较两个对象时都一致---底层默认是比较两个对象的地址是否一致
e) hashCode()---获取对象的哈希码---哈希码是一个32位的二进制,可以认为是对象的唯一标识---在重写的时候,最基本的原则是equals()值为true的时候,要求哈希码必须一致
- String
a) 代表字符串的类
b) 字符串本身是一个常量,定义好不可改变;字符串是被共享的、
c) 字符串在Java底层以字符数组的形式存储,所以String中的许多方法是将字符串以字符数组的形式来操作的。
d) String中提供了一系列的操作而不改变原字符串的方法
e) 不同方式创建对象的个数不同
f) +拼接运算实际上底层是调用了StringBuilder中的append方法---当拼接多个字符串的时候,最好使用StringBuilder
g) 统计字符个数、提取数字、获取字符的出现位置
- Pattern
a) 用于指定规则进行匹配或者校验筛选
b) 练习:邮箱校验,密码校验,叠字去重、统计字符个数
- 包装类
a) int - Integer char - Character
b) 包装类的构造函数
c) 封箱---将基本类型转化为对应的引用类型的过程
d) 自动封箱---将基本类型直接复制给对应的引用类型---调用了对象类中的valueOf方法(JDK1.5出现)
e) 自动拆箱---将引用类型直接复制给基本类型的过程---调用了对应对象身上的***Value方法
f) Byte和Short在底层是以Integer形式存储
g) 缓存类---当值的范围在-128~127之间的时候存的是常量池中地址,如果超过这个范围,则比较的是堆内存中的地址
- 数学类
a) Math---构造函数私有化,提供了一些静态方法来完成基本的运算,运算的是基本类型
b) BigDecimal---用于精确运算的类,要求参数必须以字符串形式传入
- 日期类
a) Date/Calender---重点Date
b) 日期格式的转换---ParseException
- 异常
a) 是Java中一套用于反馈和处理问题的机制
b) Throwable---异常的顶级父类---Error和Exception
c) Error表示错误---一旦出现无法处理
d) Exception
- 编译时异常---出现之后要求处理(捕获和抛出)
- 运行时异常---编译时期无错但是运行会报错---语法无错---出现之后可以处理也可以不处理---RuntimeException
e) 自定义异常
f) 捕获:单个;统一;分组(JDK1.7)
g) try-catch-finally---代码块的执行和返回值问题,
- Collection
a) 是一个大小不定的用于存储一组数据的容器,Collection是集合的顶级接口---List,Set,Queue
b) 由于泛型的限制,集合中只能存储引用类型(对象)
c) List---列表---元素有序可重复
- ArrayList---基于数组,默认初始容量为10,每次扩容一半(右移运算),内存空间连续,便于查询而不便于增删;是一个线程不安全的列表
- LinkedList---基于链表,内存空间是不连续的;便于增删但是不便于查询;是一个线程不安全的列表
- Vector---向量---基于数组,内存空间也是连续的;默认初始容量是10,每次扩容一倍,便于查询而不便于增删
- Stack---栈---先进后出---入栈,出栈
练习:用数组实现简易版ArrayList
- Set---元素无序不可重复
HashSet---默认容量16,加载因子0.75f,每次扩容一倍
- Queue---队列---先进先出
- 迭代器
a) Iterator---取代了Enumeration
b) 本质上是通过指针的移动来获取相应的元素
c) 增强for循环本质上是一个迭代遍历的过程---一个对象要想用foreach语句来遍历,要求这个对象对应的类必须实现Iterable接口---JDK1.5出现
d) 迭代过程中不允许改变原集合
- 比较器
a) Comparator---重写compare方法,将比较规则写到compare方法中,该方法会返回一个int类型的值,根据这个值的正负来确定参数的大小---如果返回一个整数,说明参数1大于参数2;反之说明参数2大于参数1
b) 在对元素排序的时候,如果没有指定比较规则,那么要求这个对象对应的类必须实现Comparable接口,重写compareTo方法,在排序的时候自动调用这个compareTo方法实现所谓自然排序
- 泛型
a) 参数化类型---JDK1.5开始
b) 泛型的擦除---发生在编译期
c) 泛型的继承---泛型的上限和下限
d) 可以为一个类或者方法设置本类或者本方法中独有的泛型类型---泛型在定义的时候只要符合标识符的命名规则即可---习惯上用一个大写字母来表示
- Map
a) 以键值对形式来存储元素---键唯一,值可以重复---一个键必须对应一个值---在存储的时候不保证元素的存入顺序
b) HashMap---允许一个键为null,允许多个值为null,默认初始容量为16,加载因子是0.75f,每次扩容一倍;是一个异步式线程不安全的映射
c) Hashtable---不允许键值为null;默认初始容量是11,加载因子是0.75f;是一个同步式线程安全的映射
d) 掌握一个遍历Map的方式
e) 练习:输入几组键值对,键相同时值求和---要求输出有序
- File
a) 代表文件或者目录的类---file所代表的文件或者目录在计算机中不一定真实存在
b) 创建、删除、获取、设置、判断
c) 练习:删除文件、统计文件个数、提取文件
内存
- 栈内存---计算---指方法或者语句的执行
- 堆内存---存储对象,会对对象的属性进行自动的初始化
- 方法区---只要存入方法区就不再移除---存储类信息
静态常量池---存储类信息
静态区---存储静态信息、
运行时常量池---存储计算机常量以及程序中自定义的常量
- 本地方法栈---存储本地方法,一般是c/c++
- 寄存器---任务调度,节点管理以及程序计数