day11 网络编程
软件架构:
CS: Client客户端, Server服务器
BS: Browser浏览器, Server服务器
网络编程
Socket: 套接字 客户端
ServerSocket 服务端
TCP通信的三次握手
1. 客户端向服务端发送验证信息, 等待服务器确认
2. 服务端收到验证信息后, 回复客户端验证信息, 同时发送自己的一条验证信息
3. 客户端收到服务端回复的信息, 确认自己之前发的信息无误, 并再次向服务器发回服务端的验证信息
ServerSocket类
// 构造方法
ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口
// 成员方法
Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
Socket类
// 构造方法
Socket(String ip, int port): 创建TCP客户端对象
// 成员方法
OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
InputStream getInputStream(): 获取输入流, 用于接收数据
void shutdownOutput(): 关闭输出流, 发送结束标记
void close(): 关闭客户端Socket
day12 函数式接口
.StringBuilder类
reverse(): 将StringBuilder内部保存的内容反转
toString(): 转换为String
常用函数式接口
Supplier: 生产型函数式接口
抽象方法 T get(): 用于获取一个对象或值.
Consumer: 消费型函数式接口 使用值
默认方法 t andThen(Consumer<? super T> after): 拼接两个Consumer接口的Lambda对
象实现连续操作. 谁写前面, 谁先消费
Predicate: 条件判断型函数式接口 判断值
抽象方法 boolean test(T t): 判断参数传递的对象. 至于怎么判断, 判断什么, 需要我们编写Lambda表达式实现
Function: 转换型函数式接口 转换值
抽象方法 apply(T t): 将T转换为R. 至于T和R是什么类型, 以及如何转换, 需要传递Lambda表达式实现
day13 Stream 方法引用
Stream流
Pipelining(管道特性): "可以链式调用
内部迭代特性: "不用写for循环"
获取Stream流对象的2种方式:
1. 利用"Collection接口"中的默认方法 default Stream<E> stream() 方法: 集合转Stream对象
2. 利用"Stream接口"中的静态方法 static <T> Stream<T> of(T... values): 数组转Stream对象
tream filter(): 过滤
Stream map(): 映射/转换
Stream limit(): 截取
Stream skip(): 跳过
void forEach(): 遍历
long count(): 统计
方法引用
Lambda表达式写法:
(String s) -> System.out.println(s)
方法引用写法:
System.out::println
方法引用能简化以下场景: (方法名后不要写小括号)
场景 格式 简化之前的Lambda 方法引用简化后
1. 通过对象名引用成员方法 对象名::成员方法名 ()->person.eat() person::eat
2. 通过类名引用静态方法 类名::静态方法名 i -> Math.abs(i) Math::abs
3. 通过super引用父类成员方法 super::父类方法名 ()->super.eat(); super::eat
4. 通过this引用本类成员方法 this::本类方法名 ()->this.eat(); this::eat
5. 引用某个类的构造方法 类名::new name->new Person(name) Person::new
6. 引用创建数组的方法 数据类型[]::new length->new int[length]; int[]::new
day14 JUnit 反射 注解
JUnit单元测试
JUnit使用步骤:
1. 定义一个测试类(也叫测试用例)
包名:xxx.xxx.xx.test
被测试的类名: Calculator
对应的测试类名: CalculatorTest
2. 定义测试方法:可以独立运行
被测试的方法名: add()
对应的测试方法名: testAdd()
建议测试方法的返回值是void, 参数列表是空参
3. 在方法上加 @Test 注解
4. 在 @Test 注解上按 Alt+Enter, 选择 "Add 'JUnit4' to Classpath" 导入JUnit依赖环境
5. 在方法名上右键, 选择 "Run '方法名()'"
断言: Assert
使用断言操作 Assert.assertEquals(期望的结果, 运算的结果);
反射
成员变量(字段): Field类的对象 getFields()
构造方法: Constructor类的对象 getConstructors()
成员方法: Method类的对象 getMethods()
ava代码在计算机中的3个阶段:
SOURCE: 源代码阶段
CLASS: 类对象阶段
RUNTIME: 运行时阶段
取一个类的字节码对象的3种方式:
1. Class.forName("全类名")
将字节码文件加载进内存,返回Class对象
适用场景: 多用于配置文件,将类名定义在配置文件中. 读取文件, 加载类
2. 类名.class .
通过类名的属性class获取
适用场景: 多用于参数的传递 getConstructor(String.class, int.class)
3. 对象.getClass()
getClass()方法在Object类中定义
适用场景: 多用于对象的获取字节码的方式 p.getClass()
注解
@Override: 检测被该注解标注的方法是否是"重写"父类(接口)的
@Deprecated: 该注解标注的内容,表示已过时
@SuppressWarnings: 压制警告. 一般传递参数all @SuppressWarnings("all")
自定义注解
元注解
public @interface 注解名称 {
属性; (接口中的抽象方法)
枚举
public enum 枚举名 {
枚举常量1, 枚举常量2, 枚举常量3;
} |
|