18
18
- [ 1.2.1. 字符型常量和字符串常量的区别?] ( #121-字符型常量和字符串常量的区别 )
19
19
- [ 1.2.2. 关于注释?] ( #122-关于注释 )
20
20
- [ 1.2.3. 标识符和关键字的区别是什么?] ( #123-标识符和关键字的区别是什么 )
21
- - [ 1.2.4. 自增自减运算符] ( #124-自增自减运算符 )
22
- - [ 1.2.5. Java中的几种基本数据类型是什么,对应的,各自占用多少字节呢?] ( #125-java中的几种基本数据类型是什么对应的各自占用多少字节呢 )
23
- - [ 1.2.6. 自动装箱与拆箱] ( #126-自动装箱与拆箱 )
24
- - [ 1.2.7. continue、break、和return的区别是什么?] ( #127-continuebreak和return的区别是什么 )
25
- - [ 1.3. 方法(函数)] ( #13-方法函数 )
26
- - [ 1.3.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?] ( #131-什么是方法的返回值返回值在类的方法里的作用是什么 )
27
- - [ 1.3.2. 为什么 Java 中只有值传递?] ( #132-为什么-java-中只有值传递 )
28
- - [ 1.3.3. 重载和重写的区别] ( #133-重载和重写的区别 )
29
- - [ 1.3.3.1. 重载] ( #1331-重载 )
30
- - [ 1.3.3.2. 重写] ( #1332-重写 )
31
- - [ 1.3.4. 深拷贝 vs 浅拷贝] ( #134-深拷贝-vs-浅拷贝 )
32
- - [ 1.3.5. 方法的四种类型] ( #135-方法的四种类型 )
21
+ - [ 1.2.4. Java中有哪些常见的关键字?] ( #124-java中有哪些常见的关键字 )
22
+ - [ 1.2.5. 自增自减运算符] ( #125-自增自减运算符 )
23
+ - [ 1.2.6. continue、break、和return的区别是什么?] ( #126-continuebreak和return的区别是什么 )
24
+ - [ 1.2.7. Java泛型了解么?什么是类型擦除?介绍一下常用的通配符?] ( #127-java泛型了解么什么是类型擦除介绍一下常用的通配符 )
25
+ - [ 1.3. 基本数据类型] ( #13-基本数据类型 )
26
+ - [ 1.3.1. Java中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?] ( #131-java中的几种基本数据类型是什么对应的包装类型是什么各自占用多少字节呢 )
27
+ - [ 1.3.2. 自动装箱与拆箱] ( #132-自动装箱与拆箱 )
28
+ - [ 1.3.3. 种基本类型的包装类和常量池] ( #133-种基本类型的包装类和常量池 )
29
+ - [ 1.4. 方法(函数)] ( #14-方法函数 )
30
+ - [ 1.4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?] ( #141-什么是方法的返回值返回值在类的方法里的作用是什么 )
31
+ - [ 1.4.2. 为什么 Java 中只有值传递?] ( #142-为什么-java-中只有值传递 )
32
+ - [ 1.4.3. 重载和重写的区别] ( #143-重载和重写的区别 )
33
+ - [ 1.4.3.1. 重载] ( #1431-重载 )
34
+ - [ 1.4.3.2. 重写] ( #1432-重写 )
35
+ - [ 1.4.4. 深拷贝 vs 浅拷贝] ( #144-深拷贝-vs-浅拷贝 )
36
+ - [ 1.4.5. 方法的四种类型] ( #145-方法的四种类型 )
33
37
- [ 2. Java 面向对象] ( #2-java-面向对象 )
34
38
- [ 2.1. 类和对象] ( #21-类和对象 )
35
39
- [ 2.1.1. 面向对象和面向过程的区别] ( #211-面向对象和面向过程的区别 )
68
72
- [ 3.2.1. Java 异常类层次结构图] ( #321-java-异常类层次结构图 )
69
73
- [ 3.2.2. Throwable 类常用方法] ( #322-throwable-类常用方法 )
70
74
- [ 3.2.3. try-catch-finally] ( #323-try-catch-finally )
71
- - [ 3.2.4.使用 ` try-with-resources ` 来代替` try-catch-finally ` ] ( #324使用 -try-with-resources-来代替try-catch-finally )
75
+ - [ 3.2.4. 使用 ` try-with-resources ` 来代替` try-catch-finally ` ] ( #324-使用 -try-with-resources-来代替try-catch-finally )
72
76
- [ 3.3. 多线程] ( #33-多线程 )
73
77
- [ 3.3.1. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?] ( #331-简述线程程序进程的基本概念以及他们之间关系是什么 )
74
78
- [ 3.3.2. 线程有哪些基本状态?] ( #332-线程有哪些基本状态 )
@@ -226,13 +230,150 @@ Java 中的注释有三种:
226
230
227
231
在我们编写程序的时候,需要大量地为程序、类、变量、方法等取名字,于是就有了标识符,简单来说,标识符就是一个名字。但是有一些标识符,Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这种特殊的标识符就是关键字。因此,关键字是被赋予特殊含义的标识符。比如,在我们的日常生活中 ,“警察局”这个名字已经被赋予了特殊的含义,所以如果你开一家店,店的名字不能叫“警察局”,“警察局”就是我们日常生活中的关键字。
228
232
229
- #### 1.2 . 4. 自增自减运算符
233
+ #### 1.2 . 4. Java 中有哪些常见的关键字?
234
+
235
+ | 访问控制 | private | protected | public | | | | |
236
+ | -------------------- | -------- | ---------- | -------- | ------------ | ---------- | -------- - | ------ |
237
+ | 类,方法和变量修饰符 | abstract | class | extends | final | implements | interface | native |
238
+ | | new | static | strictfp | synchronized | transient | volatile | |
239
+ | 程序控制 | break | continue | return | do | while | if | else |
240
+ | | for | instanceof | switch | case | default | | |
241
+ | 错误处理 | try | catch | throw | throws | finally | | |
242
+ | 包相关 | import | package | | | | | |
243
+ | 基本类型 | boolean | byte | char | double | float | int | long |
244
+ | | short | null | true | false | | | |
245
+ | 变量引用 | super | this | void | | | | |
246
+ | 保留字 | goto | const | | | | | |
247
+
248
+ #### 1.2.5. 自增自减运算符
230
249
231
250
在写代码的过程中,常见的一种情况是需要某个整数类型变量增加 1 或减少 1,Java 提供了一种特殊的运算符,用于这种表达式,叫做自增运算符(++)和自减运算符(-- )。
232
251
233
252
++ 和-- 运算符可以放在操作数之前,也可以放在操作数之后,当运算符放在操作数之前时,先自增/ 减,再赋值;当运算符放在操作数之后时,先赋值,再自增/ 减。例如,当“b= ++ a”时,先自增(自己增加 1 ),再赋值(赋值给 b);当“b= a++ ”时,先赋值(赋值给 b),再自增(自己增加 1 )。也就是,++ a 输出的是 a+ 1 的值,a++ 输出的是 a 值。用一句口诀就是:“符号在前就先加/ 减,符号在后就后加/ 减”。
234
253
235
- #### 1.2 . 5. Java 中的几种基本数据类型是什么,对应的,各自占用多少字节呢?
254
+ #### 1.2 . 6. continue 、break 、和return 的区别是什么?
255
+
256
+ 在循环结构中,当循环条件不满足或者循环次数达到要求时,循环会正常结束。但是,有时候可能需要在循环的过程中,当发生了某种条件之后 ,提前终止循环,这就需要用到下面几个关键词:
257
+
258
+ 1. continue :指跳出当前的这一次循环,继续下一次循环。
259
+ 2. break :指跳出整个循环体,继续执行循环下面的语句。
260
+
261
+ return 用于跳出所在方法,结束该方法的运行。return 一般有两种用法:
262
+
263
+ 1. `return ;` :直接使用 return 结束方法执行,用于没有返回值函数的方法
264
+ 2. `return value;` :return 一个特定值,用于有返回值函数的方法
265
+
266
+ #### 1.2 . 7. Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
267
+
268
+ Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
269
+
270
+ ** Java 的泛型是伪泛型,这是因为Java 在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除 。** 更多关于类型擦除的问题,可以查看这篇文章:[《Java 泛型类型擦除以及类型擦除带来的问题》](https: // www.cnblogs.com/wuqinglong/p/9456193.html) 。
271
+
272
+ ```java
273
+ List<Integer > list = new ArrayList<> ();
274
+
275
+ list. add(12 );
276
+ // 这里直接添加会报错
277
+ list. add(" a" );
278
+ Class<? extends List > clazz = list. getClass();
279
+ Method add = clazz. getDeclaredMethod(" add" , Object . class);
280
+ // 但是通过反射添加,是可以的
281
+ add. invoke(list, " kl" );
282
+
283
+ System . out. println(list)
284
+ ```
285
+
286
+ 泛型一般有三种使用方式: 泛型类、泛型接口、泛型方法。
287
+
288
+ ** 1. 泛型类** :
289
+
290
+ ```java
291
+ // 此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
292
+ // 在实例化泛型类时,必须指定T的具体类型
293
+ public class Generic <T>{
294
+
295
+ private T key;
296
+
297
+ public Generic (T key ) {
298
+ this . key = key;
299
+ }
300
+
301
+ public T getKey (){
302
+ return key;
303
+ }
304
+ }
305
+ ```
306
+
307
+ 如何实例化泛型类:
308
+
309
+ ```java
310
+ Generic<Integer > genericInteger = new Generic<Integer > (123456 );
311
+ ```
312
+
313
+ ** 2. 泛型接口** :
314
+
315
+ ```java
316
+ public interface Generator <T> {
317
+ public T method ();
318
+ }
319
+ ```
320
+
321
+ 实现泛型接口,不指定类型:
322
+
323
+ ```java
324
+ class GeneratorImpl <T> implements Generator<T > {
325
+ @Override
326
+ public T method () {
327
+ return null ;
328
+ }
329
+ }
330
+ ```
331
+
332
+ 实现泛型接口,指定类型:
333
+
334
+ ```java
335
+ class GeneratorImpl <T> implements Generator<String > {
336
+ @Override
337
+ public String method () {
338
+ return " hello" ;
339
+ }
340
+ }
341
+ ```
342
+
343
+ ** 3. 泛型方法** :
344
+
345
+ ```java
346
+ public static < E > void printArray( E [] inputArray )
347
+ {
348
+ for ( E element : inputArray ){
349
+ System . out. printf( " %s " , element );
350
+ }
351
+ System . out. println();
352
+ }
353
+ ```
354
+
355
+ 使用:
356
+
357
+ ```java
358
+ // 创建不同类型数组: Integer, Double 和 Character
359
+ Integer [] intArray = { 1 , 2 , 3 };
360
+ String [] stringArray = { " Hello" , " World" };
361
+ printArray( intArray );
362
+ printArray( stringArray );
363
+ ```
364
+
365
+ ** 常用的通配符为: T ,E ,K ,V ,?**
366
+
367
+ - ? 表示不确定的 java 类型
368
+ - T (type) 表示具体的一个java类型
369
+ - K V (key value) 分别代表java键值中的Key Value
370
+ - E (element) 代表Element
371
+
372
+ 更多关于Java 泛型中的通配符可以查看这篇文章:[《聊一聊- JAVA 泛型中的通配符 T ,E ,K ,V ,?》](https: // juejin.im/post/5d5789d26fb9a06ad0056bd9)
373
+
374
+ ### 1.3 . 基本数据类型
375
+
376
+ #### 1.3 . 1. Java 中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?
236
377
237
378
Java ** 中** 有8 种基本数据类型,分别为:
238
379
@@ -249,8 +390,8 @@ Java**中**有8种基本数据类型,分别为:
249
390
| long | 64 | 8 | 0L |
250
391
| byte | 8 | 1 | 0 |
251
392
| char | 16 | 2 | ' u0000' |
252
- | float | 32 | 4 | 0f |
253
- | double | 64 | 8 | 0d |
393
+ | float | 32 | 4 | 0f |
394
+ | double | 64 | 8 | 0d |
254
395
| boolean | 1 | | false |
255
396
256
397
对于boolean ,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。
@@ -260,42 +401,122 @@ Java**中**有8种基本数据类型,分别为:
260
401
1. Java 里使用 long 类型的数据一定要在数值后面加上 ** L ** ,否则将作为整型解析:
261
402
2. `char a = ' h' `char : 单引号,`String a = " hello" ` : 双引号
262
403
263
- #### 1.2 . 6 . 自动装箱与拆箱
404
+ #### 1.3 . 2 . 自动装箱与拆箱
264
405
265
406
- ** 装箱** :将基本类型用它们对应的引用类型包装起来;
266
407
- ** 拆箱** :将包装类型转换为基本数据类型;
267
408
268
409
更多内容见:[深入剖析 Java 中的装箱和拆箱](https: // www.cnblogs.com/dolphin0520/p/3780005.html)
269
410
270
- #### 1.2 . 7. continue 、 break 、和 return 的区别是什么?
411
+ #### 1.3 . 3. 种基本类型的包装类和常量池
271
412
272
- 在循环结构中,当循环条件不满足或者循环次数达到要求时,循环会正常结束。但是,有时候可能需要在循环的过程中,当发生了某种条件之后 ,提前终止循环,这就需要用到下面几个关键词:
413
+ ** Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte , Short , Integer , Long , Character , Boolean ;前面 4 种包装类默认创建了数值[ - 128 , 127 ] 的相应类型的缓存数据, Character 创建了数值在[ 0 , 127 ]范围的缓存数据, Boolean 直接返回 True Or False 。如果超出对应范围仍然会去创建新的对象。 ** 为啥把缓存设置为[ - 128 , 127 ]区间?([参见issue / 461 ](https : // github.com/Snailclimb/JavaGuide/issues/461))性能和资源之间的权衡。
273
414
274
- 1. continue :指跳出当前的这一次循环,继续下一次循环。
275
- 2. break :指跳出整个循环体,继续执行循环下面的语句。
415
+ ```java
416
+ public static Boolean valueOf(boolean b) {
417
+ return (b ? TRUE : FALSE );
418
+ }
419
+ ```
276
420
277
- return 用于跳出所在方法,结束该方法的运行。return 一般有两种用法:
421
+ ```java
422
+ private static class CharacterCache {
423
+ private CharacterCache (){}
424
+
425
+ static final Character cache[] = new Character [127 + 1 ];
426
+ static {
427
+ for (int i = 0 ; i < cache. length; i++ )
428
+ cache[i] = new Character ((char )i);
429
+ }
430
+ }
431
+ ```
278
432
279
- 1. `return ;` :直接使用 return 结束方法执行,用于没有返回值函数的方法
280
- 2. `return value;` :return 一个特定值,用于有返回值函数的方法
433
+ 两种浮点数类型的包装类 Float ,Double 并没有实现常量池技术。**
281
434
282
- ### 1.3 . 方法(函数)
435
+ ```java
436
+ Integer i1 = 33 ;
437
+ Integer i2 = 33 ;
438
+ System . out. println(i1 == i2);// 输出 true
439
+ Integer i11 = 333 ;
440
+ Integer i22 = 333 ;
441
+ System . out. println(i11 == i22);// 输出 false
442
+ Double i3 = 1.2 ;
443
+ Double i4 = 1.2 ;
444
+ System . out. println(i3 == i4);// 输出 false
445
+ ```
283
446
284
- #### 1.3 . 1. 什么是方法的返回值? 返回值在类的方法里的作用是什么?
447
+ ** Integer 缓存源代码:**
448
+
449
+ ```java
450
+ /**
451
+ *此方法将始终缓存-128 到 127(包括端点)范围内的值,并可以缓存此范围之外的其他值。
452
+ */
453
+ public static Integer valueOf(int i) {
454
+ if (i >= IntegerCache . low && i <= IntegerCache . high)
455
+ return IntegerCache . cache[i + (- IntegerCache . low)];
456
+ return new Integer (i);
457
+ }
458
+
459
+ ```
460
+
461
+ ** 应用场景:**
462
+ 1. Integer i1= 40 ;Java 在编译的时候会直接将代码封装成 Integer i1= Integer . valueOf(40 );,从而使用常量池中的对象。
463
+ 2. Integer i1 = new Integer (40 );这种情况下会创建新的对象。
464
+
465
+ ```java
466
+ Integer i1 = 40 ;
467
+ Integer i2 = new Integer (40 );
468
+ System . out. println(i1== i2);// 输出 false
469
+ ```
470
+ ** Integer 比较更丰富的一个例子: **
471
+
472
+ ```java
473
+ Integer i1 = 40 ;
474
+ Integer i2 = 40 ;
475
+ Integer i3 = 0 ;
476
+ Integer i4 = new Integer (40 );
477
+ Integer i5 = new Integer (40 );
478
+ Integer i6 = new Integer (0 );
479
+
480
+ System . out. println(" i1=i2 " + (i1 == i2));
481
+ System . out. println(" i1=i2+i3 " + (i1 == i2 + i3));
482
+ System . out. println(" i1=i4 " + (i1 == i4));
483
+ System . out. println(" i4=i5 " + (i4 == i5));
484
+ System . out. println(" i4=i5+i6 " + (i4 == i5 + i6));
485
+ System . out. println(" 40=i5+i6 " + (40 == i5 + i6));
486
+ ```
487
+
488
+ 结果:
489
+
490
+ ```
491
+ i1= i2 true
492
+ i1= i2+ i3 true
493
+ i1= i4 false
494
+ i4= i5 false
495
+ i4= i5+ i6 true
496
+ 40 = i5+ i6 true
497
+ ```
498
+
499
+ 解释:
500
+
501
+ 语句 i4 == i5 + i6,因为+ 这个操作符不适用于 Integer 对象,首先 i5 和 i6 进行自动拆箱操作,进行数值相加,即 i4 == 40 。然后 Integer 对象无法与数值进行直接比较,所以 i4 自动拆箱转为 int 值 40 ,最终这条语句转为 40 == 40 进行数值比较。
502
+
503
+ ### 1.4 . 方法(函数)
504
+
505
+ #### 1.4 . 1. 什么是方法的返回值? 返回值在类的方法里的作用是什么?
285
506
286
507
方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用是接收出结果,使得它可以用于其他的操作!
287
508
288
- #### 1.3 . 2. 为什么 Java 中只有值传递?
509
+ #### 1.4 . 2. 为什么 Java 中只有值传递?
289
510
290
511
[为什么 Java 中只有值传递?](https: // juejin.im/post/5e18879e6fb9a02fc63602e2)
291
512
292
- #### 1.3 . 3. 重载和重写的区别
513
+ #### 1.4 . 3. 重载和重写的区别
293
514
294
515
> 重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理
295
516
>
296
517
> 重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法
297
518
298
- ###### 1.3 . 3.1 . 重载
519
+ ###### 1.4 . 3.1 . 重载
299
520
300
521
发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
301
522
@@ -305,7 +526,7 @@ return 用于跳出所在方法,结束该方法的运行。return 一般有两
305
526
306
527
** 综上:重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。**
307
528
308
- ###### 1.3 . 3.2 . 重写
529
+ ###### 1.4 . 3.2 . 重写
309
530
310
531
重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。
311
532
@@ -326,14 +547,14 @@ return 用于跳出所在方法,结束该方法的运行。return 一般有两
326
547
| 访问修饰符 | 可修改 | 一定不能做更严格的限制(可以降低限制) |
327
548
| 发生阶段 | 编译期 | 运行期 |
328
549
329
- #### 1.3 . 4. 深拷贝 vs 浅拷贝
550
+ #### 1.4 . 4. 深拷贝 vs 浅拷贝
330
551
331
552
1. ** 浅拷贝** :对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
332
553
2. ** 深拷贝** :对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
333
554
334
555
! [deep and shallow copy](https: // my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/java-deep-and-shallow-copy.jpg)
335
556
336
- #### 1.3 . 5. 方法的四种类型
557
+ #### 1.4 . 5. 方法的四种类型
337
558
338
559
1 、无参数无返回值的方法
339
560
@@ -704,11 +925,13 @@ String s = input.readLine();
704
925
705
926
#### 3.2 . 1. Java 异常类层次结构图
706
927
707
- ! [Java 异常类层次结构图](. / images/ java- exception- handling- class- hierarchy- diagram. jpg)
928
+ ! [](https: // imgkr.cn-bj.ufileos.com/199703ce-a1b6-4968-9eb0-161a8217507e.png)
929
+
708
930
709
931
< p style= " font-size:13px;text-align:right" > 图片来自:https: // simplesnippets.tech/exception-handling-in-java-part-1/</p>
710
932
711
- ! [Java 异常类层次结构图](. / images/ exception- architechture- java. png)
933
+ ! [](https: // imgkr.cn-bj.ufileos.com/3c45529f-8915-448b-816a-360f8cb73fc7.png)
934
+
712
935
713
936
< p style= " font-size:13px;text-align:right" > 图片来自:https: // chercher.tech/java-programming/exceptions-java</p>
714
937
@@ -762,7 +985,7 @@ public class Test {
762
985
763
986
如果调用 `f(2 )`,返回值将是 0 ,因为 finally 语句的返回值覆盖了 try 语句块的返回值。
764
987
765
- #### 3.2 . 4. 使用 `try - with- resources` 来代替`try - catch - finally `
988
+ #### 3.2 . 4. 使用 `try - with- resources` 来代替`try - catch - finally `
766
989
767
990
《Effecitve Java 》中明确指出:
768
991
0 commit comments