-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathJAVA笔记.txt
More file actions
1514 lines (1273 loc) · 62.1 KB
/
JAVA笔记.txt
File metadata and controls
1514 lines (1273 loc) · 62.1 KB
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
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
539
540
541
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
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
JAVA笔记
----------------------------------------------------------------------------------------------------------------------
【第一章】JAVA基本框架
程序:为了让计算机执行某些操作或解决某个问题,而编写的一系列有序指令的集合。
·JAVA程序框架
public class 类名{ ---外层框架(类名同文件名)
public static void main(String[] args){ ---Java入口程序框架
System.out.println("输出的内容"); ---输出指令
}
}
main入口四要素:返回值类型、方法名、参数、方法体
println ---输出内容并执行换行
print ---输出内容不执行换行
\n ---换行符
\t ---制表符(8个空格)
//注释内容 ---单行注释
/** ---多行注释
*注释内容
*/
----------------------------------------------------------------------------------------------------------------------
【第二章】变量、数据类型和运算符
·变量
变量是存储数据的一个单元。
语法:
方法一:
int money=1000; ---数据类型 变量名=数值; //声明变量并赋值
方法二:
int money; ---数据类型 变量名; //声明变量
money=1000; ---变量名=数值; //赋值
·数据类型
char ---字符型(单个字符 如:‘男’)
int ---整 型(整数)
double ---双精度(小数)
String ---字符串(一串字符 如:"我是Java")
boolean ---布尔型 返回值:true真、false 假
变量名命名规则:
首字母:字母、下划线‘_’、‘$’符号
其余部分:数字、字母、下划线‘_’、‘$’符号
·运算符
语法:
赋值运算符:=(变量名=表达式;(右→左)
算数运算符:+(加)、-(减)、*(乘)、/(除)、 %(余)
类型自动转换:
在某种条件下,系统自动完成类型转换
两种类型兼容(如:int和double兼容)
目标类型大于源类型(如:double型大于int型)
对于表达式:如果一个操作数为double型,则整个表达式提升为double型。
类型强制转换:类型 变量名=(类型名)表达式;
如:int a=20;
double b=9.8;
int zh=(int)(a+b);
System.out.println(zh);
i++; //先执行在加1
++i; //先加1再执行
----------------------------------------------------------------------------------------------------------------------
【第三章】选择结构
·关系运算符
>(大于)、<(小于)、==(等于)、!=(不等于)、>=(大于等于)、<=(小于等于)
·逻辑运算符
*******************************************************************
* 运算符 * 表达式 * 说明 *
* &(且) * 条件1&条件2 * 前者条件为真时,仍然执行后者条件 *
* |(或) * 条件1|条件2 * 前者条件为假时,仍然执行后者条件 *
* && * 条件1&&条件2 * 仅仅两个条件为真,结果为真 *
* || * 条件1||条件2 * 只要两个条件一个为真,结果为真 *
* !(非) * !条件 * 条件为真时,结果为假。 *
* * * 条件为假时,结果为真。 *
*******************************************************************
·基本if选择结构
if(条件){
//语句
}
·if-else选择结构
if(条件){
//语句1
}else{
//语句2
}
·if选择结构
if(条件){
//语句1
}else if(条件){
//语句2
}else{
//语句3
}
·switch选择结构
switch(条件)
{
case 1:
语句;
break;
case 2:
语句;
break;
default:
语句;
break;
}
·运算符优先级
最高的优先级:小括号,即()
最低的优先级:赋值运算符,即=
优先级顺序:! > 算术运算符 > 比较运算符 > && > ||
·接收数据功能(文本扫描器)
语法:
import java.util.Scanner;
Scanner input=new Scanner(System.in); //声明接收数据功能
int a=input.nextInt(); //接收输入的内容
/**
* 三元运算符使用实例
*/
int i=0;
//如果i=1字符串s=Yes,否则等于No
String s=(i==1) ? "Yes":"No";
System.out.println(s);
----------------------------------------------------------------------------------------------------------------------
【第四章】循环结构(一)
·while循环
语法:
while(循环条件){
循环操作
}
特点:先判断,再执行。
·do-while循环
语法:
do{
循环操作
}while(循环条件);
特点:先执行,再判断。
----------------------------------------------------------------------------------------------------------------------
【第五章】循环结构(二)
·for循环结构
语法:
for(表达式1;表达式2;表达式3){ // 表达式1(参数初始化);表达式2(条件判断);表达式3(更新循环变量)
循环操作;
}
·for each循环结构
作用:用于循环遍历数组、集合
语法:
for (类型 变量名 : 源数据变量名) {
System.out.println(源数据变量名);
}
·跳转语句
break; //跳出循环(用于do-while、while、for中时,可跳出循环而执行循环后面的语句)
continue; //跳过本次循环
return; //结束程序
----------------------------------------------------------------------------------------------------------------------
【第六章】数组
数组是一个变量,存储相同数据类型的一组数据,数组的下标从0开始。
·语法
声明数组:
方法一:
数据类型 数组名[];
方法二:
数据类型[] 数组名;
声明数组并分配空间:
数据类型[] 数组名 = new 数据类型[大小];
赋值:
数组名[下标] = 数据;
声明数组批量赋值:
数据类型[] 数组名 = new 数据类型[]{1,2,3,4,5};
·使用数组步骤
1、声明数组 int[]a;
2、分配空间 a=new int[5];
3、赋值 a[0]=80;
4、处理数据 a[0]=a[0]*10;
·排序输出:
import java.util.Arrays; // 声明排序功能类包
public class Test{
public static void main(String[] args) {
int [] a=new int[]{3,5,4,1,2}; // 声明数组并赋值
Arrays.sort(a); // 声明排序功能
//循环输出进行1-5升序排列输出
for(int i= 0; i<a.length; i++){
System.out.print(a[i]+","); // 循环输出打印
}
}
}
生成随机数
int max = 9999;//最大值
int min = 1000;//最小值
int a=(Math.random()*个数);//生成随机数
例:
System.out.print("产生的随机数是:");
for (int i = 0; i <= 9; i++) {
int a=(int) (Math.random()*9);
System.out.print(a+" ");
}
----------------------------------------------------------------------------------------------------------------------
【第七章】类和对象
·对象同时具有属性和方法两种特性。
属性:所有对象的公共特征,作用:区分各个对象
方法:所有对象的公共操作
·类和对象的区别?
类是对象的抽象,对象是类的具体实例。
类是抽象的,不占用内存,而对象是具体的,占有内存空间。
例如:类就是水果,对象就是苹果。
·Java类模板
public class 类名{
//定义属性部分
属性1的类型 属性1;
属性2的类型 属性2;
//定义方法部分
方法1;
方法2;
}
·定义一个类的步骤
1.定义类名
public class 类名{
}
2.编写类的属性
String name;
3.编写类的方法
public String 方法名(){
return "姓名:"+name";
}
·如何创建和使用对象
1.使用new创建类的一个对象
类名 对象名=new 类名(); Yuntuschool luoyang=new Yuntuschool();
2.给类的属性赋值:
对象名.属性=值; luoyang.name="洛阳";
3.调用类的方法:
对象名.方法名(); System.out.println(luoyang.方法名());
----------------------------------------------------------------------------------------------------------------------
【第八章】类的方法(一)
·语法
public 返回值类型 方法名(){
//方法体
}
·返回值类型
void //无返回值
return //有返回值(String int double char boolean)
在同一个类中调用方法可直接调用,在另一个类调用方法要先创建一个类对象然后通过(对象名.方法名)调用方法。
import 包名.类名; //调用类
package 包名; //声明包
import 包名; //导入包
·JavaDoc注释
JavaDoc注释用于注释类
语法:
/**
* @author 曹帅华
* @date 2018-4-10 下午6:53:11
*/
----------------------------------------------------------------------------------------------------------------------
【第九章】类的方法(二)
·定义带参数的方法
访问修饰符 返回值类型 方法名(形参1,形参2,形参...){
方法的主体
return 返回值;
}
·调用带参数的方法
对象名.方法名(实参1,实参2,实参...);
实参的名字可以和形参不一样,但是类型、数量、顺序都要与形参一一对应。
----------------------------------------------------------------------------------------------------------------------
【第十章】String字符串
·Sring类常用方法
----------------------------------------------------------------------------------------------------
|返回值类型 方法名 说明 |
|----------------------------------------------------------------------------------------------------|
|boolean equals() 将此字符串与指定的对象比较 |
|----------------------------------------------------------------------------------------------------|
|int length() 返回此字符串的长度 |
|----------------------------------------------------------------------------------------------------|
|boolean equalsIgnoreCase(String str) 将此 String 与另一个String比较,不考虑大小写 |
|----------------------------------------------------------------------------------------------------|
|String toUpperCase() 将字符串所有字符都转换为大写 |
|----------------------------------------------------------------------------------------------------|
|String toLowerCase() 将字符串所有字符都转换为小写 |
|----------------------------------------------------------------------------------------------------|
|String concat() 将指定字符串连接到此字符串的结尾 |
|----------------------------------------------------------------------------------------------------|
|String[] split() 将一个字符串分割为多个子字符串 |
|----------------------------------------------------------------------------------------------------|
|int indexOf(int ch/String value) 返回指定字符在此字符串中第一次出现处的索引 |
|----------------------------------------------------------------------------------------------------|
|int IastIndexOf(String value) 返回指定字符在此字符串中最后一次出现处的索引 |
|----------------------------------------------------------------------------------------------------|
|int IastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引 |
|----------------------------------------------------------------------------------------------------|
|String substring(int index) 提取从索引位置开始的字符串 |
|----------------------------------------------------------------------------------------------------|
|String substring(int beginindex,int endindex) 提取beginindex(包含当前位置)到endindex|
| (不包含当前位置)之间的字符串部分 |
|----------------------------------------------------------------------------------------------------|
|String trim() 清除字符串两端的空格 |
|----------------------------------------------------------------------------------------------------|
|String replace(char oldChar,char newChar) 返回一个新的字符串,用newChar替换此字| | 符串中出现的所有oldChar |
|----------------------------------------------------------------------------------------------------|
|boolean startsWith(String str) 测试此字符串是否以指定的前缀开始 |
----------------------------------------------------------------------------------------------------
·StringBuffer类
线程安全的可变字符序列
·StringBuffer的声明:
StringBuffer sb=new StringBuffer(); //创建StringBuffer对象
StringBuffer sb=new StringBuffer("aaa"); //创建一个对象并存储字符串
·常用方法
String toString(): 转换为String类型
StringBuffer append(): 将指定的字符串追加到此字符序列
StringBuffer insert (int offset, String str): 将字符串插入到offset位置后的字符序列中
·String和StringBuffer/StringBuilder的区别:
String 长度大小不可变
StringBuffer 和 StringBuilder 长度可变
StringBuffer 线程安全 StringBuilder 线程不安全
StringBuilder 速度快
----------------------------------------------------------------------------------------------------------------------
【第十一章】抽象和封装
Java语言的三大特性:封装、继承、多态
·类图
------------------------
| 类名 |
|------------------------|
|+属性名:类型 |
|------------------------|
|+方法名(参数):返回值类型|
------------------------
+public 公共
-private 私有
参数:名字:类型,名字:类型
·构造函数
访问修饰符 构造方法名(参数){//构造方法名与类名相同
//初始化代码
}
系统会提供默认的无参构造方法,如果自己写了一个自定义构造方法系统将不再提供默认无参构造方法。
添加构造函数快捷键:
有参:Shift+Alt+S,选择Generate ... using Fields
无参:Shift+Alt+S,选择Generate ... Superclass
方法重载特征:方法名相同;
参数项不相同;
与返回值、访问修饰符无关;
·封装
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的步骤:
1.修改属性的可见性 → 设为private
2.创建公有的getter(获取)/setter(设置)方法 → 用于属性的读写
3.在getter/setter方法中加入属性控制语句 → 对属性值的合法性进行判断
添加getter/setter方法的快捷键:Shift+Alt+S,选择Generate ... and Setters
·static关键字
使用static定义变量:
static final String NAME="张三";
static:静态
final:常量(常量名大写,用final修饰的变量成为常量,其值固定不变)
使用static定义方法:
static void print(){}
Penguin.print();//用类名.方法名()调用
·使用面向对象的思想开发程序的好处:
1.客户和软件设计开发人员之间、软件设计开发人员内部交流更加顺畅
2.提高软件设计和开发效率
·从现实世界抽象出类:
1.找出名词确定类、属性
2.找出动词确定方法
3.剔除与业务无关的属性和方法
·static修饰与非static修饰的区别:
-------------------------------------------------------------
| |static非private修饰 |非static、private修饰|
|---------------|-----------------------|---------------------|
|属性 |类属性、类变量 |实例属性、实例变量 |
|---------------|-----------------------|---------------------|
|方法 |类方法 |实例方法 |
|---------------|-----------------------|---------------------|
|调用方式 |类名.属性 |对象.属性 |
| |类名.方法() |对象.方法() |
| |对象.属性 | |
| |对象.方法() | |
|---------------|-----------------------|---------------------|
|归属 |类 |单个对象 |
-------------------------------------------------------------
注:static可以修饰属性、方法、静态块
----------------------------------------------------------------------------------------------------------------------
【第十二章】继承
一个父类可以有很多子类,但是一个子类只能有一个父类,子类与父类是is-a关系
·优点:方便修改代码,减少代码量
·如何使用继承
1、编写父类
class Pet {
//公共的属性和方法
}
2、编写子类,继承父类(只能继承一个父类)
class Dog extends Pet {//子类 extends 父类
//子类特有的属性和方法
}
·子类访问父类成员
(1)使用super关键字,super代表父类对象。
(2)在子类构造方法中调用且必须是第一句。
(3)不可以访问父类中定义为private的属性和方法。
·访问父类构造方法
super();//调用父类的无参构造
super(name); //调用父类的带参构造 super(属性1,属性2,属性3...)
·访问父类属性
super.name;
·访问父类方法
super.print();//super.方法名 调用父类的方法
·不能被继承的父类成员
1、private成员
2、子类与父类不在同包,使用默认访问权限的成员
3、构造方法
访问修饰符protected:可以修饰属性和方法,本类、同包、子类可以访问。
·访问修饰符
-----------------------------------
|访问修饰符 |本类 |同包|子类|其他|
|--------------|-----|----|----|----|
|private |√ | | | |
|默认(friendly)|√ |√ | | |
|protected |√ |√ |√ | |
|public |√ |√ |√ |√ |
-----------------------------------
private 私有的、friendly 友好的、protected 受保护、public 公开
·多重继承关系的初始化顺序
父类属性→父类构造方法→子类属性→子类构造方法
符合is-a关系的设计使用继承,继承是代码重用的一种方式,将子类共有的属性和行为放到父类中
·方法重写规则:
1.方法名相同
2.参数列表相同
3.返回值类型相同或者是其子类
4.访问权限不能严于父类
·方法重载与方法重写区别:
| |位置 |方法名 |参数表 |返回值 |访问修饰符 |
|方法重写 |子类 |相同 |相同 |相同或是其子类 |不能比父类更严格|
|方法重载 |同类 |相同 |不相同 |无关 |无关 |
·抽象类
1.抽象类不能实例化
2.抽象类中不一定有抽象方法,但抽象方法必须在抽象类中,
3.抽象方法必须在每个子类中重写
4.“子类重写”正好解决抽象方法的实例化问题
5.非抽象类必须重写父类的所有抽象方法
定义一个抽象类:
public abstract class A{
}
·抽象方法
1.抽象方法没有方法体
2.抽象方法必须在抽象类里
3.抽象方法必须在子类中被实现,除非子类是抽象类
定义一个抽象方法:
public abstract void print();
final 最终的,其值是固定不变的
----------------------------------------------------------------------------------------------------------------------
【第十三章】多态
同一个引用类型,使用不同的实例而执行不同操作
好处:多态可以减少类中代码量,提高代码的可扩展性和可维护性
·使用多态实现思路
1.编写父类编写子类,子类重写父类方法
2.运行时,使用父类的类型,子类的对象
实现多态的两个要素:子类重写父类方法、使用父类的类型,子类的对象
·实现多态的两种形式
1.将父类作为方法形参实现
2.将父类作为方法返回值实现
·向上转型(子类转换为父类,自动进行类型转换)
Pet pet = new Dog(); 自动类型转换
·向下转型(父类转换为子类,结合instanceof运算符进行强制类型转换)
Pet p = new Dog("欧欧", "雪娜瑞");
Dog d = (Dog)p;//将父类p转换为Dog类
Penguin png = (Penguin) pet;//×父类必须指向真实的子类类型
·instanceof运算符
用来在运行时指出对象是否是特定类的一个实例
语法:
对象 instanceof 类或接口
注:instanceof通常和强制类型转换结合使用
----------------------------------------------------------------------------------------------------------------------
【第十四章】接口
·使用接口步骤:
1.编写接口(interface):
public interface Usb{
public void lianjie();//所有方法都是抽象方法
}
2.实现接口(implements):
public class Upan implements Usb {//多个接口使用,分隔
public void lianjie() {
System.out.println("已连接USB");
}
}
3.使用接口:
Usb u = new Upan();
u.lianjie();
·接口特性:
1、接口不可以被实例化
2、子类必须实现接口的所有方法
3、子类可以实现多个接口
4、接口中的变量都是静态常量
5、接口中所有方法都是抽象的公共的
抽象类利于代码复用,接口利于代码维护
实现类和接口是has-a的关系
·接口比抽象类更好的特性:
1.可以被多继承
2.设计和实现完全分离
3.更自然的使用多态
4.更容易搭建程序框架
5.更容易更换实现
·面向接口编程:
程序设计时面向接口的约定(方法+名称)而不考虑具体实现
----------------------------------------------------------------------------------------------------------------------
【第十五章】异常
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
input.hasNextInt(); //判断下一个接收的值是否是整数
System.exit(1); //终止程序
·异常处理:
通过5个关键字来实现:try、catch、 finally、throw、throws
------------------------------------------------------------------------
| 捕获异常 | 声明异常 | 抛出异常 |
|--------------------------------|-----------------------|-------------|
| try→ 执行可能产生 | throws | throw |
| 异常的代码 | ↓ | ↓ |
| | 声明方法可能要 |手动抛出异常 |
| | 抛出的各种异常 | |
|--------------------------------| | |
| catch→ 捕获异常 | | |
|--------------------------------| | |
| finally→ 无论是否发生异常,代 | | |
| 码总能执行 | | | ------------------------------------------------------------------------
·捕获异常
try {
// 代码段(此处不会产生异常)
} catch (异常类型1 ex) {
// 对异常进行处理的代码段
} catch (异常类型2 ex) {
// 对异常进行处理的代码段
return;
} finally {
}
//代码段
finally:
1、是否发生异常都执行
2、System.exit(1);情况下不执行
System.err.println();//打印错误信息
e.printStackTrace();//调用方法输出异常信息
·异常对象常用的方法
-----------------------------------------------------------------------------------
| 方法名 | 说 明 |
|-----------------------|-----------------------------------------------------------|
|void printStackTrace() |输出异常的堆栈信息 |
|String getMessage() |返回异常信息描述字符串,是printStackTrace()输出信息的一部分|
-----------------------------------------------------------------------------------
·常见的异常类型
-----------------------------------------------------------------------
| 异 常 类 型 | 说 明 |
|-------------------------------|---------------------------------------|
|Exception |异常层次结构的父类 |
|ArithmeticException |算术错误情形,如以零作除数 |
|ArrayIndexOutOfBoundsException |数组下标越界 |
|NullPointerException |尝试访问 null 对象成员 |
|ClassNotFoundException |不能加载所需的类 |
|IllegalArgumentException |方法接收到非法参数 |
|ClassCastException |对象强制类型转换出错 |
|NumberFormatException |数字格式转换异常,如把"abc"转换成数字 |
|InputMismatchException |输入的数据类型与所需类型不匹配异常 |
-----------------------------------------------------------------------
·抛出异常
public static void a() throws Exception {//多个异常逗号隔开
//可能出现异常的代码
}
throw new Exception("");//自定义手动抛出异常
·面试题:
·try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序
答:是,try-catch-finally执行顺序:
1.执行try{}块
2.如果try{}块有异常产生,执行catch{}块
3.无论有没有异常都要执行finally{}块,这里可以看出只要finally中有return,必然返回finally{}中的return
·try-catch- finally块中,finally块唯一不执行的情况是什么?
答:当你在捕获到异常的处理代码里加上:System.exit();时不执行
·说出5个常见的运行时异常
答:见上面异常类型
·throw与throws的区别是什么?
答:throw是语句抛出异常,throws是方法可能抛出异常的声明。
·开源日志记录工具log4j
日志(log):
主要用来记录系统运行中一些重要操作信息
便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到原因
日志分类:
SQL日志、异常日志、业务日志
log4j是一个非常优秀的开源日志记录工具:
控制日志的输出级别
控制日志信息输送的目的地是控制台、文件等
控制每一条日志的输出格式
控制日志输出级别:
fatal:致命的
↓
error:错误消息
↓
warn:警告信息
↓
info:一般消息
↓
debug:调试消息
↓
自定义
使用log4j记录日志步骤:
1.在项目中加入log4j的JAR文件
2.创建log4j.properties文件
3.配置日志信息:
1、输出级别
2、日志输出目的地Appender
3、日志布局类型Layout
4、转换模式ConversionPattern
4.使用log4j记录日志信息:
private static Logger logger=Logger.getLogger(类名.class)
logger.输出级别("错误描述")
----------------------------------------------------------------------------------------------------------------------
【第十六章】集合框架
Java集合框架提供了一套性能优良、使用方便的接口和类位于java.util包中
·接口
Collection Map
↑ ↑
----------------------- ---------------
| | | |
List Set HashMap HashMap
↑ ↑
----------- -------
| | | |
ArrayList LinkedList HashSet TreeSet
集合接口:
Collection 接口存储一组不唯一,无序的对象
List 接口存储一组不唯一,有序(插入顺序)的对象
Set 接口存储一组唯一,无序的对象
Map 接口存储一组键值对象,提供key到value的映射
集合实现类:
ArrayList 实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高 LinkedList 采用链表存储方式。插入、删除元素率比较高
·List接口
·ArrayList集合类
创建ArrayList集合对象:
ArrayList<存储元素的数据类型> 对象名 = new ArrayList<存储元素的数据类型>();
·List接口常用方法
----------------------------------------------------------------------------------------------------------
| 方法名 | 说明 |
|-------------------------------|--------------------------------------------------------------------------|
|boolean add(Object o) |在列表的末尾顺序添加元素,起始索引位置从0开始 |
|void add(int index,Object o) |在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
|int size() |获取列表中的元素个数 |
|Object get(int index) |获取指定索引位置处的元素,取出的元素是Object类型,使用前需要进行强制类型转换|
|boolean contains(Object o) |判断列表中是否存在指定元素 |
|boolean remove(Object o) |从列表中删除元素 |
|Object remove(int index) |从列表中删除指定位置元素,起始索引位置从0开始 |
----------------------------------------------------------------------------------------------------------
·LinkedList集合类
·LinkedList的特殊方法
------------------------------------------------------------------------------
| 方法名 | 说明 |
|-------------------------------|----------------------------------------------|
|void addFirst(Object o) |在列表的首部添加元素 |
|void addLast(Object o) |在列表的末尾添加元素 |
|Object getFirst() |返回列表中的第一个元素 |
|Object getLast() |返回列表中的最后一个元素 |
|Object removeFirst() |删除并返回列表中的第一个元素 |
|Object removeLast() |删除并返回列表中的最后一个元素 |
------------------------------------------------------------------------------
·集合框架的好处:
1.容量自增长。
2.提供有用的数据结构和算法,从而减少编程工作。
3.提高了程序速度和质量,因为它提供了高性能的数据结构和算法。
4.允许不同API之间的互操作,API之间可以来回传递集合。
5.可以方便地扩展或改写集合。
·Map接口
专门处理键值映射数据的存储,可以根据键实现对值的操作
·Map接口常用方法
-------------------------------------------------------------------------------------
| 方法名 | 说明 |
|----------------------------------|--------------------------------------------------|
|Object put(Object key,Object val) |以“键-值对”的方式进行存储 |
|Object get(Object key) |根据键返回相关联的值,如果不存在指定的键,返回null |
|Object remove (Object key) |删除由指定的键映射的“键-值对” |
|int size() |返回元素个数 |
|Set keySet () |返回键的集合 |
|Collection values () |返回值的集合 |
|boolean containsKey(Object key) |如果存在由指定的键映射的“键-值对”,返回true |
-------------------------------------------------------------------------------------
·迭代器
通过迭代器Iterator实现遍历
获取Iterator:Collection 接口的iterate()方法
Iterator的方法:
boolean hasNext() //判断是否存在下一个可访问的元素
Object next() //返回要访问的下一个元素
实例:
Iterator<String> it=names.iterator();//获取迭代器
while (it.hasNext()) {//判断是否拥有下一个元素
String name=it.next();
System.out.println(name);
}
for each(增强型for循环)
语法:
for(元素类型t 元素变量x : 遍历数组或集合对象){
}
·遍历HashMap集合的方法
//声明并创建HashMap对象
Map<Integer, String> map=new HashMap<Integer, String>();
//存储数据
map.put(1, "张三");
map.put(2, "李四");
map.put(3, "王五");
//遍历集合
//方法一:values()获取所有值
Collection<String> c=map.values();
for (String string : c) {
System.out.println(c);
}
//方法二:keyset()获取所有键
Set<Integer> s=map.keySet();
for (Integer integer : s) {
String name=map.get(integer);
System.out.println(name);
}
//方法三:entrySet()获取键值映射的set图
Set<Entry<Integer, String>> s=map.entrySet();
for (Entry<Integer, String> entry : s) {
System.out.println(entry.getKey()+" "+entry.getValue());
}
·泛型集合
好处:类型安全、消除强制类型转换、提高性能
//创建泛型
class Dog<T> {
//属性
private T name;
//方法
......
}
//使用泛型
Dog<String> d=new Dog<String>("多多");//<类型>内指定的数据类型
----------------------------------------------------------------------------------------------------------------------
【第十七章】JDBC(Java数据库连接)
JDBC用于与数据库建立连接、执行SQL语句、处理结果的Java API,集成在java.sql和javax.sql包中。
·JDBC使用步骤
1.加载MySQL驱动程序
Class.forName("com.mysql.jdbc.Driver");
2.建立数据库连接Connection
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool?characterEncoding=utf- 8","root","123456");
3.创建statement/PreparedStatement对象,用来发送sql语句,并得到返回的结果
PreparedStatement pstate=conn.prepareStatement("SELECT * FROM student where id =?");
pstate.setInt(1, 10);
ResultSet rs=pstate.executeQuery();
4.处理结果
while(rs.next()){
String sno=rs.getString("sno");
String sname=rs.getString("sname");
int age=rs.getInt("sage");
String sex=rs.getString("ssex");
System.out.println("学号:"+sno+",姓名:"+sname+",年龄:"+age+",性别:"+sex);
}
5.释放资源
释放资源顺序: ResultSet → Statement → Connection
rs.close();
pstate.close();
conn.close();
·DriverManager类
作用:依据数据库的不同,管理JDBC驱动
·Driver接口
加载MySql驱动:Class.forName("com.mysql.jdbc.Driver");
加载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
·Connection接口
作用:负责连接数据库并担任传送数据的任务
·连接MySql数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://主机名:端口号/数据库名?参数名=参数 值,"user","password");
其他参数:
localhost:3306 本地主机地址
characterEncoding=utf8 设置编码格式
·常用方法
-----------------------------------------------------------------------
| 方法名 说 明 |
|-----------------------------------------------------------------------|
|createStatement() 创建向数据库发送sql的statement对象 |
|-----------------------------------------------------------------------|
|prepareStatement(sql) 创建向数据库发送预编译sql的PrepareSatement对象|
-----------------------------------------------------------------------
·Statement接口
作用:由 Connection 产生、负责执行SQL语句
·常用方法
-------------------------------------------------------------------------------
| 方法名 说 明 |
|-------------------------------------------------------------------------------|
|ResultSet executeQuery(String sql) 执行SQL查询并获取到ResultSet对象(结果集)|
|-------------------------------------------------------------------------------|
|int executeUpdate(String sql) 执行插入、删除、更新操作,返回更新的行数 |
|-------------------------------------------------------------------------------|
|boolean execute(String sql) 执行任意SQL语句,然后获得一个布尔值,表示是|
| 否返回ResultSet(结果集) |
-------------------------------------------------------------------------------
·PreparedStatement接口
作用:继承自Statement接口,由preparedStatement创建用于发送含有一个或多个参数的SQL语句,比Statement效率更高, 并且可以防止SQL注入,一般都使用PreparedStatement。
语法:
一个“?”代表设置一个通配符,下标从1开始
PreparedStatement pstate=prepareStatement(sql);
pstate.setString(通配符下标, 值);
示例:
PreparedStatement pstate=null;
pstate=conn.prepareStatement("SELECT * FROM `user` WHERE zhanghao=? AND mima=?;");
pstate.setString(1, "admin");
pstate.setString(2, "123456");
·ResultSet接口
作用:负责保存Statement执行后所产生的查询结果
·常用方法
-----------------------------------------------------------------------------
| 方法名 说 明 |
|-----------------------------------------------------------------------------|
|boolean next() 将光标从当前位置向下移动一行 |
|-----------------------------------------------------------------------------|
|boolean previous() 游标从当前位置向上移动一行 |
|-----------------------------------------------------------------------------|
|boolean first() 查找结果集中的第一行,找到返回true |
|-----------------------------------------------------------------------------|
|void close() 关闭ResultSet对象 |
|-----------------------------------------------------------------------------|
|int getInt(int colIndex) 以int形式获取结果集当前行指定列号值 |
|-----------------------------------------------------------------------------|
|int getInt(String colName) 以int形式获取结果集当前行指定列名值 |
|-----------------------------------------------------------------------------|
|float getFloat(int colIndex) 以float形式获取结果集当前行指定列号值 |
|-----------------------------------------------------------------------------|
|float getFloat(String colName) 以float形式获取结果集当前行指定列名值 |
|-----------------------------------------------------------------------------|
|String getString(int colIndex) 以String 形式获取结果集当前行指定列号值 |
|-----------------------------------------------------------------------------|
|String getString(String colName) 以String形式获取结果集当前行指定列名值 |
-----------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
【第十八章】DAO设计模式
DAO(Data Access Object,数据访问对象)是属于J2EE体系架构中数据层的操作,主要的功能是用于进行数据操作的,使用 DAO设计模式可以简化大量代码,增强程序的可移植性。
·数据持久化
将程序中的数据在瞬时状态和持久状态间转换的机制即为数据持久化
实现方式:
数据库
普通文件
XML文件
·程序代码高耦合的影响:
1.可读性差
2.不利于后期修改和维护
3.不利于代码复用
·Dao设计模式组成部分
实体类
工具类
Dao接口
Dao接口实现类
Service业务逻辑接口
Service业务逻辑接口实现类
·Dao设计模式的优势:
1.隔离了数据访问代码和业务逻辑代码
2.隔离了不同数据库实现
·包命名规范
实体类包:com.公司名.项目名.entity
DAO接口类包:com.公司名.项目名.dao
DAO接口实现类包:com.公司名.项目名.impl
Service接口类包:com.公司名.项目名.service
Seriice接口实现类包:com.公司名.项目名.service.impl
·软件系统三层架构
用户请求
↓
表示层(UI)
↓
业务逻辑层(BLL)
↓
数据访问层(DAL)
↓
数据库
·分层原则
封装性原则:每个层次向外公开接口,但是隐藏内部细节
顺序访问原则:下一层为上一层服务,但不使用上层的服务分层结构中,不同层之间通过实体类传输数据
----------------------------------------------------------------------------------------------------------------------
【第十九章】File文件、I/O流
·File
文件可认为是相关记录或放在一起的数据的集合
·File类常用方法
-------------------------------------------------------------------------------------
| 方法名称 说 明 |
|-------------------------------------------------------------------------------------|
|boolean exists( ) 判断文件或目录是否存在 |
|boolean isFile( ) 判断是否是文件 |
|boolean isHidden( ) 判断是否是一个隐藏的文件 |
|boolean isDirectory( ) 判断是否是目录 |