JDK的安装
下载、安装
配置环境变量
- path:.;%JAVA_HOME%\bin;
- JAVA_HOME:JDK的安装目录
- classpath
JDK和JRE和JVM的区别
JAVA程序运行过程
- 编译javac :把java源文件编译成class字节码文件
- 运行java :运行class文件
标识符(给类、方法、变量起名)
- 以字母(采用Unicode字符集)、下划线、$ 开头
- 其余部分可以是:字母(采用Unicode字符集)、下划线、$、数字
- 不能为关键字
变量
局部变量
- 定义在方法内或语句块内。 从属于方法或语句块
- 使用之前,必须要手动初始化!
成员变量(实例变量/field)
- 定义在类里面、方法外面。 从属于对象
- 如果我们没有手动初始化成员变量,系统会自动初始化。初始化的规则如下:
- 数字:0,0.0 布尔:false char:\u0000 引用类型:null
静态变量(类变量)
- 定义在类里面、方法外面、使用static修饰。 从属于类
- 如果我们没有手动初始化静态变量,系统会自动初始化。初始化规则同成员变量。
数据类型
基本数据类型
- 数字
- 整数:byte(1个字节) short(2个字节) int(4个字节,整型常量默认该类型) long(8个字节)
- 浮点数:float(4个字节) double(8个字节,浮点常量默认为该类型)
- 字符 char(2个字节)
- 布尔 boolean(1位)
引用类型(4个字节)
- 数组
- 对象
- 接口
表达式
- 类型的自动提升
- 如果有long,结果就是long。
- 如果有double,结果就是double。
- 强制转型
运算符
- 赋值运算符(=)
- if(b=true) if(b) if(c=3) if(3==c)
- 算术运算符
- 关系运算符(==)
- 常见错误写法: 1<a<3 正确写法:1<a&&a<3
- 逻辑运算符
- 与&&, 或||, 非! 都是短路操作
- 与&,或| 3&4 非短路操作
- 位运算符
- &,|, <<(左移一位相当于乘以2),>>(右移一位相当于除以2)
- 3*4 最快的操作:3<<2
- 扩展运算符
- +=,-=,*=,/=,%=
- 三目运算符
- (布尔表达式)?A:B
控制语句
- 顺序结构
- 选择结构
- If、If else、If else if … else
- switch 多值选择 表达式:int或char/short/byte, 枚举 建议每个case都加break
- 循环结构
- while 先判断后执行
- for
- do while 先执行后判断
break问题
- break: 强制终止整个循环
- continue:结束本次循环,继续下一次!
面向对象基础
- 对象的进化史
- 基本数据类型阶段 数据少 无数据管理时代
- 数组 数据多了,将同类型的数据放到一起 弱管理
- 结构体 数据多了,数据复杂了。将不同类型的数据放到一起 强管理
- 对象 数据多了、类型复杂了、行为复杂了。将不同类型的数据放到一起 超强管理
- 对象和类
- 对象是具体的,类是抽象的。 类也是一个模版,通过类这个模版我们也可以new对象。
定义类
public class 类名 { // 类名首字母大写
//属性
private 数据类型 属性名; //建议增加相应的getter、setter方法
//方法
//构造方法 // 建议无参构造方法都带上
}
构造方法
- 方法名必须跟类名保持一致
- 无返回类型
- 通过new来调用
- 无参构造器问题:
- 如果我们没有手动定义构造器,系统会自动为我们添加一个无参的构造器
- 如果我们自己定义了构造器,系统就不会为我们添加无参构造器
- 构造方法的第一句总是:super,即调用直接父类的构造方法。
- 有继承关系的构造方法调用的顺序
方法的重载(Overload)
两同(同一个类、同一个方法名)三不同(参数列表不同:类型、个数、顺序)
返回值不同,构成重载吗? No
形参名称不同,构成重在吗? No
this:
普通方法中,调用本方法的对象。
构造方法中,正要初始化的对象。
还可以用来,调用其他的构造方法
super:
static:
用它修饰的变量和方法,就变成了静态变量和静态方法。从属于类。通过类名即可调用。实际存储于方法区中。
package:
package必须位于非注释行第一句。
包名:域名倒着写
import:
引入外部的类
import static :导入类的静态属性
final:
修饰变量:常量(命名规范:全部大写,多个单词之间通过下划线隔开)
修饰方法:不能被重写
修饰类: 不能被继承
面向对象的三大特征
封装
通过private、default 、protected、public关键字实现属性或方法的封装。
“高内聚,低耦合”
继承
通过extends 。两个好处:
- 代码重用
- 通过继承实现对现实世界更加准确的建模
类只有单继承,没有像C++那样的多继承
多态(polymorphism)
三个必要条件:继承、方法的重写、父类引用指向子类对象
动态绑定、静态绑定
- 方法重写(Override)的要点
=:方法名保持一致
>=: 子类权限修饰符可以大于等于父类的。
<=, <=: 子类的返回值类型小于等于父类的类型。 子类声明异常类型不能超过父类的类型。
- Object类
- 是我们所有类的根基类
- toString
- equals、hashcode
- wait、notify、notifyAll (线程使用)
抽象类 abstract
- 包含抽象方法的类,一定是抽象类。(抽象方法必须被子类重写)
- 抽象类不能被new。
- 抽象类可以包含:普通方法、成员变量、构造方法。
接口
- interface
- 类实现接口:implements 可以实现多个接口
- 接口可以多继承
- 接口定义的是一组规范!实现现实世界中这样的逻辑::如果你是…则必须能…
内存机制
- 栈
- 存放局部变量
- 不可以被多个线程共享
- 空间连续,速度快
- 堆
- 存放对象
- 可以被多个线程共享
- 空间不连续,速度慢。但是灵活
- 方法区
- 存放类的信息:代码、静态变量、字符串常量等
- 可以被多个线程共享
- 空间不连续,速度慢。但是灵活
垃圾回收器(GC Garbage Collection)
- 程序员不能调用垃圾回收器。但是可以通过System.gc()建议回收。
- finallize:属于Object的方法,一般也不用去调
递归算法
- 递归头:什么时候不调用自己
- 递归体:什么时候调用自己
异常机制
- try catch(先小后大) finally
- 声明抛出异常:throws
- 手动抛出异常:throw
- 自定义异常
- extends Exception或者他的子类
数组
- 长度固定,不可变
- 所有元素的类型一致
- 元素类型可以为任意类型
- 通过下标来引用相关元素。下标不能超过length-1
- 数组也是对象。数组的元素可以看做对象的成员变量。所以,成员变量自动初始化的规则也适用于数组元素。
- 多维数组:数组的元素是数组
- 数组的三种初始化的方式:
- 动态初始化
- 静态初始化: int[] a = {2,3,4}
- 默认初始化
- Arrays类:包含了对数组元素的排序(注意Comparable接口)、查找。
- 算法:
- 冒泡排序
- 二分法
容器
- Collection
- List(有序,可重复)
- ArrayList 底层用数组实现。线程不安全,效率高
- LinkedList:底层用双向链表实现。线程不安全,效率高
- Vector:底层用数组实现。线程安全,效率低
- Set(无序,不可重复)
- HashSet(内部是使用HashMap实现)
- List(有序,可重复)
- Map
- 采用“key-value”来存储我们数据。
- HashMap 线程不安全,效率高
- HashTable线程安全,效率低
- Iterator
- 通过他,可以实现遍历容器中元素
- 泛型
- Collections工具类
常用类
- 包装类
- 实现了基本数据类型和对象的互相转化。
- 自动装箱、自动拆箱
- String/StringBuilder/StringBuffer
- String:不可变字符序列
- StringBuilder:可变字符序列,线程不安全
- StringBuffer:可变字符序列,线程安全
- 时间:Date、DateFormat、Calendar
- Date:使用毫秒数来表示我们的时间概念。
- DateFormat:实现Date对象跟String对象的互相转化(根据指定格式互相转化)
- Calendar:日期类。实现了将人的日期的概念跟Date的互相转化
- File
- 代表文件或者目录的一个抽象
- Math
- 数学类
- 枚举
- 如果我们要定义一组常量,建议使用枚举。
- 不要学习和使用枚举的高级特性。
IO流
- InputStream
- FileInputStream
- ByteArrayInputStream
- ObjectInputStream (对象的序列化。实现接口Serializable)
- DataInputStream
- BufferedInputStream
- OutputStream
- FileoutputStream
- ByteArrayOutputStream
- ObjectOutputStream
- DataOutputStream
- PrintStream
- BufferedOutputStream
- Reader
- FileReader
- InputStreamReader:转换流:将字节流转化成字符流
- BufferedReader
- Writer
- FileWriter
- OutputStreamWriter:转换流:将字节流转化成字符流
- BufferedWriter
多线程
- 定义多线程类的两种方式:
- Extends Thread
- Implements Runnalbe(建议使用这种方式)
- 线程的状态:
- 新生状态 new
- 就绪状态(调用start方法后)
- 运行状态
- 阻塞状态
- sleep:不会释放持有的对象锁
- join:等待另一个线程执行完成
- wait:会释放持有的对象锁
- synchronized:运行同步代码,但是没有获得指定对象的锁,于是进入指定对象的锁池等待。
- 终止
- 不建议使用:stop、destroy直接终止。
- 建议通过boolean变量,正常终止线程运行。
- 线程的优先级
- 1-10. 默认是5 优先级可以设置
- 优先级低只是意味着调用的概率低,并不是不被调用。
- 资源同步
- synchronized修饰方法、语句块
- 死锁
- 建议不要同时持有多个对象的锁!
- “生产者-消费者”模式
网络编程
- InetAddress:封装了IP和DNS,没有端口。
- InetSocketAddress:封装了IP和端口(端口使用2个字节标识,1024以下的不要使用)
- URL:代表一个网络的资源
- openStream
- TCP通讯
- 特点:面向连接、安全、稳定。
- ServerSocket
- Socket
- UDP通信
- 特点:不面向连接。可能会丢数据。发送数据效率高。
- DatagramPacket:数据打包
- DategramSocket:数据发送和接收
GUI编程(AWT/SWING/SWT)
- 组件
- Component(普通组件、容器)
- 布局管理器
- FlowLayout
- BorderLayout
- CardLayout
- GridLayout
- 事件
- 事件对象:KeyEvent、MouseEvent….
- 事件源对象:组件
- 监听器(一般采用匿名内部类来定义):
- KeyListener KeyAdapter
- WindowListener WindowAdapter
- MouseListener MouseAdapter
- MouseMotionListener MouseMotionAdapter
- 菜单制作
- MenuBar
- Menu
- MemuItem
- CheckBoxMenuItem
- MenuShortCut 定义菜单项的快捷键
多媒体编程
- 字体Font
- Graphics
- 做音视频处理:JMF