W3C Java教程
Java 教程 — Oracle官方文档 — Trail: Learning the Java Language (The Java™ Tutorials) 2022-07-18 11:01:53
安装JDK&配置环境
JDK8 安装&环境变量配置(Windows、Linux),JDK源码下载
数据类型
- 基本数据类型
- 引用数据类型
1
2
3
4
5
6
7
8对象(Object)
数组(属于Object)
String[] strs = {"11", "22"};//等同于 String[] strs = new String[]{"11", "22"};
System.out.println(strs instanceof Object);// true
System.out.println(new String[]{} instanceof Object);// true
接口(Interface 因为接口相当于一个抽象类,必须new了要实现方法)
总结:只要有new关键字创建的对象,都是引用数据类型。
成员变量默认值
局部变量&成员变量
1 | 1. 定义的位置不一样【重点】 |
Java内存划分
数组
三种创建方式
默认值与成员变量的默认值相同
1 | public static void main(String[] args) |
数组内存图
- 一个数组 内存图
- 两个独立数组 内存图
- 两个引用指向同一个数组 内存图
长度不可变
数组长度运行期间不可变,因为数组是对象,可以执行其他数组。
类和对象
概念
对象内存图
- 一个对象 内存图
- 两个对象使用同一个方法 内存图
- 两个引用指向同一个对象 内存图
- 用对象类型作为方法参数 内存图
- 用对象类型作为方法返回值 内存图
传值&传引用
可参考传值还是传引用内存语义
==和equals比较
String常量池
static
静态static关键字
概述
修饰成员变量
修饰成员方法
静态内存图
extends
继承
概念
继承的基本概念
Override应用场景
方法(覆盖)重写的应用场景
super&this
父子类同名变量_super与this的内存图
继承的特点
Java继承的三个特点
abstract
抽象的概念
interface
生活举例
生活中接口的举例
接口方法定义
内容小结
1 | 在Java 9+版本中,接口的内容可以有: |
使用注意事项
1 | 1. 接口是没有静态代码块或者构造方法的。 |
继承注意事项
1 | 1. 类与类之间是单继承的。直接父类只有一个。 |
多态
概念
好处
使用多态的好处
上下转型
对象的上下转型
instanceof
instanceof关键字类型判断
案例_笔记本USB接口
final
代表最终,不可改变的。
修饰类
修饰方法
修饰局部变量
修饰成员变量
权限修饰符
public > protected > (default) > private
注意事项:(default)并不是关键字“default”,而是根本不写。
位置 | public | protected | (default) | private |
---|---|---|---|---|
同一个类(我自己) | √ | √ | √ | √ |
同一个包(我邻居) | √ | √ | √ | × |
不同包子类(我儿子) | √ | √ | × | × |
不同包非子类(陌生人) | √ | × | × | × |
内部类
成员内部类
成员内部类的定义&使用
内部类的同名变量
内部类的同名变量的使用
局部内部类&类修饰符
局部内部类的使用_类修饰符总结
局部内部类的final问题
匿名内部类
匿名内部类使用&注意事项
包装类
基本类型包装类
装箱&拆箱
自动拆箱&自动装箱
泛型
概念
好处
泛型类
泛型方法
泛型接口
泛型通配符
我目前理解,泛型通配符无任何作用,但是配合
extends
或super
会有用。
例如Collection<?> coll
是无用的,但Collection<? extends Number> coll
或Collection<? super Number> coll
是有用的。
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。
通配符基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
1 | public static void main(String[] args) { |
泛型通配符上下兼容
数据结构
栈
可参考方法栈的执行逻辑一个对象的内存图
队列
可参考并发容器的队列实现并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解
数组
可参考ArrayList的实现ArrayList
链表
可参考LinkedList的实现LinkedList
红黑树
List&Set&Map
案例_斗地主
可变参数
注意:
- 如果上面两种写法在同一个类中,方法不可以同名。
- 如果是可变参数写法,必须写在参数列表的最后面。
异常
return问题
try,catch,finally的return问题
1 | try或catch中的return正常走完,确定好返回值,此时还不进行返回。 |
throw
throw关键字
1 | 作用: |
异常的处理方式
throws
交给别人处理,碰到异常不会往下执行。try{}catch(Exception e){}
自己处理,碰到异常会去执行catch中的代码,并往下执行。
异常的产生过程
线程
更多内容可参考文章Java并发编程转CL0610
并发&并行
进程的概念
线程的概念
多线程创建方式
- 通过继承Thread类,重写run方法
- 通过实现runable接口
- 通过实现callable接口,可参考有一千万个数,写一个程序进行高效求和
多线程内存图
线程状态
案例_包子铺&吃货
更多案例可参考一篇文章,让你彻底弄懂生产者–消费者问题
线程池
函数式编程
可参考Java 8 Lambda表达式,常用接口,Stream流式处理
递归
概念
1 | 递归:方法自己调用自己 |
案例_文件搜索
案例_计算1~n的和
Java-IO
网络编程
BS与CS
软件结构
通信协议
网络通信协议
:通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比交通规则一样。
在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。TCP/IP协议
:传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。
它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。
它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。应用层
:主要负责应用程序的协议,例如HTTP协议、FTP协议等。运输层
:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。网络层
:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。链路层
:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
协议分类
通信的协议还是比较复杂的,java.net
包中包含的类和接口,它们提供低层次的通信细节。
我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。
java.net
包中提供了两种常见的网络协议的支持:
- UDP:用户数据报协议(User Datagram Protocol)。
UDP是无连接
通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。
简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
UDP的交换过程如图所示。
特点:数据被限制在64kb以内,超出这个范围就不能发送了。
数据报(Datagram):网络传输的基本单位 - TCP:传输控制协议 (Transmission Control Protocol)。
TCP协议是面向连接
的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。
由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等。
三要素
网络编程三要素
协议
就是规则,上面已经阐述。
IP地址
IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。
IP地址用来给一个网络中的计算机设备做唯一的编号。
假如我们把“个人电脑”比作“一台电话”的话,那么“IP地址”就相当于“电话号码”。
IP地址分类如下:
IPv4
:是一个32位的二进制数,通常被分为4个字节,表示成a.b.c.d
的形式,例如192.168.65.100
。
其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。IPv6
:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。
为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
,
号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。
1 | 查看本机IP地址 |
注意:本机IP地址可表示成localhost
127.0.0.1
端口号
网络的通信,本质上是两个进程(应用程序)的通信。
每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。
- 端口号:用两个字节表示的整数,它的取值范围是0~65535。
其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。
注意:如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
总结:利用协议
+IP地址
+端口号
三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。
TCP通信
概述
TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。
两端通信时步骤:
- 服务端程序,需要事先启动,等待客户端的连接。
- 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
在Java中,提供了两个类用于实现TCP通信程序:
- 客户端:
java.net.Socket
类表示。创建Socket
对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。 - 服务端:
java.net.ServerSocket
类表示。创建ServerSocket
对象,相当于开启一个服务,并等待客户端的连接。
Socket
1 | TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器回写的数据 |
ServerSocket
1 | TCP通信的服务器端:接收客户端的请求,读取客户端发送的数据,给客户端回写数据 |