1.what(Java是什么,用来干什么?)

面向对象编程语言
【适合】编写服务端应用程序,【偶尔】用于编写桌面应用程序
web应用的组成
界面交互(Html/...) —— 业务逻辑(Java/...) —— 数据存取(SqlServer/...)

2.why(为什么使用它? 下列广告词)

简单
java是高级语言(其它:汇编、机器语言),表达能力强 从c++发展而来,大部分语法规则相同 剔除了一些复杂的语法(指针【容易造成内存泄漏、内存溢出】、多重继承等) 增加了一些功能(自动垃圾回收:创建对象时,自动分配内存;使用完毕,自动释放内存)
面向对象
Object(事物) Oriented(看待) 如何解决问题,取决于如何看待问题,面向对象与普通人看待世界的方式一致 封装(隐藏细节)、继承(复用)、多态(同一个行为,在不同事物身上表现不同)
平台独立
编译后的类文件是跨平台的,可以在任何安装了jvm的计算机上运行
可移植
源码无需更改,java虚拟机掩盖了不同机器的差别
分布式
通过网络编程,将应用程序分布在多台计算机上(QQ、微信)
安全
Java 安全模型基于一个可定制的“沙盒”,程序可在其中安全运行,对系统或用户无潜在风险
健壮
程序不会轻易崩溃。通过异常处理(预案),可以快速恢复正常流程
多线程
同时执行多个任务

3.how(怎样学习Java?)

学会
基本套路(如:安装java环境、编译、运行、调试)
理解
基础概念(如:面向对象、类、接口、继承、异常)
掌握
基本语法(如:定义类、接口、枚举,对类成员做访问限制,流程控制)
熟悉
常用API(如:流、集合、jdbc)

4.知识结构一览

1.安装jdk

①下载(也可以从其它电脑,直接复制jdk目录)
下载地址
http://www.oracle.com/technetwork/java/javase/downloads/index.html
②配置环境变量
JAVA_HOME
{jdk的目录}
PATH
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
CLASS_PATH
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
(PATH是把值追加到变量最前面,JAVA_HOME和CLASS_PATH是替换)
③验证环境(cmd只能读取到打开前的环境变量,如果做了修改,必须打开新窗口)
命令行
java -version

2.编译

命令行
①进入{项目根目录}
②javac {包名}\{类名}.java -d {目标文件夹【若省略,默认在同一目录】}
(会在{目标文件夹},生成同名的类文件:{包名}.{类名})

3.运行

命令行
①进入{目标文件夹}
②java {包名}.{类名}

4.打包

1)压缩
命令行
①进入 {要压缩的目录} 的上一级
②jar -cvf {压缩文件名}.jar {要压缩的目录}
2)解压
①将 {压缩文件名}.jar 复制到 {解压目录}
命令行
①进入 {解压目录}
②jar -xvf {压缩文件名}.jar

5.eclipse安装配置

①下载并解压,在桌面创建快捷方式
下载地址
http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/oxygen/R/eclipse-java-oxygen-R-win32-x86_64.zip
②配置
工作目录
File\Switch WorkSpace
选择jdk目录
Preference\Java\Installed JREs
选择编码格式 UTF-8
Preference\General\WorkSpace\Text file encoding
关闭拼写检查
Preference\General\Editors\Text Editors\Spelling
③快捷键
智能提示
Alt + /
注释
/* + 回车

1.java的体系结构

源文件
程序员写的代码,保存为Xxx.java
类文件
javac编译源文件,生成Xxx.class
JVM(java虚拟机)
类加载器:【动态加载】所需的类文件 字节码校验器:【检查】类文件的内容,确保字节码安全执行 执行引擎:【解释】类文件中的字节码 JIT编译:【编译】类文件中的字节码 -> 机器码(执行速度更快)
API/类库
JRE中自带的java类文件(类似c语言的函数库)

2.java的开发工具包

(查看jdk目录的bin文件夹)
javac
编译(解决中文乱码:-encoding utf-8)
java
运行(在package所在的目录,使用java命令时带上包名)
jar
打包(相当于zip,可以压缩jar/war包)
javadoc
根据代码注释生成文档
...
①JDK自带 JRE(java运行环境) = JVM + API
②生产环境不需要JDK,只需单独安装JRE

3.java程序的构建块

				
				
类和接口

4.数据类型

原生数据类型
告诉计算机,要开辟的多大内存空间,可进行哪类运算(值类型,不在类的体系中)
包装类
Java作者特意定义了一些类,专门描述原生数据类型 (得到2个好处:①将原生数据纳入到类的体系中 ②原生数据使用起来更方便)
自定义的类
描述事物的特征和行为(面向对象程序中,一切都基于类)
数组
定义一组类型相同的变量,单个变量是 数组名[index]
枚举
取值范围有限,把它列举出来
Optional类
表示可有可无(它用来包装对象,明确其值可能为null)
				
				
				
				
				
				
				
				

5.值

字面值
原生数据类型对应的值(计算机认识的基础数据)
对象
类对应的值(创建对象要调用构造函数)

6.访问限制

1)访问说明符(限制访问范围:能不能用?)
public
(类/成员)完全公开
protected
(成员)留给自己和子类
private
(成员)只留给自己
[默认]
(类/成员)同一个包内公开
2)访问修饰符(限制如何使用:怎么用?)
final
(变量/方法/类)最终,不能修改
static
(属性/方法/内部类)静态,一直都在、不需要实例化就能访问
abstract
(方法/类)抽象,因为不真实、不能实例化
transient
(属性)短暂,因为不长久、无需序列化
synchronized
(变量/方法)同步,排队、强迫多个线程依次访问
volatile
(变量)易变,状态不稳定、需要实时取值
strictfp
(方法/类)严格,精确的计算小数
native
(方法)当地,不是我实现的、由其它语言编写

7.面向对象的三大特性

1)封装
隐藏实现细节(数据和算法都在类的内部)
2)继承
extends
扩展基类的属性和方法
implements
实现接口中定义的方法
3)多态
同一个行为(方法名),具有多种不同的表现形态(实际上是不同的方法)
静态多态性
方法重载(同名,参数不同,在同一类中)
动态多态性
方法重写(同名,参数相同,在派生类中)
				
				
				
				
				
				

8.异常处理

程序执行期间,发生的执行流中断的情况(就是程序挂了)
Error
严重,程序无法解决,只能中断
Exception
轻微,可以恢复正常,继续运行
(编写异常处理代码的思维过程)
1)预判异常
感觉这段代码,会出哪类问题
2)定义异常
描述这个问题(通常已经在类库中了/没有的话就继承并定义一个)
3)处理异常
能够处理:捕获(很多时候是记日志:暂时忽略,由运维人员定期查看分析原因) 处理不了:抛出
				
				
				
				

9.断言

测试的本质
现实 ?= 期望
Java中的断言
这个表达式,在java中的语法
				
				

10.类型转换

1)原生数据类型(值)
(本质:内存空间大小的切换)
隐式转换
自动转换(小空间 【无损】切换到 大空间)
显式转换
强制转换(大空间 【有损】截断到 小空间)
2)复合数据类型(引用)
(本质:粗略还是精确)
向上转型
父类可以引用子类对象(因为:子类是对父类的细分)
向下转型
子类对象被父类引用后,还可以强制转换回本身的类型

11.函数式编程

数据
是变量的值
逻辑
是方法的值
如果逻辑可以像数据一样,能被传来传去,该多好?
函数式接口
只包含一个方法的接口(传递对象就像传递方法)
Lambda表达式
实现函数式接口的匿名类,可以简化成匿名方法
常用的函数式接口
Predicate / Consumer / Supplier / Function
方法引用
任意已经存在的方法,可以用特殊语法转换为Lambda表达式
静态方法引用
类::方法 == ()->类.方法()
特定对象的方法引用
对象::方法 == ()->对象.方法()
任意对象的方法引用
类::方法 == (类 对象)->对象.方法()
构造方法引用
类::new == (参数)-> new 类(参数)

1.基本数据类型

1)原生数据类型
整数
byte(8bit), short(2byte), int(4byte) ,long(8byte)
小数
float(4byte), double(8byte)
字符
char(1byte,字符和数字可以相互转换,规则是ASCII码)
布尔
boolean
2)包装类
整数
Byte, Short, Integer ,Long
小数
Float, Double
字符
Character
布尔
Boolean
3)字面值
二进制(前缀)
0b
八进制(前缀)
0
十六进制(前缀)
0x
long型(后缀)
L
float型(后缀)
f
double型(后缀)
d(可以省略,十进制数字默认是double型)
char型
''
boolean型
true/false

2.运算符

位运算符
& | ~ ^ << >>
算数运算符
+ - * / % ++ --
比较运算符
== != > >= < <=
逻辑运算符
&& || !
赋值运算符
= += -= *= /= %=
三元运算符
布尔 ? 选项1 :选项2
运算符优先级
括号 > 一元运算符 > 算数运算符 > 比较运算符 > 逻辑运算符 > 赋值运算符

3.流程控制语句

				
				
				
				

1.正则表达式

what
java提供的解析正则表达式的类库
how
使用Pattern编译正则表达式,使用Matcher类完成“匹配、查找、替换”
				
				

2.本地化

what
应用程序根据用户 “使用的语言、所在的国家” ,自动切换 “日期/货币/文本” 的显示格式
why
写一份程序,可以由多个国家的用户使用
how
输出 “日期/货币/数字” 时,使用 (语言, 国家) 进行格式化;
提前定义好各种语言字典(资源束文件),根据用户使用的语言,在字典中翻译后再输出;
				
				

3.泛型

what
将类/方法 中用到的数据类型 参数化
why
多种数据结构,复用同一个算法
how
将类中使用的类型 --抽象成--> 变量
				
				

4.集合接口

what
定义处理集合元素的方式
why
统一集合元素的处理操作,并能适应不同复杂程度的应用场景
how
定义多种复杂程度的集合接口,并提供相应的实现类
				
				
Collection

5.集合元素排序

what
给集合元素排序
why
统一并简化 集合元素的排序
how
分工:Comparable/Comparator描述两个样本元素如何比较,Collections.sort()根据比较规则进行排序
				
				

6.集合元素处理

what
处理集合元素:筛选、排序、分页、映射
why
统一并简化 对集合元素的处理
how
分工:Stream API负责将集合放到流水线上,Lambda表达式描述如何处理集合元素
				
				

7.JDBC

what
定义java与数据库通信的一套API
why
能够让程序员用一套代码,使用不同的数据库
how
各数据库厂商编写自己的java类、实现这套api,这些类打成jar包后,就是数据库驱动
				
				

8.线程

what
编写程序的目的是完成一个大的项目目标,这个大的项目目标通常被分解为若干小任务,有些小任务彼此不相关、可以各自独立完成(它们可以用线程来实现)。整个程序运行起来后,被叫做进程;默认的控制流是主线程,主线程可以创建若干同时运行的子线程,线程是程序内的单序列控制流、彼此独立运行、共享进程的资源
why
【同时】执行多个任务(省时间)
how
Java使用Runnable接口和Thread类来识别线程,然后对它们做特殊处理:在微观层面,把每个线程的代码切碎,让cup轮流调用;在宏观层面,由于切换足够块,看起来是在各自独立运行
				
				
线程状态切换

9.线程同步

what
多个线程【排队】使用共享资源
why
如果多个线程之间互不干扰,各自干自己的事情,永远不会出现问题;当多线程共用了某个资源后,如果一个没用完,另一个又来干扰,会扰乱资源的状态;而如果线程的逻辑依赖了资源的状态,还会使得线程运行错误的逻辑;无论是资源状态,还是逻辑错误都违背了程序的本意,应该避免!
how
使用synchronized给资源或方法加锁
				
				

10.线程通信

what
多个线程【轮流】使用共享资源
why
多线程共享资源有这样一种场景:一部分线程(消费者)消耗资源,一部分线程(生产者)补充资源;当资源耗尽时,消费者线程卡死在共享资源上,无法继续运行,由于它获取了资源锁,生产者线程只能排队等待,也被卡死,这是一种双输的局面,根本原因是消费者和生产者没有沟通。
how
消费者暂时让出资源使用权,让生产者补充资源后,再次使用,两者都可以顺畅运行
共享资源.wait():谦让(消费者线程让出资源锁,在一旁等待)
共享资源.notifyAll():交接(生产者线程通知 所有 等待的消费者线程,不用等了)
共享资源.notify():容易造成死锁,因为它仅通知了一个等待者,还有若干线程仍在等待
				
				

11.线程应用场景总结

没有先后次序的任务(相互独立)
开线程
分给多个人同时干(各干各的)
多个任务用到了同一个资源(相互干扰)
同步
用到共享资源时排队(逐个使用)
由于资源不足,消耗资源的任务被卡住了(占着茅坑不拉屎)
线程通信
消耗资源的任务先释放锁、在一旁等待,直到其它任务补充资源后、再反过来通知它,然后继续使用(交替使用)

12.流

what
快速移动的数据(类比:流水、流沙)
why
将数据从一个位置(如:内存)移动到另一个位置(如:硬盘)
how
使用Stream描述了一个带方向的管道,它封装了搬运数据的方法
				
				

13.序列化

what
Java对象 <==> 文本
why
Java对象是立体的,无法存储或传输
how
使用 ObjectOutputStream/ObjectInputStream 将Java对象和字节流进行互转
				
				

14.NIO

what
描述路径、操作路径的一系列API
why
方便对文件或目录进行操作
how
使用Path类描述路径,使用File类描述文件和目录,使用Files类通过操作文件或目录的静态方法
				
				

1.what:用户与计算机软件的交流(输入/输出)工具

搭积木
界面由 一堆组件 组装而成
积木按位置分类
最外层的容器、最内层的原子、中间的容器
摆放顺序
容器指定 内部组件 的排列方式
互动
组件感知用户的操作,并给出反馈

2.why:对用户来说,图形用户界面 更直观、更好用

字符用户界面
输出 字符,使用 键盘 输入
图形用户界面
输出 图形,使用 鼠标+键盘 输入

3.where:积木在哪儿?

定义积木
Java使用类来描述每一种组件
老积木
组件类放在包java.awt中,它们调用操作系统的图形接口
新积木
在老组件基础上做改进和扩展,新的类放在包javax.swing中,并且类名以J开头
积木的耳朵
为了感知到用户的操作,定义了各种侦听器和事件,它们放在包java.awt.event中

4.how:积木的耳朵怎么听?

信息传播过程
事件源 --【被侦听(感知)】--> 事件侦听器 --【调用(反馈)】--> 事件处理程序
事件源(信息的制造者)
界面上的 某个组件
事件侦听器(信息的收集者)
实现了 XXXListener 的类
事件处理程序(信息的反馈者)
XXXListener 中的方法

JVM是运行程序的大管家,它知道程序运行时,发生的一切。JAVA和程序员做了约定,只要写个类、并实现相应的Listener,它就是监听器,JVM会负责做侦查、并将所有信息告诉它;程序员只需要指定:监听器要监听哪个组件? 一旦监听到动态、需要做什么处理? 整个过程中传播的信息流 称为事件,被监听的组件 称为事件源,监听后要做的处理 称为事件处理程序。

5.我们该关注哪些知识点?

每种组件的用途?
组件如何布局?
每种侦听器对应的使用场合?

6.如何动手做GUI?

界面
①构思界面(想)
可以先在纸上勾勒草图
②分解组件(有)
将草图上的所有图形元素,对应成swing的组件
③排列组件(整齐)
挑选合适的布局方式,将组件排列整齐
④雕琢外观(漂亮)
设置 组件的大小、颜色、字体
互动
①构思动作场景(想)
可以先在纸上梳理所有操作
②细化每个操作(分析)
由哪个组件触发,是什么类型的操作,如何反馈
③编写代码(实现)
组件.addXXXListener(new XXXListener(){ 如何反馈 });

7.代码示例

				
				

1.编程语言是 算法和思想 的表达工具
2.见人说人话,见鬼说鬼话:没有万能语言,不同的场合适合不同的编程语言
3.评价语言只说好不好用,真正强大的是各种接口和类库
4.swing组件的官方文档:https://docs.oracle.com/javase/tutorial/uiswing/components/table.html