在系统配置中新建
变量名:“JAVA_HOME”
变量值:“C:\Program Files (x86)\Java\jdk1.6.0_21”(jdk安装路径)
在系统配置中新建
变量名:“CLASSPATH”
变量值:"."
在系统变量中编辑Path变量
添加"%JAVA_HOME%\bin;" //注意:加分号结束
测试:运行–> cmd -->java/ javac命令回车,看到配置信息为正确(java -version查看jdk版本)
提示:“不是内部或外部指令”为失败
一、HelloWorld:Class–>班级 Java中Class–>类
二、编译、运行:
三、类的基本阐述:
四、Package(包):
五、编码规范:
良好的注释习惯:
I. 注释不参与编译。
II. 单行注释: //单行
III. 多行注释: /* 多行 /
IV. 文档注释: /* 文档 */ javadoc指令生成外部说明文档
例:javadoc -d . 源文件名称.java
良好的标识符命名规范:
I. 硬性:
1). 数字、字母、_ 、$ ,数字不能开头。
2). 不能与关键字、保留字重名。
II. 软性:(约定俗成)
1). 望文生义、见名知义。
2). 类名可以由一个或多个单词组成,每个单词的首字母大写 (Pasacl帕斯卡命名法)
3). 函数、变量由一个或多个单词组成,首单词首字母小写,拼接 词首字母大写(Camel驼峰命名方法)
4). 包名全小写,只能用特殊字符" . “,并且不能以”.“开头或结尾。
5). 常量全大写,多个单词通过”_"拼接。
bit Byte KB MB GB TB PB EB ZB YB BB NB CB XB
六、变量:
一个存储空间的表示,也是存储数据的基本单元。
语法:
I. 声明:数据类型 变量名;
赋值:变量名 = 值;
II. 声明并赋值:数据类型 变量名 = 值;
III. 同时声明多个变量:数据类型 名1,名2,名3=值;
七、数据类型:HotSpot 1.3.1 iadd isub imul idiv badd bsub
II. 小数(浮点):近似值(1bit符号位、8bits指数位、23bits尾数位)
1). float 4个字节 1.4E-45 ~ 3.4E38 add F IEEE754标准
2). double 8个字节 4.9E324 ~ 1.7E308
III. 字符:无符号数(取值范围从0 ~ 65535)
1). char 2个字节 \u0000 ~ \uFFFF ‘A’ 65 ‘\u0041’ ASCII编码
2). 转义字符: \t \n \ ’ "
IV. 布尔:
1). boolean 取值范围:true / false
八、类型转换:
自动类型转换:
I. 两种类型相互兼容。
II. 目标类型大于源类型。
强制类型转换:
I. 整数长度合适,数据完整。
II. 整数长度不适,数据截断。
III. 小数强转整数,失去精度,如,整数长度不适,则再次数据截断。
IV. 字符整数互转,数据完整,如,整数为负数,则转型成"?"
V. boolean的取值只有true、false,无法转换。
九、表达式:
概念:使用运算符连接的变量或字面值,并可以得到一个最终结果。
自动类型提升:
I. 两个操作数,有一个为double,其结果提升为double。
II. 如果没有double,有一个为float,其结果提升为float。
III. 如果没有float,有一个为long,其结果提升为long。
IV. 如果没有long,有一个为int,其结果提升为int。
V. 如果没有int,也会自动提升为int。
VI. 任何类型与String相加(+)时,实为拼接,则提升为String。
十、运算符:
十一、控制台输入:
十二、选择结构:
基本if选择结构:
if(布尔表达式){
//表达式结果为true,则执行此代码块
}
if else选择结构:
if(布尔表达式){ //程序猿、程序媛
//表达式结果为true,则执行此代码块
}else{
//否则,执行此代码块
}
多重if选择结构:
if(布尔表达式){
}else if(布尔表达式){
}else if(布尔表达式){
}else{}
注:相互排斥,当有一个条件被满足时,其他均不再执行。适用于区 间判断,保证升降的书写顺序。
十三、分支结构:
switch分支:
switch(byte、short、int、char){ //JDK7之后可以判断String
case 1:
//执行代码
break;
case N:
//执行代码
break;
default:
//执行代码
break;
}
break关键字:中断、中止、跳出当前swithc分支结构。
注:适用于等值判断,所有case的选项不可重复,并不会在满足某个 选项后自动跳出switch,必须手动添加break中断。
十四、局部变量:
一、循环:
II. do while循环:
do{
}while(布尔表达式);
特点:先执行,再判断。
应用场景:循环次数不明确。
例:先完成作业,再检查结果。
III. for循环【重点】:
for(1.初始部分; 2.循环条件; 4.迭代部分){
//3.循环操作
}
特点:先判断,再执行。
应用场景:循环次数明确。
例:阶乘。
二、流程控制语句:
三、嵌套循环:
一、概念:实现特定功能一段代码,可反复使用。
二、语法:
public static 返回值类型 函数名称( 形式参数列表 ){
//函数主体
[ return value; ] //返回值
}
三、组成:
四、调用:
五、总结:
六、递归:
一、概念:一组连续的存储空间,存储多个相同数据类型的值。
二、语法:
数据类型[] 数组名; //声明数组
数组名 = new 数据类型[ 长度 ]; //分配空间
数据类型[] 数组名 = new 数据类型[ 长度 ]; //声明并分配空间
数据类型[] 数组名 = new 数据类型[]{值1,值2,值3,…} //显示初始化
数据类型[] 数组名 = {值1,值2,值3,…} //显示初始化(不能分行书写)
三、访问:
四、默认值:
五、应用:
统计一组元素的总和。
数组扩容:
I. 声明:在原数组长度的基础之上,重新声明新数组。
II. 赋值:(复制)
1). 通过循环将原数组中的每个元素,依次复制给新数组的每个元 素。
2). System.arraycopy(原数组名,原数组起始下标,新数组名,新数组起 始位置,长度);
3). dataType[] java.util.Arrays.copyOf(原数组名,新长度);
增删元素:
I. 将插入位置起的所有元素,依次后移一位。
II. 将删除位置后的所有元素,依次前移一位。
六、排序:
冒泡排序:相邻的两个数值比较大小、互换位置(升序:前小后大)
规则:外层length-1,内层length-1-i
选择排序:固定值和其他值依次比较大小,互换位置。
规则:内层 int j = i + 1;
快速排序:java.util.Arrays.sort(数组名); //JDK提供(只能做升序)
规则:如需降序,自行实现reverse
七、二维数组:
概念:一维数组的一维数组,一维数组的元素,还是数组。
语法:
I. 数据类型[][] 数组名;
数组名 = new 数据类型[高维长度][低维长度];
II. 数据类型[][] 数组名 = new 数据类型[高维长度][];//不规则矩形
注意:低维数组必须自行通过new语句创建。
III. 数据类型[][] 数组名;
数组名 = new 数据类型[][]{ {v1,v2,v3},{v4,v5},{v6,v7,v8,v9} };
一、面向对象思想(Object Oriented Programming):
二、类:
概念:
I. 在一组相同或类似的对象中,抽取出共性的特征和行为。
II. 类是对象的模板。
现实生活中的对象–(抽象)–>程序中的模板(类)–>
创建程序中的对象–>解决现实问题
类是对象的抽象,对象是类的实例
组成:
I. 属性:(代表对象有什么)
1). 实例变量(成员变量):声明在类的内部,函数的外部,当通过 类构建对象的同时,所有成员变量都成为当前对象不可分割的 特征。
2). 语法:数据类型 属性名;
局部变量 成员变量
定义位置 函数或函数中的结构中 类的内部、函数的外部
默认值 无 字面常量(与数组相同)
使用范围 从定义行到代码块结束 本类有效
命名冲突 不允许与局部变量重名 可与局部变量重名,但局部变量优先
注:如成员变量的声明和赋值分开完成,则赋值语句必须在函数内部。
II. 方法:(代表对象能做什么)
访问修饰符 返回值类型 方法名称( 形式参数列表 ){
//方法主体
[return value;] //返回值
}
III. 方法重载(Overload):
1). 概念:方法名称相同、参数列表不同(类型、个数、顺序)。
2). 屏蔽使用的差异、灵活、便利。
IV. 构造方法(Constructor):
1). 没有返回值类型。
2). 构造方法名称必须与类名完全相同。
3). 创建对象时,触发构造方法的调用,不可通过句点手动调用。
4). 注意:
a. 在类中,如没有显示定义构造方法,则编译器默认提供无参 构造方法。
b. 如显示定义过构造方法,则无参构造方法不再默认提供。
c. 构造方法可以重载,遵循重载规则。
d. 通过关键字new对象时,根据传入不同的参数,调用对应的 构造方法,完成对象的创建。
e. 有参构造方法可在创建对象的同时,为各个属性赋值,或完 成必要的初始行为。
三、对象:
概念:
I. 具有多个特征和行为的实体。
II. 对象是类的实例。
创建对象:
I. 语法:数据类型 对象名 = new 数据类型();
II. 空间的分配:栈分配局部变量空间,堆分配对象空间。
III. 属性默认值:基本为对应的零值,引用为null。
四、访问属性和方法:
五、this关键字:
六、数据的传递(赋值):
一、封装:
概念:尽可能的隐藏类的内部实现细节,从而控制用户对类的修改及 访问的权限。
实现步骤:
I. 私有属性:private修饰属性名称。
II. 访问方法:public修饰setXXX()、getXXX()方法。
访问形式:
I. 封装前:
1). 赋值:s1.age = 30000;
2). 取值:s1.age
II. 封装后:
1). 赋值:s1.setAge(30000);
2). 取值:s1.getAge();
二、继承:
概念:类与类满足is a的关系,子类(派生类)是一种父类(超类、 基类)。
父类的抽象:
I. 父类:在一组相同或类似的类中,抽取共性的特征和行为。
II. 功能越精细、重合点越多,越贴近直接父类。
III. 功能越粗略、重合点越少,越贴近Object类。
IV. 将多个子类中共性的特征和行为,定义在父类中实现重用。
继承语法:子类 extends 父类{}
产生继承关系后,子类可以使用父类中所声明的属性和方法,也可定 义子类独有的属性和方法。
Java为单继承:一个类只能有一个直接父类,但可以多级继承。
不可继承:
I. private修饰的私有属性和方法。
II. 构造方法。
III. 非同包时,由default修饰的属性和方法。
访问修饰符(访问可见性):
本类 同包 非同包 子类 其他
private yes
default yes yes
protected yes yes yes
public yes yes yes yes
注意:default:管理的范围是包(package),只要在同一个包中即可 访问。
方法覆盖(Override 重写):
I. 当父类提供的方法无法满足子类需求时,可在子类中声明和父类完 全相同的方法进行覆盖。
II. 子类覆盖父类方法后,在实际调用中,优先调用子类覆盖后的方法。
III. 子类覆盖父类方法时,访问修饰符必须与父类相同或比父类更宽 泛。
super关键字:
I. 在子类中,可以通过super.访问父类中所定义的属性和方法。
II. super()或super(实参)在子类构造方法中,显示调用父类构造方法, 但必须是构造方法的首行。
III. 子类构造方法中如没有显示调用父类构造方法,则编译器默认提供 super(),调用父类无参构造方法。
继承关系的初始化:构造子类对象时,先构建父类对象
I. 分配空间。
II. 初始化父类属性
III. 执行完毕父类构造方法
IV. 初始化子类属性
V. 执行完毕子类构造方法
三、多态:
概念:父类引用指向子类对象,从而产生多种形态。
语法:父类类型 引用名称 = new 子类类型();
注:仅可调用父类中所声明的属性和方法、而不可调用子类独有的属 性和方法。
应用方式(1.继承、2.覆盖):
I. 使用父类作为方法形参,实现多态。(可以让一个方法的参数类型 的个数更宽泛)
II. 使用父类作为方法返回值,实现多态。(返回值可以是任意子类类 型)
作用:
I. 屏蔽子类间的差异。
II. 灵活、耦合度低。
对象间的类型转换:
I. 父类引用中保存子类的真实实例,称为向上转型(装箱)。
例如:Animal a = new Dog(); Vehicle veh = new Bus();
II. 将父类引用中的真实子类实例,强制转换回其本身类型,称为向下 转型(拆箱)
例如:Dog dog = (Dog)a; Bus bus = (Bus)veh;
III. 向下转型时,如子类真实类型与目标类型不匹配,则发生类型转换 异常(ClassCastException)
一、static(静态):
概念:
I. static修饰符表示类成员、全类所有对象共享的成员。
II. 不必创建对象,可直接通过类名调用。
静态属性、静态方法(类属性、类方法):
I. 全类共享(不属于某一个对象)。
II. 访问方式:类名.静态成员名称。
//Math.random()、Math.sqrt()、System.out、Arrays.copyOf()、 Arrays.sort()、System.arraycopy()
III. 所有引用调用的静态属性和方法都会自动转换成类名调用。
静态方法可以继承,没有多态。
静态方法不能直接访问非静态的成员:
I. 原因1:当访问静态方法时,可能还没有对象的产生。
II. 原因2:实例属性和方法都默认拥有this前缀,代表当前实例,然 而静态方法不属于某个实例。
静态代码块:
I. 类加载时被执行一次,不能手动调用。
II. 类加载(ClassLoading):
1). JVM首次使用(new对象、调用静态成员、使用子类时、 Class.forName(“全限定名”);)某个类时,通过CLASSPATH查找该 类的.class文件。
2). 将.class文件中所有的描述信息(属性、方法、构造方法)加载 到内存中,进行保存。
3). 优先加载,可为静态属性赋值,或任何程序必要的初始行为。
类加载以及创建对象的十步操作:
I. 类级别:
1). 父类静态属性
2). 父类静态代码块
3). 子类静态属性
4). 子类静态代码块
II. 对象级别:
5). 父类实例属性
6). 父类动态代码块
7). 父类构造方法
8). 子类实例属性
9). 子类动态代码块
10).子类构造方法
二、abstract(抽象):
三、final(最终):
一、概念:相当于特殊的抽象类,接口是一种能力,接口是一种约定。(抽象类的抽象)
二、语法:
三、与抽象类的异同:
I. 相同:
1). 不能new对象。
2). 都可以编译成字节码文件。
3). 都可以作为引用类型。
II. 不同:
1). 所有属性都是公开静态常量,隐式使用public static final修饰。
2). 接口中所有方法都是公开抽象方法,隐式使用public abstract修饰
3). 没有构造方法、没有动态、静态代码块。
四、关系:
五、规范:
六、应用场景:Java为单继承,当父类提供的方法个数无法满足子类需求时, 可以通过实现接口来扩充子类的能力。
七、接口引用:
八、接口回调:先有接口的使用者,后有接口的实现者。
九、好处:
一、内部类:
概念:
I. 在类的内部再定义一个类。
II. 内部类编译之后会生成字节码文件。
III. 内部类可以访问外部类的私有成员、而不破坏封装。
分类:
I. 成员内部类【了解】:
1). 是外部类的一个部分,创建内部类对象时,必须依赖外部类对 象。
2). 可直接访问外部类的私有成员。
3). 通过“外部类类名.this”访问外部类的成员变量。
4). 语法:
a. 创建:
Outer out = new Outer();
Outer.Inner in = out.new Inner();
b. 访问:
Outer.this.field //访问外部类的成员变量
II. 静态内部类【了解】:
1). 不依赖外部类对象,可直接创建内部类对象,或通过类名访问 内部类的静态成员。
2). 只能访问外部类的静态成员。
3). 语法:
a. 创建:
Outer.Inner in = new Outer.Inner();
b. 访问:
Outer.field //直接访问外部类静态成员
III. 局部内部类【重要】:
1). 当访问外部类的局部变量时,因无法保证二者的生命周期一致, 所以必须为局部变量增加final修饰符。
2). 作用范围和创建对象的范围仅在方法内部,隐藏类的信息。
IV. 匿名内部类【重要】:
1). 没有类名的局部内部类。
2). 必须继承一个父类或者实现一个接口。
3). 定义类、实现类、创建对象三步的语法合并。
4). 生命周期内只能创建一个对象。
API(Application Programming Interface)应用程序编程接口,帮助文档。
二、Object类:
概念:
I. 超类、基类、所有类直接或间接的父类,位于继承树的顶层。
II. 任何类,如没有书写extends显示继承,则默认直接继承Object。
III. Object所定义的方法,是所有对象有具有的方法。
IV. Object类型可以存储任何对象,作为参数、可接收任何对象;作为 返回值,可返回任何对象。
方法:
I. public final Class> getClass() //返回对象的运行时类型(真实类型)
比较两个对象的真实类型是否一致 a1.getClass() == a2.getClass()
II. public int hashCode() //根据对象的物理地址、字符串、整数部分进 行计算,最终得到一个int类型的结果。哈希码并不唯一,它是一 种算法,尽量保证不同对象返回不同哈希码。
III. public String toString() //返回该对象的字符串表示。
可根据自己的业务需求,选择性覆盖父类中的toString()。
IV. public boolean equals(Object obj) //比较两个对象是否相同
Object实现策略为“==”比较地址。
如需判断地址不同,内容相同的两个对象,则需要自行覆盖。
V. protected void finalize() :
I. 垃圾回收:销毁垃圾对象,释放存储空间。
II. 垃圾对象:没有任何引用指向对象,为垃圾对象。
III. 垃圾收集器(Garbage Collect):
三、包装类:
概念:
I. 8种基本数据所对应的引用数据类型。
II. Object可统一所有数据,默认值为null。
匹配:
byte —> Byte
short —> Short
int —> Integer
long —> Long
float —> Float
double —> Double
char —> Character
boolean —> Boolean
类型转换:
I. Number父类中继承到的6个转型方法。
II. 构造方法。
III. parseXXX(String s) //静态方法,将字符串转换成基本类型
IV. valueOf() //静态方法,将基本或字符串转换成包装类型
V. 注意兼容类型,避免NumberFormatException异常。
VI.JDK5之后,自动装箱、拆箱。包装类型与基本类型可自动转换。
四、String:
概念:
I. 字符串是常量,创建之后不可改变。
II. 字符串字面值存储在字符串池中,可以共享。
创建:
String s1 = “abc”;
String s2 = new String(“abc”);
方法:
public char charAt(int index) //返回index所对应的字符
public String concat(String str)
public boolean contains(CharSequence s) // CharSequence就是字符串 String
public boolean endsWith(String suffix)
public boolean startsWith(String suffix)
public int indexOf(String str)
public int lastIndexOf(String str)
public String replace(char oldChar,char newChar)
public String[] split(String regex)
public String substring(int beginIndex)
public String toLowerCase() //将字符串转换成大写
public String toUpperCase()
public String trim()
可变字符串:
I. StringBuffer:JDK1.0推出,操作速度慢、线程安全。
II. StringBuilder:JDK5推出,操作速度快、线程不安全。
III. 常用方法:append(?); //追加
一、概念:
二、Collection体系集合详解:
Collection父接口:
I. 特点:存储所有Object数据。
II. 方法:
boolean add(Object o) //向集合中添加一个对象
void clear() //清空集合中的对象
boolean contains(Object o) //检查集合中是否包含o对象
boolean remove(Object o) //将o对象从集合中移除
int size() //返回集合中元素的个数
Object[] toArray() //将集合转换成Object数组。
List子接口:for、forEach、Iterator
I. 特点:有序、有下标、元素可以重复。
II. 方法:
void add(int index, E element) //在指定位置插入元素
E get(int index) //返回指定位置的元素
E remove(int index) //通过下标移除元素
E set(int index, E element) //在指定位置替换元素
List subList(int fromIndex,int toIndex) //返回fromIndex与toIndex 之间的元素
III. 实现类:
1). ArrayList【重点】:
a. 数组结构存储。
b. JDK 1.2推出 操作速度快,线程不安全。
c. 查询快、增删慢。
2). Vector【了解】:
a. 数组结构存储。
b. JDK 1.0推出 操作速度慢,线程安全。
3). LinkedList【了解】:
a. 链表结构存储。
b. 查询慢、增删快。
c. 实现栈Stack,Last In First Out(LIFO)后进先出
d. 实现队列Queue,Last In Last Out(LILO)后进后出->先进先出
三、泛型集合【重点】:
四、Collections工具类:
public static void sort(List list) //升序排序
public static void reverse(List> list) //倒置
public static void shuffle(List list) //乱序、洗牌
五、Set子接口:forEach、Iterator
II. LinkedHashSet【了解】:保留元素的插入顺序。
III. TreeSet【了解】:
1). 实现了SortedSet接口,对集合元素自动排序。
2). 元素对象的类型必须实现Comparable接口中的compareTo方法, 指定排序的规则。
3). 希望this靠前,则返回负数;希望this靠后,则返回正数;返回 则代表相等。
4). TreeSet通过compareTo方法的结果进行排序,如果结果为“零”, 则可以指定次要排序列。
4. 迭代方式:
I. Iterator迭代器:
1). 获取当前集合的专属迭代器。
Iterator> it = set.iterator();
2). 循环判断是否存在下一个元素,并获取下一个元素。
while(it.hasNext()){//判断
it.next();//获取
}
II. forEach遍历:
for(数据类型 局部变量名 : 容器){
//将容器中的每个对象临时保存在局部变量中
//循环体内容完成对当前对象的操作
}
六、Map接口:
特点:存储一对数据(key-value),无序、无下标,键不能重复、值 可以重复。通过建访问值(通过key访问value)。
方法:
V put(K key, V value) //将关联的键和值一并存储
V get(Object key) //通过建访问值
V remove(Object key) //通过键移除整个键值对
Set keySet() //获取所有的键
Collection values() //获取所有的值
Set entrySet() //获取所有的键加值(格式为:“key=value”)
实现类:
I. HashMap【重点】:
1). 允许使用null作为key或value,重复键会覆盖原有键值对。
2). JDK 1.2推出 操作速度快、线程不安全。
II. Hashtable【了解】:
1). 不允许使用null作为key或value。
2). JDK 1.0推出 操作速度慢、线程安全。
III. TreeMap【了解】:
1). 实现SortedMap接口,自动对key排序。
2). 作为key的对象,必须实现Comparable接口。
IV. Properties【了解】:
1). Hashtable的子类,存取时的参数必须是String类型。
2). 可以直接在流(IO)中加载内容。
一、概念:程序在运行中发生的特殊情况。
二、异常分类:
Throwable:
|- Error:错误,硬件、JVM、执行逻辑错误,不能手动处理。
|- Exception:异常,程序在运行或配置中产生的问题,可处理。
|- RuntimeException:运行时异常,编译期不检查,可处理可不处理
|- CheckedException:受查异常,编译期检查,必须处理。
三、异常的产生:
四、异常的传递:按照方法的调用链进行反向传递m3->m2->m1->main->JVM
五、异常的处理:
作用:发生异常时,为提高代码的容错性,避免程序中止,执行预判 的处理代码。从而尽量减少程序因异常带来的损失。
方式:
I. 消极处理:throws 声明异常,修饰在方法参数列表的后端。
public void method() throws Exception{}
注:
显示告知调用者,此方法可能出现的异常。
只有异常的传递,而没有捕获异常,程序仍旧会因异常而中 止。
II. 积极处理【重点】:捕获、处理异常。
try{
//可能发生异常的代码
}catch(Exception e){ //将捕获到的异常对象赋值给局部变量e
e.getMessage(); //获取异常发生的原因、消息
e.printStackTrace(); //打印堆栈跟踪信息
//异常处理代码
}finally{
//最终:无论是否发生异常,此代码块一定会执行。
//常用于释放资源。
}
III. 常用异常结构:
1). try{}catch{}
2). try{}catch{}catch{}…
3). try{}catch{}finally{}
4). try{}catch{}catch{}…finally{}
5). try{}finally{}
六、自定义异常:
七、带有异常声明的方法覆盖:
一、流:(Input / Output)
概念:流(对象)是在内存与存储设备之间传输数据的通道。
分类:
I. 方向:
1). 输出流:用以将<内存>中的数据写入到<存储设备>中。
2). 输入流:用以将<存储设备>中的数据读入到<内存>中。
II. 单位:
1). 字节流:可以读写所有数据。
2). 字符流:只能读写文本数据。
III. 功能:
1). 节点流:实际传输数据。
2). 过滤流:增强节点流功能(处理流、装饰类)。
二、字节流:
字节流父类:
I. OutputStream(输出流)
II. InputStream(输入流)
字节节点流【重点】:
I. FileOutputStream:
public void wirte(int b) //一次写一个字节
public void write(byte[] b) //一次写多个字节(b.length个)
II. FileInputStream:
public int read() //一次读一个字节
public int read(byte[] b) //一次读多个字节(最多b.length个)
II. BufferedOutputStream:
1). 缓冲流,提高IO效率,减少访问硬盘的次数。
2). 数据存储到缓冲区,关闭前,需使用flush或close一次性写入 到文件中,并清空缓冲。
III. ObjectOutputStream / ObjectInputStream【重点】:
1). 读写对象(序列化、反序列化),要求对象必须实现 java.io.Serializable接口,以启动序列化功能。
2). 序列化对象时,必须保证其所有属性均可序列化。
3). transient修饰为临时属性,不参与序列化。
4). java.io.EOFException表示到达文件末尾,可处理。
三、字符编码:
四、字符流:
字符流父类:
I. Wrietr(输出流)
II. Reader(输入流)
字符节点流【重点】:
I. FileWriter:
public void write(String str) //一次写一个字符串
II. FileReader:
public int read() //一次读一个字符
public int read(char[] c) //一次读一组字符
字符过滤流:
I. PrintWriter / BufferedReader:缓冲流,支持一次写一行、读一行。
II. OutputStreamWriter / InputStreamReader:
桥转换流:用以将字节流转换成字符串,并设置编码格式。
使用步骤:
I. 创建节点流。
II. [ 包装过滤流 ]。
III. 读写数据。
IV. 关闭流。
五、File对象:
一、进程:
二、线程:
概念:
I. 轻量级进程(Light Weight Process LWP),代表进程中一个单一的 顺序控制流程。
II. CPU调用的基本单位是线程(调用某一进程中的某一线程)。
III. 在单个进程中“同时”运行多个线程完成不同的工作,交替执行, 称为多线程。
组成:
I. CPU:操作系统分配时间片(Windows:520ms、Linux:5800ms)。
II. 数据:堆空间共享(对象),栈空间独立(变量)。
III. 代码:
1). 继承Thread类:
a. 覆盖run方法。
b. 创建子类对象: Thread t1 = new MyExtendsThread();
c. 启动线程: t1.start();
2). 实现Runnable接口:
a. 覆盖run方法。
b. 创建子类对象: Runnable r = new MyImplRunnable();
c. 创建线程对象: Thread t2 = new Thread®;
d. 启动线程: t2.start();
3). 常用方法:(造成阻塞)
public static void sleep(long millis) //当前线程休眠
public static void yield() //放弃、让出时间片
public final void join() //将其他线程加入到自身线程中,优先执行
三、线程同步【重点】:
线程不安全:当多线程并发访问临界资源时,如果破坏原子操作,可 能造成数据不一致。
I. 临界资源:共享资源(同一对象)。
II. 原子操作:不可分割的多个步骤,被视为一个整体,其顺序不可打 乱或缺省。
互斥锁标记:每个对象都有一个互斥锁标记,用来分配给线程的。
锁池:每个对象都有一个锁池,用来存储等待该对象锁标记的线程的
同步方式【重点】:
1). 同步代码块:
synchronized(临界资源){ //可为临界资源加锁
//原子操作
}
2). 同步方法:
synchronized 返回值类型 方法名称(形参列表){
//原子操作
}
注:在调用同步方法时,需要对象的锁标记,而调用非同步方法时, 不需要锁标记,可直接访问。
ArrayList操作速度快,线程不安全(支持并发访问,非同步方法)
Vector 操作速度慢,线程安全(同步方法)
synchronized add()
remove()
死锁、生产者消费者、哲学家进餐
一、概念:
类的对象:基于某个类new出来的一个实例,也称为实例对象。new Dog
类对象:封装了一个类的所有信息(包名、类名、父类、接口、属性、 方法、构造方法…)。Student.class
注意:类对象就是一个.class文件,当中包含了一个类的所有信息!
获取类对象:
//1.通过类型直接获取类对象
Class c1 = Student.class;//类对象
//2.以静态方法的形式获取类对象
Class c2 = Class.forName(“ref.Student”);
//3.通过类的实例对象获取类对象
Student stu = new Student();
Class c3 = stu.getClass();
四、单例模式:
`