Skip to content

Commit 2161082

Browse files
committed
Add stage 1 lesson 2
1 parent 71b7490 commit 2161082

File tree

23 files changed

+991
-7
lines changed

23 files changed

+991
-7
lines changed

.gitignore

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,31 @@
1-
.DS_Store
2-
target
3-
*.class
4-
.settings
5-
.classpath
1+
# maven ignore
2+
target/
3+
*.jar
4+
!.mvn/wrapper/*
5+
*.war
6+
*.zip
7+
*.tar
8+
*.tar.gz
9+
10+
# eclipse ignore
11+
.settings/
612
.project
7-
.mvn
8-
.idea
13+
.classpath
14+
15+
# idea ignore
16+
.idea/
17+
*.ipr
18+
*.iml
19+
*.iws
20+
21+
# temp ignore
22+
*.log
23+
*.cache
24+
*.diff
25+
*.patch
26+
*.tmp
27+
28+
# system ignore
29+
.DS_Store
30+
Thumbs.db
31+
*.orig
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>com.segmentfault</groupId>
8+
<artifactId>deep-in-java</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
<packaging>pom</packaging>
11+
<name>「一入 Java 深似海 」系列</name>
12+
<modules>
13+
<module>stage-1</module>
14+
</modules>
15+
16+
17+
</project>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>stage-1</artifactId>
7+
<groupId>com.segmentfault</groupId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
<name>「一入 Java 深似海 」系列 :: 第一期 :: 第二节</name>
12+
<build>
13+
<plugins>
14+
<plugin>
15+
<groupId>org.apache.maven.plugins</groupId>
16+
<artifactId>maven-compiler-plugin</artifactId>
17+
<configuration>
18+
<source>8</source>
19+
<target>8</target>
20+
</configuration>
21+
</plugin>
22+
</plugins>
23+
</build>
24+
25+
<artifactId>stage-1-lesson-2</artifactId>
26+
27+
28+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.segmentfault.deep.in.java;
2+
3+
class ClassName {
4+
5+
public static void main(String[] args) {
6+
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.segmentfault.deep.in.java;
2+
3+
public class CloneableDemo {
4+
5+
public static void main(String[] args) throws CloneNotSupportedException {
6+
7+
String desc = "Hello,World";
8+
9+
Data data = new Data();
10+
data.setValue(1);
11+
data.setDesc(desc);
12+
13+
Data copy = data.clone();
14+
15+
System.out.println("data == copy " + (data == copy));
16+
17+
System.out.println(copy.hashCode() == data.hashCode());
18+
// 输出 1
19+
// 浅 Copy
20+
// 浅深主要在于对象类型
21+
System.out.println(copy.getValue());
22+
// 如果是浅拷贝的话
23+
// desc -> data.desc -> clone -> copy.desc == desc
24+
System.out.println(copy.getDesc() == desc);
25+
// 如果是深拷贝的话
26+
System.out.println(copy.getDesc().equals(desc));
27+
28+
29+
}
30+
31+
32+
}
33+
34+
class Data extends Object implements Cloneable {
35+
36+
private int value;
37+
38+
private String desc;
39+
40+
public int getValue() {
41+
return value;
42+
}
43+
44+
public void setValue(int value) {
45+
this.value = value;
46+
}
47+
48+
public String getDesc() {
49+
return desc;
50+
}
51+
52+
public void setDesc(String desc) {
53+
this.desc = desc;
54+
}
55+
56+
/**
57+
* 通常把 protected 访问性提升为 public
58+
* 强制调整为目标类型
59+
*
60+
* @return
61+
* @throws CloneNotSupportedException
62+
*/
63+
public Data clone() throws CloneNotSupportedException {
64+
Data copy = (Data) super.clone();
65+
// 原生类型没有浅深关系
66+
// 对象类型需要复制
67+
copy.desc = new String(this.desc);
68+
return copy;
69+
}
70+
71+
// @Override
72+
// public int hashCode() {
73+
// return value;
74+
// }
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
package com.segmentfault.deep.in.java;
2+
3+
import java.io.Serializable;
4+
import java.lang.reflect.Field;
5+
import java.lang.reflect.Member;
6+
import java.lang.reflect.Modifier;
7+
import java.util.stream.Collectors;
8+
import java.util.stream.Stream;
9+
10+
public class EnumClassDemo {
11+
12+
public static void main(String[] args) {
13+
14+
// Q1: THREE 到底是第几个定义的
15+
16+
// println(Counting.ONE);
17+
// println(Counting.FIVE);
18+
19+
// Q3: 为什么枚举会输出成员名称
20+
// println(CountingEnum.ONE);
21+
// println(CountingEnum.FIVE);
22+
//
23+
// printEnumMeta(CountingEnum.ONE);
24+
// printEnumMeta(CountingEnum.FIVE);
25+
26+
// 自定义实现 values()
27+
printCountingMembers();
28+
// Java 枚举字节码提升实现 values()
29+
printCountingEnumMembers();
30+
}
31+
32+
// Q2: 能否输出所有的成员
33+
public static void println(Counting counting) {
34+
System.out.println(counting);
35+
}
36+
37+
public static void println(CountingEnum countingEnum) {
38+
System.out.println(countingEnum);
39+
}
40+
41+
public static void printEnumMeta(Enum enumeration) {
42+
// 说明任何枚举都扩展了 java.lang.Enum
43+
System.out.println("Enumeration type : " + enumeration.getClass());
44+
// Enum#name() = 成员名称
45+
// Enum#ordinal() = 成员定义位置
46+
System.out.println("member : " + enumeration.name());
47+
System.out.println("ordinal : " + enumeration.ordinal());
48+
// values() 方法是 Java 编译器给枚举提升的方式
49+
}
50+
51+
public static void printCountingMembers() {
52+
Stream.of(Counting.values())
53+
.forEach(System.out::println);
54+
}
55+
56+
public static void printCountingEnumMembers() {
57+
Stream.of(CountingEnum.values())
58+
.forEach(System.out::println);
59+
}
60+
61+
62+
}
63+
64+
enum CountingEnum implements Cloneable {
65+
66+
ONE(1) {
67+
@Override
68+
public String valueAsString() {
69+
return String.valueOf(this.getValue());
70+
}
71+
},
72+
TWO(2) {
73+
@Override
74+
public String valueAsString() {
75+
return String.valueOf(this.getValue());
76+
}
77+
},
78+
THREE(3) {
79+
@Override
80+
public String valueAsString() {
81+
return String.valueOf(this.getValue());
82+
}
83+
},
84+
FOUR(4) {
85+
@Override
86+
public String valueAsString() {
87+
return String.valueOf(this.getValue());
88+
}
89+
},
90+
FIVE(5) {
91+
@Override
92+
public String valueAsString() {
93+
return String.valueOf(this.getValue());
94+
}
95+
};
96+
97+
private int value;
98+
99+
/* private */ CountingEnum(int value) {
100+
this.value = value;
101+
}
102+
103+
@Override
104+
public String toString() {
105+
return "CountingEnum : " + value;
106+
}
107+
108+
public abstract String valueAsString();
109+
110+
public int getValue() {
111+
return value;
112+
}
113+
}
114+
115+
//class ExtendedEnum extends CountingEnum {
116+
//
117+
//}
118+
119+
class ExtendedCounting extends Counting {
120+
121+
private ExtendedCounting(int value) {
122+
super(value);
123+
}
124+
125+
@Override
126+
public String valueAsString() {
127+
return toString();
128+
}
129+
}
130+
131+
/**
132+
* 枚举类:计数
133+
* 强类型约束(相对于常量)
134+
*/
135+
abstract class Counting extends Data implements Cloneable {
136+
137+
public static final Counting ONE = new Counting(1) {
138+
@Override
139+
public String valueAsString() {
140+
return String.valueOf(this.getValue());
141+
}
142+
};
143+
144+
public static final Counting TWO = new Counting(2) {
145+
@Override
146+
public String valueAsString() {
147+
return String.valueOf(this.getValue());
148+
}
149+
};
150+
151+
public static final Counting THREE = new Counting(3) {
152+
@Override
153+
public String valueAsString() {
154+
return String.valueOf(this.getValue());
155+
}
156+
};
157+
158+
public static final Counting FOUR = new Counting(4) {
159+
@Override
160+
public String valueAsString() {
161+
return String.valueOf(this.getValue());
162+
}
163+
};
164+
165+
public static final Counting FIVE = new Counting(5) {
166+
@Override
167+
public String valueAsString() {
168+
return String.valueOf(this.getValue());
169+
}
170+
};
171+
172+
private int value;
173+
174+
protected Counting(int value) {
175+
this.value = value;
176+
}
177+
178+
@Override
179+
public int getValue() {
180+
return value;
181+
}
182+
183+
public abstract String valueAsString();
184+
185+
@Override
186+
public String toString() {
187+
return "Counting : " + value;
188+
}
189+
190+
public static Counting[] values() {
191+
// Fields -> filter -> public static final fields -> get
192+
return Stream.of(Counting.class.getDeclaredFields())
193+
.filter(field -> {
194+
int modifiers = field.getModifiers();
195+
return Modifier.isPublic(modifiers) && Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers);
196+
}).map(field -> {
197+
// Field -> Counting
198+
try {
199+
return (Counting) field.get(null);
200+
} catch (IllegalAccessException e) {
201+
throw new RuntimeException(e);
202+
}
203+
}).collect(Collectors.toList()).toArray(new Counting[0]);
204+
205+
}
206+
207+
}

0 commit comments

Comments
 (0)