Skip to content

Commit 3e43753

Browse files
committed
Update
1 parent 5e50767 commit 3e43753

File tree

9 files changed

+383
-35
lines changed

9 files changed

+383
-35
lines changed
Lines changed: 64 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,93 @@
1-
# 「一入 Java 深似海 」系列课程 - 第一期:语言基础与代码设计
21

3-
## 本期简介
42

5-
本期为[「一入 Java 深似海 」系列](https://segmentfault.com/n/1330000017785588)的首期直播,通过 JDK 以及部分开源工程的源码,将深入探讨 Java 编程语言的基础以及代码设计,期望达到融会贯通并学以致用的目的。
63

74

5+
## Java ⾯向对象基础
86

97

10-
## 内容详情
118

12-
### [第一节:Java 语言基础](https://segmentfault.com/ls/1650000017791749/l/1500000017790143)
9+
### ⽅法设计
1310

14-
- 主要内容
15-
- Java 面向过程编程:介绍 Java 中主要的数据结构、方法调用、执行流程
16-
- Java 面向对象基础:针对面向对象三大特性“封装性、派生性、多态性”作出具体化的说明
17-
- Java 函数式基础:针对 Java 8 Lambda 语法特性展开讨论,包括“函数式接口、默认方法、方法引用” 等方面,着重探讨函数式编程设计
18-
- Java 模块化基础:主要围绕 Java 动态代理,字节码提升
19-
- 课程总结
11+
- 单元:一个类或者一组类(组件)
12+
- 类采用名词结构
13+
- 动词过去式+名词
14+
- ContextRefreshedEvent
15+
- 动词ing + 名词
16+
- InitializingBean
17+
- 形容词 + 名词
18+
- ConfigurableApplicationContext
19+
- 执行:某个方法
20+
- 方法命名:动词
21+
- execute
22+
- callback
23+
- run
24+
- 方法参数:名词
25+
- 异常:
26+
- 根(顶层)异常
27+
- Throwable
28+
- checked 类型:Exception
29+
- unchecked类型:RuntimeException
30+
- 不常见:Error
31+
- Java 1.4 `java.lang.StackTraceElement`
32+
- 添加异常原因(cause)
33+
- 反模式:吞掉某个异常
34+
- 性能:注意 `fillInStackTrace()` 方法的开销,避免异常栈调用深度
35+
- 方法一:JVM 参数控制栈深度(物理屏蔽)
36+
- 方法二:logback 日志框架控制堆栈输出深度(逻辑屏蔽)
2037

38+
## 泛型设计
2139

40+
Java 泛型属于编译时处理,运行时擦写。
2241

23-
### [第二节:Java 面向对象设计](https://segmentfault.com/ls/1650000017791749/l/1500000017790217)
2442

25-
- 主要内容
26-
- 类/接口设计:介绍类、抽象类、接口命名、访问性设计以及“封装性、派生性、多态性”技巧
27-
- 枚举设计:理解枚举引入的意义以及变化,介绍 JDK 中常见枚举的设计
28-
- 泛型设计:了解泛型使用场景以及限制,通过 JDK 以及开源项目领悟其中的设计模式
29-
- 方法设计:介绍方法命名、返回类型、参数类型、名称以及数量的设计模式
30-
- 课程总结
3143

44+
## Java 函数式设计
3245

3346

34-
### [第三节:Java 函数式设计](https://segmentfault.com/ls/1650000017791749/l/1500000017790336)
3547

36-
- 主要内容
37-
- 函数式设计:讨论函数式设计技巧,如 `Supplier``Consumer` 以及 `Function` 在日常开发中的运用
38-
- `Stream` API:使用场景、常见操作以及注意事项
39-
- `Stream` API 设计:根据 `Stream` API 的特点,结合“SCFP”的特性从中设计相关的函数接口
48+
### 匿名内置类
4049

41-
- 课程总结
50+
基本特性:
4251

52+
- 无名称类
53+
- 声明位置(执行模块):
54+
- static block
55+
- 实例block
56+
- 方法
57+
- 构造器
58+
- 并非特殊的类结构
59+
- 类全名称:${package}.${declared_class}.${num}
4360

4461

45-
### [第四节:Java 模块化设计](https://segmentfault.com/ls/1650000017791749/l/1500000017790383)
4662

47-
- 主要内容
48-
- 模块化构建:Java、Maven、IDE 等构建方式
49-
- 模块化迁移:类库迁移、依赖管理分析、迁移案例等)
50-
- 模块化设计:模块解析、模块API 设计
51-
- 模块化反射:模块内省、模块运行时调整、模块注解
52-
- 课程总结
63+
## 函数式接口
5364

65+
基本特性:
5466

67+
- 所有的函数式接口都引用一段执行代码
68+
- 函数式接口没有固定的类型,固定模式( SCFP = Supplier + Consumer + Function + Predicate) + Action
69+
- 利用方法引用来实现模式匹配
5570

56-
## 社区交流
5771

58-
- 小马哥 VIP 交流群:**571055366**
5972

60-
> VIP 交流群仅提供给报名的小伙伴,敬请谅解!
73+
## 模块化
6174

75+
### 强封装性
6276

77+
基本特性
6378

64-
### [【返回主页】](https://segmentfault.com/n/1330000017785588)
79+
- 并非所有的 `public` Class 都可以被运用,需要 `exports` 来配合
80+
- `exports` 所配置的 `package` 下必须要有 Class
81+
82+
负面问题
83+
84+
- 对人的要求就高了(对 Class 透明化)
85+
- 必须了解相关 `module-info.java` 语义
86+
- 需要了解某些类的依赖
87+
- 需要了解某些类职责
88+
89+
个人观点
90+
91+
- 收益不大,代价不小
92+
- 对团队要求极高,容易出现互喷的情况
93+
- Java 9 之前采用 jar 文件管理,Java 9 模块化之后,编程了 module-info.java 管理,还需要考虑与 Maven 依赖管理组件如何配合
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.segmentfault;
2+
3+
public class Test2 {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.segmentfault.java;
2+
3+
public class Test {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.segmentfault.java.lesson1;
2+
3+
import java.util.logging.Logger;
4+
5+
public class FunctionMain {
6+
7+
/**
8+
* < Java 9
9+
* public : all
10+
* protected : 继承 + 同包
11+
* (default) : 同包
12+
* private : 当前类
13+
* <p>
14+
* >= Java 9
15+
*/
16+
17+
private static final Logger logger = Logger.getLogger("abc");
18+
19+
20+
public static void main(String[] args) {
21+
// byte(8) char(16) short(16) int(32) long(64)
22+
23+
try {
24+
execute();
25+
} catch (Throwable e) {
26+
logger.warning(e.getMessage());
27+
throw new RuntimeException(e);
28+
}
29+
30+
}
31+
32+
private static void execute() throws Throwable {
33+
34+
}
35+
}
36+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.segmentfault.java.lesson1;
2+
3+
import java.io.Serializable;
4+
import java.util.Collections;
5+
import java.util.List;
6+
7+
public class GenericTypeDemo {
8+
9+
/**
10+
* @param <S> 来源类型
11+
* @param <T> 转换类型
12+
*/
13+
public interface Converter<S, T extends Serializable> {
14+
15+
T convert(S source);
16+
}
17+
18+
public interface StringConverter<T extends Serializable> extends Converter<String,T> {
19+
20+
}
21+
22+
23+
public static void main(String[] args) {
24+
25+
Converter<Integer, String> stringConverter =
26+
new Converter<Integer, String>() {
27+
@Override
28+
public String convert(Integer source) {
29+
return String.valueOf(source);
30+
}
31+
};
32+
33+
new Converter<String, Integer>() {
34+
35+
@Override
36+
public Integer convert(String source) {
37+
return Integer.valueOf(source);
38+
}
39+
};
40+
41+
List<String> strings;
42+
43+
List<Integer> integers;
44+
45+
List<String> data = Collections.emptyList();
46+
47+
List data2 = Collections.emptyList();
48+
49+
data = data2;
50+
}
51+
52+
/**
53+
* 方法签名 #doConvert(List)
54+
*
55+
* @param value
56+
*/
57+
public static void doConvert(List<String> value) {
58+
59+
}
60+
61+
// 方法签名冲突, 方法签名 #doConvert(List)
62+
// public static void doConvert(List value) {
63+
//
64+
// }
65+
66+
public static void doConvert(List<Integer> value, int data) {
67+
68+
}
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.segmentfault.java.lesson1;
2+
3+
import java.awt.event.KeyEvent;
4+
import java.awt.event.KeyListener;
5+
import java.beans.PropertyChangeEvent;
6+
import java.beans.PropertyChangeListener;
7+
import java.util.concurrent.Callable;
8+
9+
/**
10+
* 内置类实例
11+
*/
12+
public class InnerClassDemo {
13+
14+
// Static 块
15+
static {
16+
new Runnable() {
17+
@Override
18+
public void run() {
19+
20+
}
21+
};
22+
}
23+
24+
// 实例块
25+
{
26+
new Callable() {
27+
@Override
28+
public Object call() throws Exception {
29+
return null;
30+
}
31+
};
32+
}
33+
34+
// 构造器
35+
public InnerClassDemo() {
36+
new Comparable(){
37+
38+
@Override
39+
public int compareTo(Object o) {
40+
return 0;
41+
}
42+
};
43+
}
44+
45+
public static void main(String[] args) {
46+
47+
// 方法(类或实例)
48+
PropertyChangeListener listener = new PropertyChangeListener() {
49+
@Override
50+
public void propertyChange(PropertyChangeEvent evt) {
51+
52+
}
53+
};
54+
}
55+
56+
static class PropertyChangeListenerImpl implements PropertyChangeListener {
57+
58+
@Override
59+
public void propertyChange(PropertyChangeEvent evt) {
60+
61+
new KeyListener(){
62+
@Override
63+
public void keyTyped(KeyEvent e) {
64+
65+
}
66+
67+
@Override
68+
public void keyPressed(KeyEvent e) {
69+
70+
}
71+
72+
@Override
73+
public void keyReleased(KeyEvent e) {
74+
75+
}
76+
};
77+
}
78+
}
79+
}

0 commit comments

Comments
 (0)