├── .gitignore
├── .idea
├── libraries
│ └── KotlinJavaRuntime.xml
├── misc.xml
├── modules.xml
├── uiDesigner.xml
└── workspace.xml
├── README.md
├── _config.yml
└── src
├── HelloKotlin.kt
├── Main.java
├── Outer.java
├── cls
└── sample
│ ├── HighLevelAnimal.kt
│ ├── NestedClass.kt
│ ├── Person.kt
│ └── Student.kt
├── data
└── sample
│ ├── Main.kt
│ └── User.kt
├── interfs
└── sample
│ ├── Main.kt
│ ├── NewsPaper.kt
│ ├── Readable.kt
│ ├── Reader.kt
│ └── StoryBook.kt
└── obj
└── sample
└── Main.kt
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | /out
3 |
--------------------------------------------------------------------------------
/.idea/libraries/KotlinJavaRuntime.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/uiDesigner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
7 |
8 | -
9 |
10 |
11 | -
12 |
13 |
14 | -
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 | -
24 |
25 |
26 |
27 |
28 |
29 | -
30 |
31 |
32 |
33 |
34 |
35 | -
36 |
37 |
38 |
39 |
40 |
41 | -
42 |
43 |
44 |
45 |
46 | -
47 |
48 |
49 |
50 |
51 | -
52 |
53 |
54 |
55 |
56 | -
57 |
58 |
59 |
60 |
61 | -
62 |
63 |
64 |
65 |
66 | -
67 |
68 |
69 |
70 |
71 | -
72 |
73 |
74 | -
75 |
76 |
77 |
78 |
79 | -
80 |
81 |
82 |
83 |
84 | -
85 |
86 |
87 |
88 |
89 | -
90 |
91 |
92 |
93 |
94 | -
95 |
96 |
97 |
98 |
99 | -
100 |
101 |
102 | -
103 |
104 |
105 | -
106 |
107 |
108 | -
109 |
110 |
111 | -
112 |
113 |
114 |
115 |
116 | -
117 |
118 |
119 | -
120 |
121 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
534 |
535 |
536 |
537 |
538 | 1495419382862
539 |
540 |
541 | 1495419382862
542 |
543 |
544 |
545 |
546 |
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 |
572 |
573 |
574 |
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 |
590 |
591 |
592 |
593 |
594 |
595 |
596 |
597 |
598 |
599 |
600 |
601 |
602 |
603 |
604 |
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 |
618 |
619 |
620 |
621 |
622 |
623 |
624 |
625 |
626 |
627 |
628 |
629 |
630 |
631 |
632 |
633 |
634 |
635 |
636 |
637 |
638 |
639 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
704 |
705 |
706 |
707 |
708 |
709 |
710 |
711 |
712 |
713 |
714 |
715 |
716 |
717 |
718 |
719 |
720 |
721 |
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 |
730 |
731 |
732 |
733 |
734 |
735 |
736 |
737 |
738 |
739 |
740 |
741 |
742 |
743 |
744 |
745 |
746 |
747 |
748 |
749 |
750 |
751 |
752 |
753 |
754 |
755 |
756 |
757 |
758 |
759 |
760 |
761 |
762 |
763 |
764 |
765 |
766 |
767 |
768 |
769 |
770 |
771 |
772 |
773 |
774 |
775 |
776 |
777 |
778 |
779 |
780 |
781 |
782 |
783 |
784 |
785 |
786 |
787 |
788 |
789 |
790 |
791 |
792 |
793 |
794 |
795 |
796 |
797 |
798 |
799 |
800 |
801 |
802 |
803 |
804 |
805 |
806 |
807 |
808 |
809 |
810 |
811 |
812 |
813 |
814 |
815 |
816 |
817 |
818 |
819 |
820 |
821 |
822 |
823 |
824 |
825 |
826 |
827 |
828 |
829 |
830 |
831 |
832 |
833 |
834 |
835 |
836 |
837 |
838 |
839 |
840 |
841 |
842 |
843 |
844 |
845 |
846 |
847 |
848 |
849 |
850 |
851 |
852 |
853 |
854 |
855 |
856 |
857 |
858 |
859 |
860 |
861 |
862 |
863 |
864 |
865 |
866 |
867 |
868 |
869 |
870 |
871 |
872 |
873 |
874 |
875 |
876 |
877 |
878 |
879 |
880 |
881 |
882 |
883 |
884 |
885 | No facets are configured
886 |
887 |
888 |
889 |
890 |
891 |
892 |
893 |
894 |
895 |
896 |
897 |
898 |
899 |
900 |
901 |
902 |
903 |
904 |
905 |
906 |
907 |
908 | 1.8
909 |
910 |
911 |
912 |
913 |
914 |
915 |
916 |
917 |
918 |
919 |
920 | HelloKotlin
921 |
922 |
923 |
924 |
925 |
926 |
927 |
928 |
929 |
930 |
931 |
932 |
933 | KotlinJavaRuntime
934 |
935 |
936 |
937 |
938 |
939 |
940 |
941 |
942 |
943 |
944 |
945 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Java to Kotlin 语法清单
2 |
3 |

4 | 时刻对新事物保持好奇心
5 |
6 | > Google I/O 2017 宣布在 Android Studio 3.0 将默认支持 Kotlin 用于 Android 开发. 请注意 Google 只是宣布 Kotlin 作为 Android 开发的一级语言,并没有说要用其取代 Java ,这里很多无脑媒体进行了过度解读。作为一名合格的程序员,首先要理性看待技术迭代更新,同时要对新事物保持强烈的好奇心。
7 |
8 | ## Kotlin 简介
9 | Kotlin 来自于捷克一家牛逼软件研发公司 JetBrains ,很多优秀的 IDE,如 IntelliJ IDEA、PyCharm、WebStorm 等都是它的杰作,包括 Google 官方的 Android IDE -- Android Studio ,也是 IntelliJ IDEA 的插件版。
10 |
11 | Kotlin 源于 JetBrains 的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛 ( Kotlin Island ) ,JetBrains 在 2010 年首次推出 Kotlin 编程语言,并在次年将之开源。
12 |
13 | ## Kotlin 的特点
14 | Kotlin 是一个基于 JVM 的编程语言,与 Java 有很深的渊源。它能与 Java 100% 互通,具备诸多 Java 尚不支持的新特性。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript ,方便在没有 JVM 的设备上运行,可用于移动端以及 Web 开发,是一种全栈式开发语言。
15 |
16 | ## Java to Kotlin
17 | 下面是 Java to Kotlin 主要语法,以便于你快速认识 Kotlin 这门语言。
18 |
19 | ### 变量
20 | **Java**
21 | ```java
22 | String lan = "Hello Kotlin";
23 |
24 | final String lan = "Hello Kotlin";
25 | ```
26 | **Kotlin**
27 | ```kotlin
28 | var lan = "Hello Kotlin"
29 |
30 | val lan = "Hello Kotlin"
31 | ```
32 | ---
33 |
34 | ### 打印字符串
35 | **Java**
36 | ```java
37 | System.out.print("Hello Kotlin");
38 |
39 | System.out.println("Hello Kotlin");
40 | ```
41 | **Kotlin**
42 | ```kotlin
43 | print("Hello Kotlin");
44 |
45 | println("Hello Kotlin");
46 | ```
47 | ---
48 | ### 字符串模板
49 | **Java**
50 | ```java
51 | String name = "haohao";
52 |
53 | int age = 25;
54 |
55 | String msg = "I am " + name + ", " + age + " years old.";
56 |
57 | String text = "Hello Kotlin\n" +
58 | "Hello Android\n" +
59 | "Hello TensorFlow";
60 | ```
61 | **Kotlin**
62 | ```kotlin
63 | var name = "haohao";
64 |
65 | var age = 25;
66 |
67 | var msg = "I am $name , $age years old.";
68 |
69 | var text = """
70 | |Hello Kotlin
71 | |Hello Android
72 | |Hello TensorFlow
73 | """.trimMargin()
74 | // trimMargin() 去除连接符 `|`
75 |
76 | ```
77 | ---
78 | ### 空声明
79 | **Java**
80 | ```java
81 | String name = null;
82 | ```
83 | **Kotlin**
84 | ```kotlin
85 | var name: String? = null // `?` 声明变量可为 null
86 | ```
87 | ---
88 | ### 判空
89 | **Java**
90 | ```java
91 | if (name != null) {
92 |
93 | int len = name.length;
94 | }
95 |
96 | ```
97 | **Kotlin**
98 | ```kotlin
99 | name?.let{
100 |
101 | val len = name.length
102 | }
103 | ```
104 | ---
105 | ### 逻辑表达式
106 | **Java**
107 | ```java
108 | String y = x > 6 ? "x > 6" : "x <= 6";
109 | ```
110 | **Kotlin**
111 | ```kotlin
112 | var y = if (x > 6)
113 | "x > 6"
114 | else "x <= 6"
115 | ```
116 | ---
117 | ### 类型判断及转换
118 | **Java**
119 | ```java
120 | if (obj instanceof Person) {
121 |
122 | Person p = (Person) obj;
123 | }
124 | ```
125 | **Kotlin**
126 | ```kotlin
127 | if (obj is Person) {
128 |
129 | var p = obj //智能转换
130 | }
131 | ```
132 | ---
133 | ### 区间
134 | **Java**
135 | ```java
136 | if (value >= 0 && value <= 100) {
137 | }
138 |
139 | for (int i = 1; i <= 100 ; i++) {}
140 |
141 | for (int i = 1; i < 100 ; i++) {}
142 |
143 | for (int i = 100; i >= 0 ; i--) {}
144 |
145 | for (int i = 1; i <= 100 ; i+=2) {}
146 |
147 | for (int i = 100; i >= 0 ; i-=2) {}
148 |
149 | ```
150 | **Kotlin**
151 | ```kotlin
152 | if (value is 0..100) {
153 | }
154 |
155 | for (i in 1..100 ) {}
156 |
157 | for (i in 1 until 100) {} // 半开区间:不包含 100
158 |
159 | for (i in 100 downTo 0) {}
160 |
161 | for (i in 1..100 step 2) {}
162 |
163 | for (i in 100 donwTo 1 step 2) {}
164 | ```
165 | ---
166 | ### list 和 map ( 针对 Java 8 之前版本 )
167 | **Java**
168 | ```java
169 | List list = Arrays.asList(1, 2, 3, 4);
170 |
171 | for(Integer value : list) {
172 |
173 | System.out.println(value);
174 | }
175 |
176 | Map map = new HashMap<>();
177 |
178 | map.put(1, "Java");
179 |
180 | map.put(2, "Kotlin");
181 |
182 | map.put(3, "iOS");
183 |
184 | map.put(4, "React Native");
185 |
186 |
187 | Iterator> iterator = map.entrySet().iterator();
188 |
189 | while (iterator.hasNext()) {
190 |
191 | Map.Entry entry = iterator.next();
192 |
193 | System.out.println(entry.getKey() + " , " + entry.getValue());
194 | }
195 |
196 |
197 | ```
198 | **Kotlin**
199 | ```kotlin
200 | var list = listOf(1, 2, 3, 4);
201 |
202 | list.forEach {
203 |
204 | println(it)
205 | }
206 |
207 | var map = mapOf(1 to "Java", 2 to "Kotlin", 3 to "iOS", 4 to "React Native")
208 |
209 | map.forEach { key, value ->
210 |
211 | println("$key, $value")
212 | }
213 |
214 | // 或者
215 |
216 | for ((key, value) in map) {
217 |
218 | println("$key, $value")
219 | }
220 |
221 | ```
222 | ---
223 | ### 开关语句
224 | **Java**
225 | ```java
226 | int score = // some score
227 | String grade;
228 | switch (score) {
229 | case 10:
230 | case 9:
231 | grade = "Excellent";
232 | break;
233 | case 8:
234 | case 7:
235 | case 6:
236 | grade = "Good";
237 | break;
238 | case 5:
239 | case 4:
240 | grade = "Ok";
241 | break;
242 | case 3:
243 | case 2:
244 | case 1:
245 | grade = "Fail";
246 | break;
247 | default:
248 | grade = "Fail";
249 | }
250 | ```
251 | **Kotlin**
252 | ```kotlin
253 | var score = // some score
254 | var grade = when (score) {
255 |
256 | 9, 10 -> "Excellent"
257 |
258 | in 6..8 -> "Good"
259 |
260 | 4, 5 -> "Ok"
261 |
262 | in 1..3 -> "Fail"
263 |
264 | else -> "Fail"
265 | }
266 | ```
267 | ---
268 | ### 流水线
269 | **Java**
270 | ```java
271 | List list = Arrays.asList("java", "c++", "Android", "Kotlin", "iOS");
272 |
273 | for(int i = 0; i < list.size(); i++ ) {
274 |
275 | list.set(i, "Hello " + list.get(i));
276 |
277 | if (!list.get(i).contains("c")) {
278 |
279 | System.out.println(list.get(i));
280 | }
281 | }
282 |
283 | //输出:
284 | // Hello java
285 | // Hello Android
286 | // Hello Kotlin
287 | // Hello iOS
288 | ```
289 | **Kotlin**
290 | ```kotlin
291 | var list = arrayOf("java", "c++", "Android", "Kotlin", "iOS")
292 |
293 | list.map {
294 |
295 | "Hello $it"
296 |
297 | }.filter {
298 |
299 | !it.contains("c")
300 |
301 | }.forEach {
302 |
303 | println(it)
304 |
305 | }
306 |
307 | //输出:
308 | // Hello java
309 | // Hello Android
310 | // Hello Kotlin
311 | // Hello iOS
312 | ```
313 | ---
314 | ### 函数
315 | **Java**
316 | ```java
317 | public final void func() {}
318 |
319 | public final int func(int value) {
320 |
321 | return 1 * value;
322 | }
323 |
324 | ```
325 | **Kotlin**
326 | ```kotlin
327 | fun func() {}
328 |
329 | fun func(value: Int): Int {
330 |
331 | return 1 * value
332 | }
333 |
334 | // 或者
335 |
336 | fun func(value: Int): Int = 1 * value
337 | ```
338 | ---
339 | ### 类
340 | **Java**
341 | ```java
342 | public final class Person {
343 |
344 | private String name = null;
345 |
346 | private int age = 25;
347 |
348 | private Person() {
349 | }
350 |
351 | public Person(String name, int age) {
352 |
353 | this.name = name;
354 | this.age = age;
355 | }
356 | }
357 |
358 | ```
359 | **Kotlin**
360 | ```kotlin
361 | class Person private constructor() {
362 |
363 | private var name: String? = null
364 |
365 | private var age: Int = 25
366 |
367 | constructor (name: String, age: Int): this() {
368 |
369 | this.name = name
370 | this.age = age
371 | }
372 | }
373 | ```
374 | ---
375 | ### 静态方法( 伴生对象 )
376 | **Java**
377 | ```java
378 | public final class Manager {
379 |
380 | private Manager() {}
381 |
382 | public static Manager getInstance () {
383 |
384 | return new Manager();
385 | }
386 | }
387 |
388 | ```
389 | **Kotlin**
390 | ```kotlin
391 | class Manager private constructor() {
392 |
393 | companion object {
394 |
395 | fun getInstance(): Manager = Manager()
396 | }
397 | }
398 |
399 | ```
400 | ---
401 | ### 实体类
402 | **Java**
403 | ```java
404 | public class Person {
405 |
406 | public String name;
407 |
408 | public age;
409 |
410 | public Person(String name, int age) {
411 |
412 | this.name = name;
413 | this.age = age;
414 | }
415 |
416 | public String getName() {
417 | return name;
418 | }
419 |
420 | public void setName(String name) {
421 | this.name = name;
422 | }
423 |
424 | public int getAge() {
425 | return age;
426 | }
427 |
428 | public void setAge(int age) {
429 | this.age = age;
430 | }
431 |
432 | @Override
433 | public boolean equals(Object o) {
434 | if (this == o) return true;
435 | if (o == null || getClass() != o.getClass()) return false;
436 |
437 | Person person = (Person) o;
438 |
439 | if (age != person.age) return false;
440 | return name != null ? name.equals(person.name) : person.name == null;
441 |
442 | }
443 |
444 | @Override
445 | public int hashCode() {
446 | int result = name != null ? name.hashCode() : 0;
447 | result = 31 * result + age;
448 | return result;
449 | }
450 |
451 | @Override
452 | public String toString() {
453 | return "Person{" +
454 | "name='" + name + '\'' +
455 | ", age=" + age +
456 | '}';
457 | }
458 | }
459 |
460 | ```
461 | **Kotlin**
462 | ```kotlin
463 | data class Person(var name: String, var age: Int)
464 |
465 | ```
466 |
467 | ---
468 | ### 解构
469 | **Java**
470 | ```java
471 | Person p = new Person("haohao", 25);
472 |
473 | String name = p.getName();
474 |
475 | String age = p.getAge();
476 | ```
477 | **Kotlin**
478 | ```kotlin
479 | var p = Person("name", 25)
480 |
481 | var (name, age) = p
482 | ```
483 | ---
484 | ### 接口
485 | **Java**
486 |
487 | ```java
488 | interface Readable {
489 |
490 | String getContent();
491 | }
492 | ```
493 |
494 | ```java
495 | public final class Book implements Readable {
496 |
497 | @override
498 | public String getContent() {
499 |
500 | return "Hello";
501 | }
502 | }
503 | ```
504 | **Kotlin**
505 | ```kotlin
506 |
507 | // Kotlin 接口中可以设置抽象和非抽象方法,可以有属性但必须声明为抽象或提供访问器实现。
508 | interface Readable {
509 |
510 | fun getContent(): String
511 |
512 | fun getVersion(): Int = 0
513 |
514 | }
515 | ```
516 |
517 | ```kotlin
518 | class Book(): Readable {
519 |
520 | override fun getContent(): String = "Hello"
521 |
522 | override fun getVersion(): Int {
523 |
524 | return super.getVersion()
525 | }
526 | }
527 | ```
528 | ---
529 | ### 继承
530 | **Java**
531 |
532 | ```java
533 | public class Person {
534 |
535 | private String name = null;
536 |
537 | public Person(String name) {
538 | this.name = name;
539 |
540 | }
541 |
542 | public void sayHello() {
543 | System.out.println("Hello");
544 | }
545 |
546 | public final void sayGood() {
547 | System.out.println("Good");
548 | }
549 |
550 | }
551 | ```
552 |
553 | ```java
554 | public final class Student extends Person {
555 |
556 | private String school = null;
557 |
558 | public Student(String name, String school) {
559 | super(name);
560 | this.school = school;
561 | }
562 |
563 | @Override
564 | public void sayHello() {
565 | super.sayHello();
566 | System.out.println("Hello Student");
567 | }
568 | }
569 | ```
570 | **Kotlin**
571 | ```kotlin
572 | open class Person(private var name: String? = null) {
573 |
574 | open fun sayHello() = println("Hello")
575 |
576 | fun sayGood() = println("Good")
577 |
578 | }
579 | ```
580 |
581 | ```kotlin
582 | class Student(private var school: String? = null, name: String): Person(name) {
583 |
584 | override fun sayHello() {
585 | super.sayHello()
586 | println("Hello Student")
587 | }
588 |
589 | }
590 | ```
591 | ---
592 | ### 静态与非静态内部类
593 | **Java**
594 |
595 | ```java
596 | public final class Outer {
597 |
598 | private int bar = 100;
599 |
600 | public static class Nester {
601 |
602 | public final String foo() {
603 | return "Hello Kotlin!";
604 | }
605 | }
606 |
607 | public final class Inner {
608 |
609 | public final int foo() {
610 | return bar; // 可以访问外部类成员
611 | }
612 |
613 | }
614 |
615 | }
616 |
617 |
618 | System.out.println(new Outer.Nester().foo());
619 |
620 | // System.out.println(new Outer().Inner().foo()); 不能在其他类中实例化非静态内部类
621 |
622 | ```
623 |
624 | **Kotlin**
625 | ```kotlin
626 | class Outer {
627 | private var bar: Int = 100
628 |
629 | // 嵌套类
630 | class Nester {
631 | // 不能访问外部类成员
632 | fun foo() = "Hello Kotlin!"
633 | }
634 |
635 | // 内部类
636 | inner class Inner {
637 | // 可以访问外部类成员
638 | fun foo() = bar
639 | }
640 | }
641 |
642 |
643 |
644 | println(Outer.Nested().foo())
645 |
646 | println(Outer().Inner().foo())
647 |
648 | ```
649 | ---
650 | ### 匿名内部类
651 | **Java**
652 | ```java
653 | view.setOnClickListener(new OnClickListener() {
654 |
655 | @override
656 | onClick(View view){
657 | // to do something.
658 | }
659 |
660 | });
661 | ```
662 | **Kotlin**
663 | ```kotlin
664 | interface OnClickListener {
665 | fun onClick()
666 | }
667 |
668 | class View(){
669 | var listener: OnClickListener? = null
670 |
671 | fun setOnClickListener(listener: OnClickListener) {
672 | this.listener = listener
673 | }
674 | }
675 |
676 | view.setOnClickListener(object : OnClickListener{
677 | override fun onClick() {
678 | TODO("not implemented")
679 | }
680 | })
681 |
682 | ```
683 | ---
684 | ### 扩展
685 | **Java**
686 | ```java
687 | // Java 类不能直接进行扩展
688 | ```
689 | **Kotlin**
690 |
691 | ```kotlin
692 | // 一般扩展
693 | class MyClass {
694 | fun foo() = println("member")
695 | }
696 |
697 | fun MyClass.bar() = println("extension")
698 |
699 | MyClass().bar()
700 |
701 | //输出: extension
702 |
703 | ```
704 |
705 | ```kotlin
706 | // 扩展函数与成员函数相同
707 | class MyClass {
708 |
709 | fun foo() = println("member")
710 | }
711 |
712 | fun MyClass.foo() = println("extension") // 扩展函数与成员函数相同时, 成员函数优先
713 |
714 | fun MyClass.foo(para: Int) = println("extension")
715 |
716 | MyClass().foo()
717 |
718 | MyClass().foo(0)
719 |
720 | //输出:
721 | // member
722 | // extension
723 |
724 | ```
725 | ---
726 | ### Kotlin Call Java
727 | **Java**
728 | ```java
729 | public class Person {
730 | private String name = null;
731 | private int age = 0;
732 |
733 | public Person(String name, int age) {
734 | this.name = name;
735 | this.age = age;
736 | }
737 |
738 | public Person() {
739 | }
740 |
741 | public String getName() {
742 | return name;
743 | }
744 |
745 | public int getAge() {
746 | return age;
747 | }
748 |
749 | public void setName(String name) {
750 | this.name = name;
751 | }
752 |
753 | public void setAge(int age) {
754 | this.age = age;
755 | }
756 |
757 | @Override
758 | public String toString() {
759 | return "name : " + name + ", age : " + age;
760 | }
761 | }
762 |
763 | ```
764 | **Kotlin**
765 |
766 | ```kotlin
767 | var p = Person()
768 | p.name = "haohao"
769 | p.age = 25
770 |
771 | println(p.toString())
772 |
773 | // name : haohao, age : 25
774 |
775 | ```
776 | ---
777 | ### Java Call Kotlin
778 |
779 | **Kotlin**
780 |
781 | ```kotlin
782 | // Example.kt
783 | package demo
784 |
785 | class MyClass
786 |
787 | fun func() {
788 |
789 | }
790 |
791 | ```
792 |
793 | **Java**
794 | ```java
795 | new demo.MyClass();
796 |
797 | demo.ExampleKt.func();
798 | ```
799 | ---
800 | ### 泛型
801 | **Java**
802 | ```java
803 | public final class Wrapper {
804 | private T item;
805 | public Wrapper(T item) {
806 | this.item = item;
807 | }
808 |
809 | public T getItem() {
810 | return item;
811 | }
812 | }
813 |
814 | Wrapper wrapper = new Wrapper<>("Hello Kotlin");
815 | System.out.println(wrapper.getItem());
816 |
817 | ```
818 | **Kotlin**
819 | ```kotlin
820 | class Wrapper(val item: T)
821 |
822 | var wrapper = Wrapper("Hello Kotlin")
823 | println(wrapper.item)
824 |
825 | ```
826 | ---
827 | ### 匿名函数 ( Lambda 表达式 )
828 | **Java (Java 8)**
829 | ```java
830 | new Thread(() -> {
831 |
832 | System.out.println("Hello Kotlin");
833 |
834 | }).start();
835 |
836 | // 同下
837 |
838 | new Thread(new Runnable() {
839 |
840 | @Override
841 | public void run() {
842 |
843 | System.out.println("Hello Kotlin");
844 |
845 | }
846 |
847 | }).start();
848 |
849 | ```
850 | **Kotlin**
851 | ```kotlin
852 | Thread(Runnable {
853 |
854 | println("Hello Kotlin")
855 |
856 | }).start()
857 |
858 | // Kotlin Lambda 表达式语法
859 |
860 | val sum = {x: Int, y: Int -> x + y }
861 |
862 | val sum1: (Int, Int) -> Int = {x, y -> x + y }
863 |
864 | val sum2 = fun(x: Int, y: Int): Int {
865 | return x + y
866 | }
867 |
868 | println(sum(2,8))
869 |
870 | println(sum1(2,8))
871 |
872 | println(sum2(2,8))
873 |
874 | //输出:
875 | // 10
876 | // 10
877 | // 10
878 | // Hello Kotlin
879 | ```
880 | ---
881 | ### Kotlin 高阶函数
882 | **Java**
883 | ```java
884 | // Java 不能直接实现高阶函数
885 | ```
886 | **Kotlin**
887 | ```kotlin
888 | // 高阶函数,即一个函数可作为高阶函数的参数
889 | fun superFunc(desc: String?, method: () -> String) {
890 | print(desc)
891 | println(method())
892 | }
893 |
894 |
895 | fun argFun() = "我是高阶函数的参数"
896 |
897 | //使用高阶函数
898 |
899 | superFunc("这是一个高阶函数 ", ::argFun)
900 |
901 | superFunc("这是一个高阶函数 ", { argFun() })
902 |
903 | superFunc("这是一个高阶函数 ") { argFun() }
904 |
905 |
906 | //输出:
907 | // 这是一个高阶函数 我是高阶函数的参数
908 | // 这是一个高阶函数 我是高阶函数的参数
909 | // 这是一个高阶函数 我是高阶函数的参数
910 |
911 | ```
912 | ---
913 | ### 简单异步
914 | **Java (Java 8)**
915 | ```java
916 | new Thread(() -> {
917 |
918 | data = DataSource.obtain(); //耗时操作
919 |
920 | runOnUiThread(() -> {
921 |
922 | view.load(data); //更新 UI
923 |
924 | });
925 |
926 | }).start();
927 |
928 | ```
929 | **Kotlin (Kotlin Anko)**
930 | ```kotlin
931 | async {
932 |
933 | data = DataSource.obtain(); //耗时操作
934 |
935 | uiThread {
936 | view.load(data); //更新 UI
937 | }
938 | }
939 | ```
940 | ---
941 | ### 泛型函数
942 | **Java**
943 | ```java
944 | // Java 不能单独实现泛型函数
945 | ```
946 | **Kotlin**
947 | ```kotlin
948 | fun singletonList(item: T): List {
949 | return arrayListOf(item)
950 | }
951 |
952 | val list = singletonList("kotlin")
953 | ```
954 | ---
955 | ### 嵌套函数
956 | **Java**
957 | ```java
958 | // Java 不支持嵌套函数
959 | ```
960 | **Kotlin**
961 | ```kotlin
962 | fun main(args: Array) {
963 |
964 | fun sayHello() {
965 | println("Hello Kotlin")
966 | }
967 |
968 | sayHello();
969 | }
970 | // 输出:
971 | // Hello Kotlin
972 | ```
973 | ---
974 | ### Kotlin 内联具体化
975 |
976 | **Kotlin**
977 | ```kotlin
978 | inline fun Activity.gotoActivity() {
979 |
980 | val intent = Intent(this, T::class.java)
981 | this.startActivity(intent)
982 | }
983 |
984 | gotoActivity()
985 |
986 | ```
987 | ---
988 |
989 | ### Kotlin lazy 懒加载
990 |
991 | **Kotlin**
992 | ```kotlin
993 | val lazyValue: String by lazy {
994 | println("init") //第一次使用时才被初始化
995 | "Hello Kotlin"
996 | }
997 |
998 | fun main(args: Array) {
999 | println(lazyValue)
1000 | println(lazyValue)
1001 | }
1002 |
1003 | //输出:
1004 | // init
1005 | // Hello Kotlin
1006 | // Hello Kotlin
1007 | ```
1008 | ---
1009 |
1010 | ### Kotlin observable 观察者
1011 |
1012 | **Kotlin**
1013 | ```kotlin
1014 | class Person{
1015 | public var name: String by Delegates.observable("init .. "){
1016 | property,oldValue,newValue -> println("property : $property, oldValue : $oldValue, newValue : $newValue")
1017 | }
1018 | }
1019 |
1020 | fun main(args: Array) {
1021 | val person = Person()
1022 |
1023 | println(person.name)
1024 |
1025 | person.name = "haohao"
1026 | person.name = "nannan"
1027 | }
1028 |
1029 | //输出:
1030 | // init ..
1031 | // property : var Person.name: kotlin.String, oldValue : init .. , newValue : haohao
1032 | // property : var Person.name: kotlin.String, oldValue : haohao, newValue : nannan
1033 | ```
1034 | ---
1035 | ### Kotlin 闭包
1036 |
1037 | **Kotlin**
1038 | ```kotlin
1039 | val plus = {x: Int, y: Int -> println("$x plus $y is ${x+y}")}
1040 |
1041 | val hello = {println("Hello Kotlin")}
1042 |
1043 | fun main(args: Array) {
1044 |
1045 | {x: Int, y: Int ->
1046 | println("$x plus $y is ${x+y}")
1047 | }(2, 8) // 自执行的闭包
1048 |
1049 | plus(2, 8)
1050 | hello()
1051 | }
1052 |
1053 | //输出:
1054 | // 2 plus 8 is 10
1055 | // 2 plus 8 is 10
1056 | // Hello Kotlin
1057 | ```
1058 | ---
1059 | ### 持续更新中...
1060 |
1061 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/src/HelloKotlin.kt:
--------------------------------------------------------------------------------
1 | import cls.sample.Student
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/22.
5 | */
6 | fun main(args: Array) {
7 | var list = arrayOf("java", "c++", "Android", "Kotlin", "iOS")
8 | list.map {
9 | "Hello $it"
10 | }.filter {
11 | !it.contains("c")
12 | }.forEach {
13 | println(it)
14 | }
15 |
16 | //var p = Person("nannan", 18, "China")
17 | var p = Person()
18 | var flag: Boolean? = true
19 | flag?.let {
20 | p.sayHello()
21 | }
22 |
23 | var s = Student("zstu", "haohao")
24 | s.sayHello()
25 |
26 | var shape = Shape(Drawer("react"))
27 | shape.drawShape()
28 |
29 | val map = mapOf("a" to 1, "b" to 2, "c" to 3)
30 | map.forEach { (t, u) ->
31 | println("$t, $u")
32 | }
33 |
34 | for ((key, value) in map) {
35 | println("$key, $value")
36 | }
37 | }
38 |
39 | //class Person(var name: String, var age: Int = 18) {
40 | //
41 | // private var address: String? = null
42 | //
43 | // init {
44 | // name = "haohao"
45 | // }
46 | //
47 | // constructor(name: String, age: Int, address: String) : this(name, age){
48 | // this.address = address
49 | // }
50 | //
51 | // internal fun sayHello() {
52 | // println("Hello! I am $name, $age, from $address")
53 | // }
54 | //}
55 |
56 | class Person public constructor() {
57 | private var name: String? = null
58 | private var age: Int = 25
59 |
60 | constructor (name: String, age: Int) : this() {
61 | this.name = name
62 | this.age = age
63 | }
64 |
65 | internal fun sayHello() {
66 | println("Hello! I am $name, $age.")
67 | }
68 | }
69 |
70 | class Shape (private var drawer: Drawer?){
71 |
72 | fun drawShape(){
73 | drawer?.draw()
74 | }
75 |
76 | }
77 |
78 | open class Drawer constructor(var name: String?){
79 |
80 | fun draw(){
81 | println("Draw $name")
82 | }
83 |
84 | }
85 |
86 |
--------------------------------------------------------------------------------
/src/Main.java:
--------------------------------------------------------------------------------
1 | import java.util.*;
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/25.
5 | */
6 | public class Main {
7 |
8 | public static void main(String[] args) {
9 | Map map = new HashMap<>();
10 | map.put(1, "Java");
11 | map.put(2, "Kotlin");
12 | map.put(3, "iOS");
13 | map.put(4, "React Native");
14 |
15 | Iterator> iterator = map.entrySet().iterator();
16 | while (iterator.hasNext()) {
17 | Map.Entry entry = iterator.next();
18 | System.out.println(entry.getKey() + " , " + entry.getValue());
19 | }
20 |
21 | List list = Arrays.asList("java", "c++", "Android", "Kotlin", "iOS");
22 |
23 | for(int i = 0; i < list.size(); i++ ) {
24 | list.set(i, "Hello " + list.get(i));
25 | if (!list.get(i).contains("c")) {
26 | System.out.println(list.get(i));
27 | }
28 | }
29 |
30 |
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/Outer.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by HaohaoChang on 2017/5/25.
3 | */
4 | public final class Outer {
5 |
6 | private int bar = 100;
7 |
8 | public static class Nester {
9 |
10 | public final String foo() {
11 |
12 | return "Hello Kotlin!";
13 | }
14 | }
15 |
16 | public final class Inner {
17 |
18 | public final int foo() {
19 | return bar;
20 | }
21 |
22 | }
23 |
24 | }
25 |
26 |
--------------------------------------------------------------------------------
/src/cls/sample/HighLevelAnimal.kt:
--------------------------------------------------------------------------------
1 | package cls.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/22.
5 | */
6 |
7 | abstract class HighLevelAnimal {
8 | }
9 |
10 | //fun packageFun() {
11 | // println("Hello! I am package function.")
12 | //}
--------------------------------------------------------------------------------
/src/cls/sample/NestedClass.kt:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | package cls.sample
5 |
6 | import obj.sample.OnClickListener
7 | import obj.sample.View
8 |
9 | /**
10 | * Created by HaohaoChang on 2017/5/25.
11 | */
12 |
13 |
14 | class Outer {
15 | private val bar: Int = 12
16 |
17 | // 嵌套类
18 | class Nested {
19 | // 不能访问外部类成员
20 | fun foo() = "hello"
21 | }
22 |
23 | // 内部类
24 | inner public final class Inner {
25 | // 可以访问外部类成员
26 | fun foo() = bar
27 | }
28 | }
29 |
30 | val view = View()
31 |
32 |
33 | fun main(args: Array) {
34 |
35 | println(Outer.Nested().foo())
36 | println(Outer().Inner().foo())
37 |
38 | // 使用对象表达式创建匿名内部类
39 | view.setOnClickListener(object : OnClickListener{
40 | override fun onClick() {
41 | TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
42 | }
43 | })
44 |
45 | }
--------------------------------------------------------------------------------
/src/cls/sample/Person.kt:
--------------------------------------------------------------------------------
1 | package cls.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/22.
5 | */
6 | open class Person(private var name: String) : HighLevelAnimal() {
7 | open fun sayHello() = println("Hello! I am $name")
8 |
9 | fun say(){
10 |
11 | }
12 | }
--------------------------------------------------------------------------------
/src/cls/sample/Student.kt:
--------------------------------------------------------------------------------
1 | package cls.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/22.
5 | */
6 | class Student(private var school: String?, name: String): Person(name){
7 | override fun sayHello() {
8 | super.sayHello()
9 | println("I am from $school")
10 | }
11 |
12 |
13 |
14 | //如果父类函数没有标注 open 如 Person.say(),则子类中不允许定义同名的函数, 不论加不加 override 。
15 | // fun say(){
16 | //
17 | // }
18 | }
--------------------------------------------------------------------------------
/src/data/sample/Main.kt:
--------------------------------------------------------------------------------
1 | package data.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/24.
5 | */
6 | fun main(args: Array) {
7 | val haohao = User("haohao", 18)
8 | val zuozuo = haohao.copy("zuozuo",1)
9 | println(zuozuo.toString())
10 |
11 | //解构赋值
12 | val (name, age) = zuozuo
13 | println("$name, $age years old of age.")
14 | // val maps = mapOf(1 to "one", 2 to "two",3 to "three")
15 | // for ((key, value) in maps) {
16 | // println("key = $key, value = $value")
17 | // }
18 |
19 | }
--------------------------------------------------------------------------------
/src/data/sample/User.kt:
--------------------------------------------------------------------------------
1 | package data.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/24.
5 | */
6 | data class User(val name: String, val age: Int) {
7 | }
--------------------------------------------------------------------------------
/src/interfs/sample/Main.kt:
--------------------------------------------------------------------------------
1 | package interfs.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/23.
5 | */
6 | fun main(args: Array){
7 | val book = StoryBook("《十万个为什么?》")
8 | val newsPaper = NewsPaper("This is a news paper.")
9 | val reader = Reader()
10 | reader.read(book)
11 | reader.read(newsPaper)
12 | }
--------------------------------------------------------------------------------
/src/interfs/sample/NewsPaper.kt:
--------------------------------------------------------------------------------
1 | package interfs.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/23.
5 | */
6 | class NewsPaper(private var news: String): Readable {
7 | override val content: String
8 | get() = news //To change initializer of created properties use File | Settings | File Templates.
9 |
10 | override fun requireContent(): String {
11 | return super.requireContent()
12 | }
13 |
14 | }
--------------------------------------------------------------------------------
/src/interfs/sample/Readable.kt:
--------------------------------------------------------------------------------
1 | package interfs.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/23.
5 | */
6 | interface Readable {
7 | val content: String
8 |
9 | fun requireContent(): String = content
10 |
11 | }
--------------------------------------------------------------------------------
/src/interfs/sample/Reader.kt:
--------------------------------------------------------------------------------
1 | package interfs.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/23.
5 | */
6 | class Reader() {
7 |
8 | fun read(readable: Readable?){
9 | println(readable?.requireContent())
10 | }
11 | }
--------------------------------------------------------------------------------
/src/interfs/sample/StoryBook.kt:
--------------------------------------------------------------------------------
1 | package interfs.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/23.
5 | */
6 | class StoryBook(private var story:String): Readable {
7 | override val content: String
8 | get() = story //To change initializer of created properties use File | Settings | File Templates.
9 |
10 | override fun requireContent(): String {
11 | return super.requireContent()
12 | }
13 | }
--------------------------------------------------------------------------------
/src/obj/sample/Main.kt:
--------------------------------------------------------------------------------
1 | package obj.sample
2 |
3 | /**
4 | * Created by HaohaoChang on 2017/5/24.
5 | */
6 | interface OnClickListener {
7 | fun onClick()
8 | }
9 |
10 | class View(){
11 | var listener: OnClickListener? = null
12 | fun setOnClickListener(listener: OnClickListener) {
13 | this.listener = listener
14 | }
15 | }
16 |
17 |
18 | //对象声明
19 | object SingletonManager {
20 | private var singletonContainer = HashMap()
21 |
22 | fun registerSingleton(key: String, value: Any) {
23 | singletonContainer.set(key, value)
24 | }
25 |
26 | fun getSingleton(key: String): Any? = singletonContainer.get(key)
27 | }
28 |
29 | //伴生对象
30 | interface Factory{
31 | fun create(): T
32 | }
33 |
34 | class Fragment {
35 | companion object : Factory {
36 | override fun create(): Fragment = Fragment()
37 | fun getTag(): String = Fragment.toString()
38 | }
39 | }
40 |
41 | fun main(args: Array) {
42 | val view = View()
43 | //对象表达式
44 | view.setOnClickListener(object : OnClickListener{
45 | override fun onClick() {
46 | TODO("not implemented")
47 | }
48 |
49 | })
50 |
51 | val person = object {
52 | var name: String? = null
53 | var age: Int = 0
54 | override fun toString(): String = "name = ${name}, age = ${age}"
55 | }
56 |
57 | person.name = "haohao"
58 | person.age = 18
59 | println("name = ${person.name}, age = ${person.age}")
60 |
61 | //对象声明
62 | SingletonManager.registerSingleton("view", view)
63 | SingletonManager.registerSingleton("person", person)
64 |
65 | println(SingletonManager.getSingleton("person"))
66 |
67 | //伴生对象
68 | //一个类只能有一个伴生对象
69 | val instance = Fragment.create()
70 | println(Fragment.getTag())
71 |
72 |
73 | }
--------------------------------------------------------------------------------