Java语言概述
随着Java技术在Web方面不断成熟,已经成为Web应用首选开发语言。
后台开发:Java 、PHP、Go、Python、Node.js
Java技术体系平台
Java SE (Java Standard Edition)标准版 |
支持面向桌面级应用的Java平台,提供了完整的Java核心API,此前版本称为J2SE |
Java EE(Java Enterprise Edition)企业版 |
是为开发企业环境下的应用程序提供一套解决方案。该技术体系包含的技术如:Servelt、Jsp等,主要针对Web应用开发。此前版本称为J2EE |
Java ME(Java Micro Edition)小型版 |
支持Java程序运行时在移动终端的(手机、PAD)上的平台,对JavaAPI有所精简,并加入了针对移动端的支持。此前版本称为J2ME |
Java Card |
支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台 |
Java是一个纯粹的面向对象的程序设计语言,它继承了C++语言面向对象技术的核心,Java舍弃了C语言中容易引起错误的指针,增加了垃圾回收器功能。
Java语言特点
1、面向对象
两个基本概念:类、对象
三大特性 :封装、继承、多态
2、健壮性
吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
3、跨平台性
跨平台性:通过Java语言编写的应用程序可以在不同的系统平台上运行。
原理:只需要在需要运行Java程序的操作系统上,安装一个Java虚拟机(JVM )即可。由JVM来负责Java程序在系统上运行。
语法简单
支持面向对象
支持分布式开发
健康性
安全性
可移植性
解释性语言
支持多线程
高性能
动态
注释
- 单行注释:使用双斜杠
“//”
格式
- 块注释:使用
“/* .....*/”
格式
- 文档注释:使用
“/** ....*/”
格式
1、Java规范的三种注释方式
单行注释 //
多行注释 /* */
文档注释/** */
2、Java单行注释和多行注释作用
1.对所写程序进行解释,增强可读性,方便自己,方便别人
2.调试所写代码
3、特点:单行注释和多行注释;注释了的内容不参与编译。换句话说,编译以后生成的.class结尾的字节码文件中不包含注释信息
4、文档注释的使用:
注释内容可以被JDK提供的工具JavaDoc所解析,生成一套以网页文件形式体现的该程序说明文档
5、多行注释不可以嵌套使用
Java API文档
API: application programming interface。习惯上:将语言提供的类库,都称为api
API文档:针对提供的类库如何使用,给的说明书。
关键字与保留字
关键字指的是Java系统保留使用的标识符,也就是说这些标识符只有Java系统才能使用,程序员不能使用这样的标识符。
关键字(KeyWord)的定义及特点
定义:被Java语言赋予了特殊含义,用做专门用途的字符串
特点:关键字中所有字母都为小写
用于定义类,函数,变量修饰符的关键字: |
abstact、final、static、synchronized |
用于定义类与类之间关系的关键字 |
extends、implements |
用于定义建立实例及引用实例,判断实例的关键字 |
try、catch、finall、throw、throws |
用于包的关键字 |
package、import |
其他修饰符关键字 |
native、strictfp、transient、volatile、assert |
用于定义数据类型值的字面值 |
true、false、null |
保留字
Java保留字:现有版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符要避免使用这些保留字
goto、const
标识符
1、标识符:凡是自己可以起名字的地方都叫标识符
如类名、变量名、方法名、接口名、包名...
2、标识符命名规则 --->不遵守规则,编译不通过
>由26个英文字母大小写,0-9,_或$组成
>不可以使用关键字和保留字,但可以包含关键字和保留字
>Java中严格区分大小写,长度无限制
>标识符不能包含空格
3、Java中名命名规范
包名:多单词组成时所有字母都小写;
类名、接口名:多单词组成时,所有单词首字母大写,第二个单词开始每个单词首字母大写
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写
常量名:所有字母都大写,多单词时每个单词用下划线连接
4、
1.在起名时,为了提高阅读性,要尽量有意义:见名知意
2.Java采用unicode字符集,因此标识符也可以用汉字,但不建议
标识符是指赋予类,方法或变量的名称,在Java语言中,常用标识符来识别类名、变量名、方法名、类型名、数组名和文件名。
- 标识符不能以数字开头
- 标识符不能除了规定之外的文件
- 标识符中不能出现空格
- 标识符只能出现美元符号$,而不能包含@、#等特殊字符
常量
变量
变量的概念:
内存中的一个储存区域
该区域的数据在一定范围内不断变化
变量是程序中最基本的储存单元。包含变量类型、变量名和储存的值
变量的作用:
用于在内存中保存数据
局部变量,顾名思义,就是在一个方法块或者一个函数内起作用,超过这个范围,它将没有任何作用。由此可以看出,变量在程序中是随时可以改变的,随时都在传递着数据。
明白了局部变量后就不难理解全局变量了,其实它就是比局部变量的作用区域更大的变量,能在整个程序内起作用。
命名规范:
1.见名知意
2.驼峰命名
3.类 首字母大写,驼峰命名
4.常量 大写+下划线
变量的使用
1、Java定义变量的格式:
数据类型 变量名 = 变量值
2、使用变量注意:
Java中每个变量必须先声明,后赋值
使用变量名来访问这块区域的数据
变量的作用域:在其定义的一对{}内
变量只有在其作用域内才有效
同一个作用域内,不能定义重复的变量
变量的分类 :按数据类型可以分为基本数据类型和引用类型
变量在类中的声明位置:
成员变量 局部变量
进制
包机制
防止命名冲突
package
import
数据类型
- 直接通过单个字符来指定字符常量:例如'A'、'9'和'0'等。
- 通过转义字符表示特殊字符常量:例如'\n'、'\f'等。
- 直接使用Unicode值来表示字符常量,格式是'\uXXXX',其中XXXX代表一个16进制的整数。
整型是有符号的32位整数数据类型,整型int用在数组、控制语句等多个地方,Java系统会把byte和short自动提升为整型int。类型int是最常用的整数类型,在通常情况下,一个Java整数常量默认就是int类型。
布尔类型是一种表示逻辑值的简单类型,它的值只能是真或假这两个值中的一个。它是所有的诸如a<b这样的关系运算的返回类型。Java中的布尔型对应只有一个——boolean类型,用于表示逻辑上的“真”或“假”。boolean类型的值只能是true或false,不能用0或者非0来代表。
单精度浮点型—float
单精度浮点型是专指占用32位存储空间的单精度数据类型,在编程过程中,当需要小数部分且对精度要求不高时,一般使用单精度浮点型,这种数据类型很少用,不详细讲解。
双精度浮点型—double
双精度浮点类型占用64位存储空间,在计算中占有很大的比重,保证数值的准确。
double类型代表双精度浮点数,float代表单精度浮点数。一个double类型的数值占8个字节,64位,一个float类型的数值占4个字节,32位。
Java语言的浮点数有两种表示形式。
(1)十进制数形式:这种形式就是平常简单的浮点数,例如5.12、512.0、0.512。浮点数必须包含一个小数点,否则会被当成int类型处理。
(2)科学记数法形式:例如5.12e2(即5.12×102),5.12E2(也是5.12×102)。必须指出的是,只有浮点类型的数值才可以使用科学计数形式表示。例如51200是一个int类型的值,但512E2则是浮点型的值。
基本数据类型
整数类型 |
浮点类型 |
布尔型 |
字符型 |
byte,short,int,long |
float,double |
boolean |
char |
1 2 4 8 |
4 8 |
2 |
1 |
引用数据类型
类 |
接口 |
数组 |
class |
interface |
{} |
Java的整形常量默认为int型,声明long型常量后需要加'l'或'L'
Java程序中常量通常声明为int型,除非不足以表达较大的数,才使用long
类型 |
占用储存空间 |
表述范围 |
byte |
1字节=8bit位 |
-128~127 |
short |
2字节 |
-2的15次方到2的15次方-1 |
int |
4字节 |
-2的31次方到2的31次方-1 |
long |
8字节 |
-2的63次方到2的31次方-1 |
浮点类型:float、double
float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。
double:双精度 ,精度是float的两倍。通常采用此类型
Java的浮点型常量默认值为double,声明Float型常量,须后加'f'或'F'。
浮点类型常量有两种表示形式:十进制数形式、科学计数形式
字符串类型:String
1.String属于引用数据类型
2.声明String类型变量时,使用一对""
3.String 可以和8种基本数据类型做运算,且运算只能是连接运算:+
4.运算结果仍然是String类型
类型转换
前提:这里只讨论7种基本数据类型变量间的运算。不包含boolean类型的
1.自动类型转换:(低转高)
结论:当容量小的数据类型的变量向容量大的数据类型的变量运算时,结果会自动提升为容量大的数据类型。
byte、short、char --->int --->long --->float --->double
特别的:当byte、char、short三种类型的变量运算时,结果为int
2.强制类型转换:(高转低)(低)高
自动类型提升运算的逆运算
需要使用强转符:()
强制类型转换,可能会导致精度丢失
boolean类型不可以转换为其他的数据类型
运算符
算数运算符 |
+ - * / % ++ -- |
赋值运算符 |
= |
关系运算符 |
> >= < <= != == instanceof |
逻辑与运算符 |
&& || ! |
位运算符 |
& | ^ ~ >> << >>> |
条件运算符 |
?: |
扩展运算符 |
+= -= *= /= |
流程控制
Scanner |
用户交互System.in |
顺序结构 |
程序默认结构,自上而下运行 |
选择结构 |
if 、if-else、if-else-if-else、swtich-case、break 、defaut |
循环结构 |
while、do-while、for、增强for |
顺序结构:程序从上到下执行
分支结构:if - else if - else
if - else 条件判断结构
结构1:
if(条件表达式){
执行表达式
}
结构2:
if (条件表达式){
执行表达式1
}else{
执行表达式2
}
结构3
if(条件表达式){
执行表达式1
}else if(条件表达式){
执行表达式2
}else if(条件表达式){
执行表达式3
}
......else{
执行表达式n
}
说明:
1.else结构是可选的
2.针对条件表达式
> 如果多个条件表达式之间是互斥的关系(没有交集),哪个判断和执行语句声明在上面还是下面,无所谓。
> 如果多个表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构放在声明上面。
> 如果多个条件表达式有包含关系,通常情况下,需要将范围小的声明在范围大的上面。否则,范围小的没机会执行。
> if else结构是可以互相嵌套的
> 如果if - else结构中执行语句只有一行时,对应的一对{}可以省略,但不建议省略。
switch - case选择结构
switch(表达式){
case 常量1:
执行语句;
//break
case 常量2:
执行语句2;
//break;
...
default:
执行语句n;
//break;
}
说明:
根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构
末尾结束为止。
break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
switch结构中的表达式,只能是如下的6种数据类型之一:
byte 、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
case 之后只能声明常量。不能声明范围。
break关键字是可选的。
default:相当于if-else结构中的else.
default结构是可选的,而且位置是灵活的。
如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。
break在switch-case中是可选的
}
循环结构:
for 、while、do、while
1.循环结构的四要素
① 初始化条件
② 循环条件 --->是boolean类型
③ 循环体
④ 迭代条件
说明:通常情况下,循环结束都是因为②中循环条件返回false了。
2.三种循环结构:
2.1 for循环结构
for(①;②;④){
③
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
2.2 while循环结构
①
while(②){
③;
④;
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
说明:
写while循环千万小心不要丢了迭代条件。一旦丢了,就可能导致死循环!
for和while循环总结:
1. 开发中,基本上我们都会从for、while中进行选择,实现循环结构。
2. for循环和while循环是可以相互转换的!
区别:for循环和while循环的初始化条件部分的作用范围不同。
3. 我们写程序,要避免出现死循环。
2.3 do-while循环结构
①
do{
③;
④;
}while(②);
执行过程:① - ③ - ④ - ② - ③ - ④ - ... - ②
说明:
1.do-while循环至少会执行一次循环体!
2.开发中,使用for和while更多一些。较少使用do-while
3.“无限循环”结构: while(true) 或 for(;;)
总结:如何结束一个循环结构?
方式一:当循环条件是false时
方式二:在循环体中,执行break
4.嵌套循环
1.嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环
内层循环:循环结构A
外层循环:循环结构B
2.说明:
① 内层循环结构遍历一遍,只相当于外层循环循环体执行了一次
② 假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m * n次
③ 外层循环控制行数,内层循环控制列数
【典型练习】
//练习一:
/*
******
******
******
******
*/
for(int j = 1;j <= 4;j++ ){
for(int i = 1;i <= 6;i++){
System.out.print('*');
}
System.out.println();
}
//练习二:
/* i(行号) j(*的个数)
* 1 1
** 2 2
*** 3 3
**** 4 4
***** 5 5
*/
for(int i = 1;i <= 5;i++){//控制行数
for(int j = 1;j <= i;j++){//控制列数
System.out.print("*");
}
System.out.println();
}
衡量一个功能代码的优劣:
1.正确性
2.可读性
3.健壮性
4.高效率与低存储:时间复杂度 、空间复杂度 (衡量算法的好坏)
如何理解流程控制的练习:流程控制结构的使用 + 算法逻辑
break和continue关键字的使用
使用范围 循环中使用的作用(不同点) 相同点
break: switch-case
循环结构中 结束当前循环 关键字后面不能声明执行语句
continue: 循环结构中 结束当次循环 关键字后面不能声明执行语句
补充:带标签的break和continue的使用
return在方法中讲。
方法
方法定义:修饰符 返回值类型 方法名(参数名){return 返回值}
方法调用:类名.方法;对象.方法
方法重载:方法名相同,参数不同
命令行传参: 给main方法传递参数
可变长参数:...(必须放在最后一个参数)
递归:自己调用自己
数组
数组理解:
数组(Array),是多个相同类型的数据一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理。
数组概念:
数组名
元素
角标、下标、索引
数组的长度:元素个数
数组特点:
数组是序排列的
数组属于引用数据类型的变量。数组的元素,即可以是基本数据类型,也可以是引用数据类型
创建数组对象会在内存中开辟一整块连续的空间。
数组长度确定后,就不能修改。
数组分类:
维数:一维数组、二维数组.....
数据元素类型:基本数据类型元素的数组,引用数据类型的元素数组
数据结构:
数据与数据之间的逻辑关系:集合、一对一、一对多、多对多
数据的储存结构:
线性表:顺序表(比如:数组)、链表、栈、队列
树形结构:二叉树
数组内部排序算法
冒泡排序
选择顺序:直接选择排序、堆排序
交换排序:冒泡排序、快速排序
插入排序:直接插入排序、折半插入排序、shell排序
快速排序
归并排序
希尔排序
桶排序
基数排序
算法的五大特征
输入(Input) |
有0个或多个输入数据,这些输入必须有清楚的定义和描述 |
输出(Output) |
至少有1个或多个输出结果,不可以没有输出结果 |
有穷性(有限性,Finiteness) |
算法在有限步骤之后会自动结束循环而不会无线循环,并且每一个步骤可以在可接受的时间内完成 |
确定性(明确性,Definiteness) |
算法中每一步都有确定的含义,不会出现二义性 |
可行性(有效性,Effectiveness) |
算法中每一步是清楚可行的,能让用户用纸笔计算而求出答案 |
说明:满足确定性的算法也称为:确定性算法。人们也关注更广泛的概念,例如考虑各种非确定性的算法,如并行算法、概率算法等。另外,人们也关注并不要求终止的计算描述,这种描述有时被称为过程(procedure)。 |
Java运行机制
面对对象
三大特性
- 封装 2.继承 3.多态
- 从认识论角度考虑是先有对象后有类。对象,是具体的事物。类是抽象的,是对对象的抽象。
- 从代码运行角度考虑是先有类后有对象。类是对象的模板。
类与对象:类是对象的抽象:模板class,对象是类的具体
构造方法:默认的无参构造,如果定义了有参构造就必须手动添加一个无参构造
单例模式: 需要将构造器私有
new对象:栈存放引用,堆存放具体对象
封装:属性私有,get、set
继承:extends、Object,子类可以自动拥有父类中除了私有内容外的其他所有内容,方法重写,this、super,Java是单继承,只能实现一个父类继承
多态:父类的引用指向子类的对象,instanceof关键字,如果匹配,可以进行类型之间的转换
修饰符:public 、protected、private、static、final 、abstrat
接口:
1.interface约束只能定义方法名,子类实现接口,必须重写其中的方法
2.只有一个方法是接口叫做函数式接口,可以使用lambda表达式简化
3.接口比抽象类更抽象
4.一个类可以实现多个接口
内部类:局部内部类、静态内部类、匿名内部类
物以类聚,分类的思维模式,思考问题首先解决问题需要哪些分类,然后对这些分类进行单独思考,最后才对某个分类下的细节进行面向过程的思索。
面向对象适合处理复杂问题,适合处理多人协作的问题。
面向对象本质是:以类的方式组织代码,以对象的组织封装数据。
面向过程
- 步骤简单清晰,第一步做什么,第二步做什么.......
- 面向过程适合处理简单的问题
- 类是一种抽象的数据类型,它是对某一事物整体描述/定义,但是并不能代表某一个具体事务
- 对象是抽象概念的具体实例
异常
Exception |
运行时异常、检查型异常 |
ClassNotFound、NullPoint、UnKownType、下标越界异常 |
Error |
AWT错误、JVM异常 |
StackOver(栈溢出)、OutOfMemory(内存溢出) |
五个关键字:try{}、catch(){}、finally、throw(手动抛出异常)、throws(方法抛出异常)
自定义异常:继承Exception类即可
常用类
Math类 |
|
Object类 |
hashcode()、toString()、clone()、getClass()、notify()、wait()、equals |
Random类 |
生成随机数 UUID |
File类 |
创建、查看、修改、删除 |
包装类 |
自动装箱和拆箱(八大基本类型) |
Date类 |
Date、SimpDateFormat(yyyy-MM-dd HH:mm:ss)、Calandar |
String类 |
不可变性 final |
StringBuffer类 |
可变长 append 多线程数据量大 效率低 安全 |
StringBuilder类 |
可变长 单线程数据量大 效率高 不安全 |
集合框架
Collection: |
List有序可重复 Set无序不可重复 |
ArrayList |
add remove contains size |
LinkedList |
getFirst() getLast() removeFirst addFirst ... |
HashSet |
常用 |
Treeset |
|
Map |
|
TreeMap |
jdk1.7:数组+链表 jdk1.8:hash表=数组+链表+红黑树 |
Hashmap |
|
Collections |
泛型<> 约束,避免类型转换之间的问题 |
IO流
字节流 |
输出流: OutoutStream 输入流:InputStream |
字符流 |
Reader Writer |
处理流 |
buffer: bufferInputStream bufferOutputStream 序列化: 反序列化、Seriallizble transient Object date: DateInputStream DateOutputStream 转换流: inputstreaReader OutputStreanWriter print: PrintWriter PrintStream Filter : 四个 |
节点流 |
CharArrayReader、Writer、inputstream、 outputstream StringReader,Writer pipe(管道流) pipeoutputStream File |
创建与初始化对象
- 使用new关键词创建对象
- 使用new关键词创建对象时,除了分配内存空间之外,还会给创建好的对象进行默认初始化以及对类中构造器的调用。
- 类中构造器也称为构造方法,是在进行创建对象时必须要进行调用的。并且构造器有以下两个特点:
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
super关键字
- super:表示父类中的内容
- this:表示自己类中的内容
- 用super和this来区分和子类中重名的内容
- super可以获取父类的内容
- super可以调用父类的构造方法,必须写在子类构造方法第一行,如果父类构造是无参可以不写,如果父类没有无参构造,必须要写super
final
- 被final修饰的变量不可以被改变,又称为常量
- 被final修饰的方法不可以被重写
- 被final修饰的类不可以被继承
- final不可变
抽象
抽象现实中不存在的东西,在Java中只声明不实现。
抽象方法:使用abstract来修饰,不可以有方法体,直接用分号结束
抽象类:如果一个类中有抽象方法,这个类必须是抽象类,抽象类无法被实例化
特点:
- 抽象类不可以创建对象
- 抽象类的子类,必须重写父类的抽象方法,子类必须也是抽象类,通过抽象类可以强制要求子类中必须有哪些方法
接口
接口实际上是一种抽象类
接口中所有的方法都是抽象方法
接口使用interface来声明
能继承接口的只能接口
接口和类只能是实现关系
面向接口编程,可以降低程序的耦合度,提高程序的扩展力,符合OCP开发援助。
接口的使用离不开多态机制
任何一和接口都有通用者和实现者 ,接口可以将调用者和实现者解耦合
多态
- 理解多态性:一个事情的多种形态
- 何为多态性:
对象的多态性,父类 的引用指向子类的对象或者子类的对象赋给父类引用
Static
static(静态的)修饰的属性,相较于实例变量,随着类的加载而加载;早于对象的创建;只要权限允许,可以通过“对象.属性”的方式进行调用,存在于方法的静态区
1.可以用来修饰的结构:主要用来修饰类的内部结构
属性、方法、代码块、内部类
String StringBuilder StringBuffer
使用规则:
- 如果字符串存在大量修改,一般使用StringBuffer或StringBuilder
- 如果字符串存在大量修改,单线程情况下 使用StringBuilder
- 如果字符串存在大量修改,多线程情况下 使用StringBuffter
- 如果字符串很少修改,被多个对象引用,使用String
StringBuilder使用方法和StringBuffer相同
多线程
进程和线程:
- 进程是资源分配的最小单位,线程是程序执行的最小单位。
- 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
- 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
- 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
线程5种状态:创建、就绪、运行、阻塞、死亡
线程创建方式:
继承Thread类:重写run方法,
子类继承Thread类具备多线程能力
启动线程: 子类对象.start
不建议使用: 避免OOP单继承局限性
实现Runnable接口
实现Runnable接口,具备多线程能力
启动线程: 传入目标对象+Thread对象.start()
建议使用: 避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
实现Callable接口
实现Callable接口,需要返回值类型
重写call方法,需要抛出异常
静态代{过}{滤}理
Lambda表达式:函数式编程、避免内部定义过多
常用方法:
sleep(休眠) |
join(插队) |
yield(礼让) |
isLive(存活) |
start(启动) |
setPriority |
interrupt(中断) |
线程同步:
多个对象操作一个资源,并发 |
队列+锁 |
Synchronized: 同步方法、同步代码块 死锁:互斥、请求与保持、不剥夺条件、循环等待、循环等待条件 |
Lock ReentrantLock:lock、trylock、unlock |
线程通信:
缓冲区:消息队列
标志位:红绿灯
wait();
notifyAll();
线程池:
池化技术
池的大小
最大连接数
保持时间
...
网络编程
IP
端口
socket编程
TCP:三次握手、四次握手、面向连接
UDP:无连接、Packet
URL
聊天通信
文件上传
GUI
AWT:Frame 、监听事件:鼠标、键盘、窗口、动作事件
Swing:文本框、标签、按钮、文本域、面板、布局方式、关闭窗口列表
注解和反射
注解
1.元注解
2.内置注解
3.自定义注解
4.反射读取注解
反射:
1.Class
2.类加载机制
3.Method
4.Field
5.Construct:获取数据的时候需要,传递参数的class类型
6.破坏私有关键字
7.性能分析: 正常>检测关闭的反射>默认反射
8.反射获得注解,泛型....
单例模式的探究