title: Java基础note
toc: true
comments: true
tags: Java
abbrlink: 3f47467
date: 2021-08-01 15:34:54
categories:
这里记录的是对Java基础的讲义笔记 !
[TOC]
chpt02 Java基础语法和注释
基础语法
1. 注释
作用:解释说明
1.1 单行注释: //注释内容
1.2 多行注释: /*注释内容*/
1.3 文档注释:/** 注释内容 */
2. 标识符 & 关键字
2.1 标识符
定义:java程序中包、类、变量、方法的名字
命名规则:
。由字母、数字、下划线_、$ 构成,数字不能打头
。长度无限制
。java的关键字不能作为标识符
命名规范:
。包名全小写
。类名遵循“驼峰法则”,首字母大写:HelloWorld
。方法名/变量名遵循“驼峰法则”,首字母小写:helloWorld
。常量全大写,单词之间下划线分割:HELLO_WORLD
2.2 关键字
goto:java保留了goto关键字,但并不使用
3. 变量 & 常量
3.1 变量
定义:内存中的一块有名字的存储空间
变量三要素:类型、名字、值
3.2 常量:
定义:值不可变的变量
特点:只能赋一次值,不能二次赋值
4. 数据类型
4.1 分类
依据:
1. 不同的数据需要的内存大小不一样
2. 不同的数据能参与的运算不一样
类别:
1. 基本数据类型(共8种):
表示法:二进制、八进制、十进制、十六进制
整型:byte(1字节:-128~127)、short(2字节)、int(4字节)、long(8字节)
常量:默认为int类型
浮点:float(4字节)、double(8字节)
常量:默认double类型
字符:char(2字节)
布尔:boolean:true/false(未知)
2. 引用数据类型:HelloWorld、String
3. void
4.2 类型转换
1. 自动转换:
。小赋大、整赋浮
。特列:byte、short、char参与运算的时候,先转换为int类型
2. 强制类型转换:float p2 = (float)3.10;
5. 运算符
。算数运算符: + - * / % ++ --
。关系运算符: > >= < <= == !=
。逻辑运算符: && || !
* 短路现象
。位运算符: & | ^ ~ << >> >>>
。赋值运算符: = += -+ *=
。条件运算符: ? :
6. 表达式
由数据和运算符组合而成的式子。表达式的类型由运算符决定。
算数表达式: 3 + 2
关系表达式:3 > 2
逻辑表达式:3 > 2 && 1 > 2
7. 语句
简单语句 = 表达式 + ;
块语句 = {}
注释
哪些地方需要添加注释
首先,我们需要确定一下,添加注释的目的是什么?(手动思考10秒)。
我认为添加注释,是为了程序更容易理解与维护,特别是维护,更是对自己代码负责的一种体现。
那基于这样的目的,在日常开发中,我们需要在哪些地方添加注释呢?
§类,接口。
这一部分注释是必须的。在这里,我们需要使用javadoc注释,需要标明,创建者,创建时间,版本,以及该类的作用。如下所示:
package com.andyqian.utils;/*** @author: andy* @date: 18-01-05* @version: 1.0.0* @deion: 生成PDF 工具类*/public class PdfUtil {}
§方法
在方法中,我们需要对入参,出参,以及返回值,均要标明。如下所示:
/** * 生成pdf文件 * @param htmlContent 待生成pdf的 html内容 * @param file 生成pdf文件地址 * @see PdfUtils#getFontPath() * @return true 生成成功 false 生成失败 */ public static boolean generatePdf(String htmlContent,File file){ ... return result; }
§常量
对常量,我们需要使用多行注释,进行标明该常量的用途,如下所示:
/*** @author: andy* @date: 18-01-05* @version: 0.0.1* @deion:*/public class StatusConsts { /** * 博客地址 */ public static final String BLOG="www.andyqian.com";}
§关键算法上
在关键算法上,添加注释并且按照顺序依次标明,写明白该方法为什么这么做。如下所示:
/** * 应用场景: * 1.在windows下,使用Thread.currentThread()获取路径时,出现空对象,导致不能使用 * 2.在linux下,使用PdfUtils.class获取路径为null, * 获取字体路径 * @return 返回字体路径 */ private static String getFontPath(){ String path=""; // 1. ClassLoader classLoader= Thread.currentThread().getContextClassLoader(); URL url = (classLoader==null)?null:classLoader.getResource("/"); String threadCurrentPath = (url==null)?"":url.getPath(); // 2. 如果线程获取为null,则使用当前PdfUtils.class加载路径 if(threadCurrentPath==null||"".equals(threadCurrentPath)){ path = PdfUtils.class.getClass().getResource("/").getPath(); } // 3.拼接字体路径 StringBuffer stringBuffer = new StringBuffer(path); stringBuffer.append("/fonts/SIMKAI.TTF"); path = stringBuffer.toString(); return path; }
怎么添加注释?
1. IDEA 自动生成
对于类中的注释,我们可以通过IDEA自动生成。
如IDEA 可以通过:File->Settings->Editor->File and Code Templates->Includes->File Header来设置模板,这样新建文件时,IDEA会按照设置的模板,会自动生成一个注释,就不需要一个一个敲了。
其中标签有:
${USER} : 当前用户。
${DATE} : 当前日期。
${PACKAGE_NAME}:包名。
${TIME}: 当前时间。
${YEAR}: 当前年。
${MONTH}:当前月。
${DAY}: 当前日。
${HOURS}: 当前小时。
${MINUTE}: 当前分钟
1.注释引用
如果方法中引用了其他的方法,在注释中如何体现呢?细心的朋友,应该已经发现了,在上面的:
/** * 生成pdf文件 * @param htmlContent 待生成pdf的 html内容 * @param file 生成pdf文件地址 * @see PdfUtils#getFontPath() * @return true 生成成功 false 生成失败 */ public static boolean generatePdf(String htmlContent,File file){ ... return result; }
中的@see就有这个作用,其语法是:
@see package.class#method label@see #field@see #method(Type, Type,...)@see #method(Type argname, Type argname,...)@see #constructor(Type, Type,...)@see #constructor(Type argname, Type argname,...)
例如:
@see PdfUtils#getFontPath()
如果是同一个类中,package(包名全路径)可以省略。有相同功能的标签有:
{@linkpackage.class#metod}
/** * 生成pdf文件 * @return true 生成成功 false 生成失败 * @throws Exception * {@link PdfUtils#getFontPath()} */ public static boolean generatePdf(String htmlContent,File file){ .... }
其区别是:@see必须要在注释行首,{@link}可以在任意位置。
在IDEA中,我们可以选中方法通过快捷键Ctrl+D即可查看我们添加的注释,如下图所示:
1.如果需要引用外网的连接,我们可以通过HTML标签中的a标签来表示,如下所示:
@see <ahref="http://www.andyqian.com">博客地址</a>
以下为javadoc 需要熟知的注释标签:
@see 引用类/方法。
@author: 作者。
@date:日期。
@version: 版本号。
@throws:异常信息。
@param:参数
@return: 方法返回值。
@since: 开源项目常用此标签用于创建日期 。
{@value}: 会使用该值,常用于常量。
{@link} 引用类/方法。
{@linkplain} 与@link功能一致。
完整案例如下:
package com.andyqian.pdf.utils;import com.itextpdf.text.log.Logger;import com.itextpdf.text.log.LoggerFactory;import java.io.File;import java.net.URL;/*** @author: 鞠骞* @date: 18-01-05* @version: 1.0.0* @deion: 生成PDF 工具类*/public class PdfUtils { private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); /** * 生成pdf文件 * @param htmlContent 待生成pdf的 html内容 * @param file 生成pdf文件地址 * @see <a href="https://itextpdf.com/">https://itextpdf.com/</a> * @return true 生成成功 false 生成失败 */ public static boolean generatePdf(String htmlContent,File file)throws Exception{ ... return true; } /** * 应用场景: * 1.在windows下,使用Thread.currentThread()获取路径时,出现空对象,导致不能使用 * 2.在linux下,使用PdfUtils.class获取路径为null, * 获取字体路径 * @return 返回字体路径 */ private static String getFontPath(){ String path=""; // 1. ClassLoader classLoader= Thread.currentThread().getContextClassLoader(); URL url = (classLoader==null)?null:classLoader.getResource("/"); String threadCurrentPath = (url==null)?"":url.getPath(); // 2. 如果线程获取为null,则使用当前PdfUtils.class加载路径 if(threadCurrentPath==null||"".equals(threadCurrentPath)){ path = PdfUtils.class.getClass().getResource("/").getPath(); } // 3.拼接字体路径 StringBuffer stringBuffer = new StringBuffer(path); stringBuffer.append("/fonts/SIMKAI.TTF"); path = stringBuffer.toString(); return path; }}
添加注释时的一点建议
1.类中,接口等必须有创建时间,创建人,版本号,描述等注释。
2.注释不是越多越好,比如:get/set方法就不需要写注释。更不需要每一行都写注释。
3.注释需要写的简明易懂。特别是方法的参数,以及返回值。
4.每一次修改时,相应的注释也应进行同步更新。
5.在类,接口,方法中,应该都使用/** */javadoc注释。因为这样调用者就不需要进入方法内部才知道方法的用处。提高编码效率。
6.方法代码中如果有顺序之分,最好将代码也加上序号,如1,2,3等。
7.枚举中的每一个值都需要添加注释。
小结
写注释是一个好习惯,能让自己和团队都受益,如果你接手一个一丁点注释都没有的项目,那么上一个程序员就倒霉了(此处省略N个字),不知你们有没有看过开源项目的源码,那注释写的相当详细,大家可以多多参考,争取别做一个”倒霉”的程序员。
chpt03 流程控制
if(表达式1) {
if(表达式2){
代码块1;
}else{
代码块2;
}else {
代码块3;
}
switch(表达式){
case 常量1:
代码块A;
break;
case 常量2:
代码块B;
break;
case 常量3:
代码块C;
break;
case 常量4:
代码块D;
break;
……
default:
代码块F;
break;
}
while(循环条件){
循环代码块;
}
do{
循环代码块;
}while(循环条件);
1 2 4
for(表达式1;表达式2;表达式3){
循环代码块;
3
}
int i,j;
for(i=1;i<=20;i++1){
for(j=1;j<=i;j++){
语句块;
}
}
chpt04 方法与数组
权限修饰符+(static)+函数返回类型+函数名(参数列表){
if(递归结束条件){递归结束终值赋值语句;
return 返回值;
}else{
累计计算+循环调用函数语句;
return 返回值;
}
数组名 = new 数组类型[数组长度];
数据类型[] 数组名 = new 数据类型[数组长度];
int[] engNo = new int[5];
String[] engName = new String[5];
数组名[数组下标] = 数值;
int[] engNo = new int[]{1001,1002,1003,1004,1005};
String[] engName = new Sting[]{"刘海龙","孙传戒","孙越"};
int[] engNo = {1001,1002,1003,1004,1005};
String[] engName = {"刘海龙","孙传戒","孙越"};
chpt05 String
String stuName1 = new String("王云");
char[] charArray = {'刘','静','涛'};
String stuName2 = new String(charArray);
String stuName3 = new String(charArray,1,2);//从'静'自开始,截取2个字符,结果是"静涛"'
String stuName1 = "王云";
class TestString2{
public static void main(String[] args){
String stuName1 = new String("王云");
stuName1.concat("同学");
Sytem.out.println("stuName1");
}
}
StringBuffer strB1 = new StringBuffer();
StringBuffer strB2 = new StringBuffer("刘海龙");
chpt06 类和对象
类和对象:
1、面向过程 & 面向对象
a. 面向过程(POP:procedure oriented programming):
“面向过程”就是汽车启动是一个事件,汽车到站是另一个事件。
在编程序的时候我们关心的是某一个事件。而不是汽车本身。我们分别对启动和到站编写程序。
b. 面向对象(OOP:Object Oriented Programming):
“面向对象”需要建立一个汽车的实体,由实体引发事件。
我们关心的是由汽车抽象成的对象,这个对象有自己的属性,像轮胎,颜色等;
有自己的方法,像启动,行驶等.方法也就是汽车的行为.而不是汽车的每个事件。
2、类(群体)
概念:对具有相同属性和行为的对象的抽象。
语法:class Person{}
界门纲目科属种
3、封装:
定义:就是将抽象得到的属性和行为结合起来,形成一个整体,就是类。
目的:
a. 增强安全性
b. 简化编程
4、对象: 一切皆对象(苹果、桌子、人),类的实例
5、构造方法(构造器):
。主要作用:对象初始化
。构造器没有返回值类型;名称同类名;
。构造器中的第一条可执行语句是对其它构造器(父类构造器|当前类构造器)的调用,当没有显示调用其它构造器时,系统默认调用的是父类无参构造器(父类中必须有无参构造器)
* this
6、对象初始化过程:
系统默认初始化 》 成员变量声明时的初始化 = 初始化块初始化 》 构造器初始化
7、方法重载
方法名相同,方法参数不同(参数个数、参数类型、参数顺序)的方法,称为重载方法。
chpt07 权限控制&static
》包:
。包是类的容器,用于分隔类名空间。最主要作用:解决类名冲突。
。默认包中的类无法被其它包引用。
》权限控制:
private : 类内部;
默认:同一个包中;
protected: 同一个包中和子类中;
public: 任何地方。
》静态变量 & 静态方法:
1、静态成员属于类,静态方法不能操作实例变量。
2、java类首次装入JVM时,会对静态变量(含静态块)或方法进行一次初始化(执行)。
》static的使用:
。依赖于实例的方法属性,不用static修饰;这样的成员,被称为实例成员;
。不依赖于实例的方法属性,需用static修饰;这样的成员,被称为类成员;
》静态块:
静态块在类首次装入JVM时执行,且只执行一次。
所谓类首次加载,是指:比如第一次new对象,第一次调用类的静态方法,都要用到这个类,第一次用到该类的时候,
静态块就会被率先执行。
注:
在java中,java的静态类、方法、变量是存放在全局数据区中的,在应用程序运行期间一直占用内存而不被销毁。
》import:
。普通导入:import java.lang.Math.*; 使用:Math.PI
。静态导入:import static java.lang.Math.PI; 使用:PI
注:
只有静态属性和方法才能被静态导入。
chpt08 继承和多态
继承和多态:
》继承:
。概念:子承父业,子类持有父类的成员(属性、方法)。子类获取父类(属性&方法)的,新增自己的,覆盖(override)父类的。
。功能:代码的复用,实现多态
。可继承成员:父类中的非私有成员都能被继承,私有的成员只能通过从父类中继承来的公有方法间接的调用
。成员覆盖:属性覆盖 & 方法覆盖(重写override) (就近原则调用自己的)
重写(方法覆盖):
子类拥有与父类完全相同的方法,覆盖了父类中的方法。重写的方法返回值类型/异常类型可以缩小,访问权限可以被放大。
。继承中的初始化:先人(父)后己(子)
。构造器中的第一条可执行语句是对其它构造器(父类构造器|当前类构造器)的调用,当没有显示调用其它构造器时,
系统默认调用的是父类无参构造器(父类中必须有无参构造器)
。类是单继承的
。最终类不能被继承
1.最终量(常量)不能被二次赋值
2.最终方法不能被覆盖(重写)
3.最终类不能被继承
》多态:
1、向上转型:父类的属性,子类的方法
。静态绑定/前期绑定/编译期绑定/属性绑定
。动态绑定/后期绑定/运行时绑定/行为绑定
2、向下转型:a -> b -> a , 强制类型转换。
》instanceof: 类型判断
》对象(类)间的关系:
。继承(白箱复用) is a :
class A extends B{
}
。依赖 has a :
class A{
B b;
}
。相持
class A{
void f(B b){
}
}
。聚合
class A{
B[] b;
}
。组合(黑箱复用)
class A{
B b;
C c;
}
注:优先使用对象组合,而不是类继承;
chpt09 抽象类和接口
抽象类 & 接口
抽象类:abstract修饰的类
抽象方法:abstract修饰的没有方法体的方法
1. 抽象类不能实例化
2. 子类继承抽象父类,如果父类中的抽象方法不在子类中实现,那么子类依然是抽象类
接口:只有静态常量或抽象方法的抽象类
1.类: 类是单继承的(一个只能继承一个类),接口是多实现的(一个类可以实现多个接口)
2.接口:接口多继承(一个接口可以继承多个接口)
ps:
JDK8及以后,允许在接口中定义static方法和default方法。
1. 静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。
2. default方法,只能通过接口实现类的对象来调用。如果默认方法不能满足需要,实现类可以覆盖默认方法。
chpt10 Java异常处理机制
》概念:程序中出现的错误
》体系
Throwable
。Error:错误,Java程序本身无法恢复的严重错误,程序无需捕获处理。
。Exception:异常,程序中的错误,程序员必须解决
1.检查时异常:编译期异常(.java -> .class)
。ClassNotFoundException 类没被找到异常
。FileNotFoundException 文件找不到异常
。IOException
2.运行时异常: .class 被执行期间
。NullPointerException 空指针异常
。ArrayIndexOutOfBoundsException 数组下标越界异常
。IndexOutOfBoundsException
。ArithmeticException 算术异常
。InputMismatchException 输入不匹配异常
。ClassCastException
。NumberFormatException
》异常处理:
try...catch...finally
1. try结构是必须的,catch结构和finally结构二者至少要出现其一
2. try语句块抛出异常,则try中抛出异常后的代码将不再执行,转而执行相应的catch块;如果try结构中无异常,catch则不执行。
3. catch结构可以出现多次
4. 多重捕获(multi-catch ,jdk1.7新增):一个catch语句可以捕获多个异常。
语法:
catch(Exception1 | Exception2 | ... | ExceptionN e){}
5. 如果有finally结构,finally总会被执行;唯一不被执行的情况是catch(只限于catch)中出现了System.exit(1)语句;
6. throw & throws
throw: 手动抛出异常
throws: 声明方法抛出异常
ps:
。异常应该按“由小到大”的顺序进行捕获;
。异常处理结构中的return 和中断
》扩展try语句的使用。(jdk1.7新增)
扩展try语句,称为带资源的try(try-with-resources)语句,这种try语句支持自动资源管理(例如,当流不再需要时,能自动关闭他们)。
语法:
try(resource-specification){
//use the resource
}
[catch(){}finally{}]
说明:
1.resource-specification 是用来声明和初始化资源(如文件流)的语句。该语句包含一个变量声明,
在该声明中使用将被管理的对象引用初始化变量。try代码块结束时,自动释放资源。对于文件,
意味着将会被自动关闭(不再需要显示的调用close方法)。
2.只有实现了AutoCloseable接口的资源,才能使用带资源的try语句。所有流类都实现了该接口。
》自定义异常:继承Exception
DIYException extends Exception{}
chpt11 数据结构
数据:一切可以被计算机识别存储的信息
数据结构:数据的组织形式(表现形式&存储形式)
。逻辑结构:
1.集合结构:相互独立,无关联
2.线性结构(数组、栈(First In,Last Out)、队列(First In,First Out))
3.树结构(二叉树)
遍历:
。先根遍历 :根 -> 左 -> 右
。中根遍历: 左 -> 根 -> 右
。后根遍历: 左 -> 右 -> 根
4.图结构(地图)
。物理结构(存储结构):
1.顺序存储结构
2.链式存储结构
。比较:
a.从内存开销角度:链式存储结构更耗内存
b.从数据操作的角度:顺序存储结构的优势在于数据的查询,链式存储结构的优势在于数据的增删
数据的查找:
1.无序查找
2.有序查找(二分查找)
数据排序:
1. 冒泡排序
2. 选择排序
3. 插入排序
4. 快速排序
......
chpt12 集合
》集合:数据的容器
>集合框架
。Collection:单值集合(value)
.Set:数据无序不可重复
1.HashSet
2.TreeSet: 元素有序
.List:数据有序可重复
1.ArrayList/Vector: 数组存储,顺序存储结构,优势在于数据的查询
2.LinkedList:链式存储结构,优势在于增删
线程安全:Vector(扩容100%)
线程不安全:ArrayList(扩容50%)、LinkedList
。Map:键值对集合<key,value>
>Collection(List&Set)的使用
>集合的遍历
Set:
1.forEach (遍历的同时不允许增删)
2.Iterator
List:
1.for
2.forEach (遍历的同时不允许增删)
3.Iterator/ListIterator (遍历的同时不允许增删)
>集合的排序:比较器(Collections)
1.内部比较器Comparable: 为TreeSet和List服务的
2.外部比较器Comparator: 为List服务
。TreeSet -> Comparable
。List -> Comparable / Comparator
>单值集合工具:
Collections: 服务Collection集合
Arrays: 服务数组
>Map
.HashMap: 键值都可以为空,线程不安全
.HashTable: 键值都不可以为空,线程安全
.Properties: 线程安全
》泛型:参数化类型
》拆箱&装箱
。拆箱
。装箱
chpt13
文件和IO
File:
文件 & 文件夹
1. 文件夹操作:创建、删除、遍历
2. 文件操作:创建、删除、控制
IO流:
概念:Input 输入,读入,Output 输出,写入
主体:内存
数据源 : 提供数据的文件
数据端: 接收数据的文件
工具:流
1.字节流:继承自 InputStream / OutputStream 这两个抽象类。
FileInputStream / FileOutputStream
ObjectInputStream / ObjectOutputStream
2.字符流:继承自 Reader / Writer 这两个抽象类。
FileReader / FileWriter
注:字节流和字符流,因没有使用缓冲区等原因,一般不直接使用。
。缓冲流:缓冲流是一种装饰器类,目的是让原字节流、字符流新增缓冲的功能。
BufferedInputStream & BufferedOutputStream
BufferedReader & BufferedWriter
。数据流:允许字节流直接操作基本数据类型和字符串。
DataOutputStream & DataInputStream
》Serializable && Externalizable
用于存储到本地磁盘或网络传输的对象必须实现序列化接口Serializable,如果对象中的某些属性不想被序列化,
将该属性用transient(临时的)修饰即可。另外,static成员也不会被序列化。
XML
XML: eXtensible Markup Language ,可扩展标记语言
应用范围:
。数据存储
。系统配置
。数据交换
XML文档结构
1. 文档声明(可选)
2. DTD 约束 (可选)
3. 文档正文 (标签:不可以数字开头)
示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE team SYSTEM "team.dtd">
<team>
</team>
XML元素命名规则
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格
标签名大小写敏感
DTD: Document Type Definition
。规范:元素、属性、元素间的关系
?: 被修饰的元素可以出现0次或1次
+: 被修饰的元素至少要出现1次
*: 被修饰的元素可以出现任意次
示例:
<!ELEMENT team (coach,players)>
<!ELEMENT coach (name,sex)>
<!ELEMENT players (player+)>
<!ELEMENT player (name,age*,sex)>
<!ATTLIST player id CDATA #REQUIRED > //#REQUIRED:必须的,#IMPLIED:非必须的
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
XML解析
。DOM: 把整个xml文件读入内存进行解析
。SAX:一次读一部分,分段解析
chpt14 反射
反射:
java程序在运行时加载、使用编译期完全未知的类信息。
Class:
class:类型修饰符
Class:是一个数据类型
对比:
Class:描述所有的类(数据类型)
。共性:成员变量、构造器、成员方法
Student:描述所有的学生
。属性:学号、姓名、分数
。行为:学习、运动、睡觉
chpt15 多线程
多线程:
进程:
。程序
。进行(运行)中的程序
。进程是操作系统资源(内存、IO)分配的基本单位
线程:
。所有的线程共享进程持有的资源
。线程是操作系统调度执行的基本单位
线程状态:
新建(启动)、就绪、运行、阻塞(等待)、死亡(终止)
。阻塞 = 缺资源(IO、内存)
。就绪 = 阻塞 + 资源
。运行 = 就绪 + CPU
线程控制:
1.创建
1.1 extends Thread
1.2 implements Runnable
2.新建&启动
2.1 new Thread().start();
2.2 new Thread(new ImpRunnbale()).start();
3.阻塞
sleep(time:毫秒)
interrupt() 中断阻塞
4.死亡
。stop()//不再使用
。代码控制线程的终止
5.等待加入
join()
6.设置线程优先级
setPriority()
7.设置守护线程(后台线程)
setDaemon(true)
。通过在线程启动(start)前调用其setDaemon方法,可将其设置为一个守护线程
。当程序只有守护线程时,程序会立即结束运行
数据共享 & 线程同步
。synchronized
。同步块
1.内部锁
2.外部锁
。同步方法
线程死锁和协作
chpt16 计算机网络
计算机网络:
。分类:
1. 局域网:LAN(内网)
2. 广域网: WAN(外网、公网)
。协议:
1. OSI
2. TCP/IP
。IP & 域名
1. IP:
。表示形式:32位二进制、点分十进制
。分类:网络号 + 主机号
2. 域名:
www.baidu.com == 112.80.248.76
网络配置:
ipconfig: 查看网络配置信息
ping: 测试网络是否连通
套接字编程:
ServerSocket:服务器套接字
Socket: 套接字
chpt17 注解
注解:
。注释:说明
。注解:功能
语法:
@interface()
三大内置注解:
。@Override 重写
。@Deprecated 已过时
。@SusspressWarnings 抑制警告
DIY注解:
public @interface SqlProvider {
String value() default "delete from tableName";
String sql() default "";
}
四大元注解:
。元数据
1.@Target
2.@Retention
3.@Documented
4.@Inherited
chpt18 测试与调试
》测试与调试:
。测试 test:发现问题;
。调试 debug:解决问题;
》测试分类:
。黑盒测试:功能测试;
。白盒测试:结构测试、逻辑驱动测试,要求测试员对被测程序的结构非常清楚。
。灰盒测试
》JUnit 3/4/5 注解:
。@Before: 被@Before修饰的方法,在每个测试方法运行前,均执行一次;
。@After:被@After修饰的方法,在每个测试方法运行完毕后,均执行一次;
注:
1.@Before和@After可以出现多次;
2.经这两个注释的初始化和注销,可以保证各个测试之间的独立性而互不干扰,他的缺点是效率低。
。@BeforeClass:所有测试开始之前运行
。@AfterClass :所有测试结束之后运行
注:
对于消耗资源,可以使用这两个注释。
。@Test(expected=*.class)
通过传入异常类后,测试类如果没有抛出异常或者抛出一个不同的异常,本测试方法就将失败。
。@Test(timeout=xxx)
该元数据传入了一个时间(毫秒)给测试方法, 如果测试方法在制定的时间之内没有运行完,则测试也失败。
。@ignore:
该元数据标记的测试方法在测试中会被忽略。
》Faliure和Error的区别:
。 Failure是指测试失败
。 Error是指测试程序本身出错
》测试类:
。测试类是一个独立的类,没有任何父类。测试类的名字可以任意命名。所以我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部方法的声明。
。测试类中,并不是每一个方法都是用于测试的,你必须使用“标注”(@Annotation)来明确表明哪些是测试方法。
。测试方法的名字可以随便取,没有限制,但是返回值必须为void,而且不能有任何参数。
》参数化测试:
只写一个测试函数,把若干种情况作为参数传递进去,一次性的完成测试。
》测试集:
把多个测试类放在一个测试套件中集中运行。