@@ -61,7 +61,7 @@ Java入门代码用中文写更能被新手理解, 可惜没有看到类似教
61
61
62
62
新建文本文件,命名为"问好.java".输入最简单的一个Java程序:
63
63
64
- ```
64
+ ``` java
65
65
class 问好 {
66
66
public static void main (String [] 参数) {
67
67
// 待续: 要让它做的事
@@ -74,7 +74,7 @@ class 问好 {
74
74
75
75
这个程序可以编译运行(见"手把手"部分),但运行后没有任何输出.因为这个程序是个空架子,没有任何可以看到的运行结果.下面就让它做点事.
76
76
77
- ```
77
+ ``` java
78
78
class 问好 {
79
79
public static void main (String [] 参数) {
80
80
// 要让它做的事
@@ -131,7 +131,7 @@ $ java 问好
131
131
## 四 用Java算术
132
132
133
133
新建文件"四则运算.java"
134
- ```
134
+ ``` java
135
135
class 四则运算 {
136
136
public static void main (String [] 参数) {
137
137
System . out. println(1 + 2 );
@@ -144,7 +144,7 @@ class 四则运算 {
144
144
恭喜! 你已经可以用Java程序完成数学运算了.
145
145
146
146
那么其他的运算呢? 新建文件"根号.java"
147
- ```
147
+ ``` java
148
148
class 根号 {
149
149
public static void main (String [] 参数) {
150
150
System . out. println(Math . sqrt(4 ));
@@ -155,16 +155,16 @@ class 根号 {
155
155
应该不用啰嗦了,试试把4改成其他的数,看看结果如何?
156
156
157
157
现在,你可能已经觉得程序的"回答"太"精简"和生硬了,那么人性化一些吧,下面开始只列出main方法内的代码
158
- ```
158
+ ``` java
159
159
System . out. println(" 4的平方根是" + Math . sqrt(4 ));
160
160
```
161
161
输出听起来顺耳些了,但如果想要把4改成其他数,需要改程序的两个地方,这种麻烦可要不得! 可以把4先存到一个变量里,然后在两处引用同一个变量:
162
- ```
162
+ ``` java
163
163
int 数 = 4 ;
164
164
System . out. println(数 + " 的平方根是" + Math . sqrt(数));
165
165
```
166
166
这样只要改一处了.不过,为了改输入值,还是要改程序,再编译再运行,这种麻烦可要不得! "参数"终于派上用场了.
167
- ```
167
+ ``` java
168
168
int 数 = Integer . parseInt(参数[0 ]);
169
169
System . out. println(数 + " 的平方根是" + Math . sqrt(数));
170
170
```
@@ -184,7 +184,7 @@ Math是Java自带标准库中的数学类,包含很多有用的方法.详细请
184
184
185
185
标准库有很多有用的类. 比如随机数, 用在很多聊天机器人上.
186
186
新建"随机数生成器.java":
187
- ```
187
+ ``` java
188
188
class 随机数生成器 {
189
189
public static void main (String [] 参数) {
190
190
java.util. Random 生成器 = new java.util. Random ();
@@ -199,7 +199,7 @@ java.util.Random是随机数类的全路径, java.util是它所在的包. 没有
199
199
nextInt是产生一个随机数的方法. 为什么Math.sqrt和Integer.parseInt不用new出一个个体呢? 因为它们和main方法一样, 都是静态(static)的.
200
200
201
201
这样重复类的全名看着真累, 下面用import来开头导入这个类路径, 之后就不用再重复了:
202
- ```
202
+ ``` java
203
203
import java.util.Random ;
204
204
205
205
class 随机数生成器 {
@@ -216,7 +216,7 @@ class 随机数生成器 {
216
216
217
217
在上一讲的"根号"类中,用了一个整数(int)变量来保存输入值. "参数"是一个字符串(String)数组.
218
218
Java中还有其他几种基本变量: boolean, char, byte, short, long, float, double
219
- ```
219
+ ``` java
220
220
boolean 年纪尚幼 = true ; // true或false,真或假
221
221
char 姓 = ' 好' ; // 单个字符
222
222
byte 年龄 = 27 ; // 字节: -128到127, 即-2^7到(2^7-1)
@@ -231,7 +231,7 @@ double 体重 = 999999999999.9; // 双精度浮点数: 2^-1074到(2-2^-52)*2^102
231
231
上一讲的四则运算类中,已经尝试了4种运算符. 变量运算的结果可以赋给自己,或者另一个变量.
232
232
233
233
举个例子, 如2岁的时候认识一个字,每年增加两倍, 3年之后会变成多少.下面是一个很直白的计算方法:
234
- ```
234
+ ``` java
235
235
class 识字类 {
236
236
public static void main (String [] 参数) {
237
237
int 识字量 = 1 ;
@@ -268,7 +268,7 @@ class 识字类 {
268
268
269
269
那么反斜杠又是个特殊符号了, 如果要显示它, 就需要再加一个: \\\\
270
270
类似的还有\t(制表符), \n(换行)等等. 如果将来有一个想不出怎么显示的东西, 再找本工具书看看Java特殊字符部分吧. 下面的程序演示一些:
271
- ```
271
+ ``` java
272
272
class 特殊字符 {
273
273
public static void main (String [] 参数) {
274
274
System . out. println(" 边检员看了看证件,头没抬地说\t\" 这么久没回了啊?\" .\n 百感交集,咧着嘴回了一句\t\" 是啊,还没完呢\" " );
@@ -278,7 +278,7 @@ class 特殊字符 {
278
278
前几讲已经用过加号连接多个字符串,以及其他类型的变量. 只要是基本变量,都可以这样和字符串用加号连接,产生一个新的字符串.
279
279
280
280
字符串有不少常用方法,比如获取长度,搜索子字符串,变换英文大小写等等.下面演示他们的用法:
281
- ```
281
+ ``` java
282
282
class 字符串方法 {
283
283
public static void main (String [] 参数) {
284
284
String 字符串 = " 去是go" ;
@@ -293,7 +293,7 @@ class 字符串方法 {
293
293
294
294
## 七 如果...就...不然...
295
295
代码说了算:
296
- ```
296
+ ``` java
297
297
if (年龄 < 20 ) {
298
298
System . out. println(" 没到法定婚龄! 等几年再结婚吧" );
299
299
} else {
@@ -308,7 +308,7 @@ Java支持所有数学中的大小比较符号: < > >= <=
308
308
另外, 因为单个=被用于变量赋值, 判断"等于"就用了双等号: == 不等于呢? !=
309
309
310
310
如果有并列的多个条件,可以串起来这样写:
311
- ```
311
+ ``` java
312
312
if (年龄 < 5 ) {
313
313
System . out. println(" 这是哪家闺女啊?爸妈在哪儿呢?" );
314
314
} else if (年龄 < 20 ) {
@@ -318,7 +318,7 @@ if (年龄 < 5) {
318
318
}
319
319
```
320
320
如果把 <5 和 <20的顺序倒过来:
321
- ```
321
+ ``` java
322
322
if (年龄 < 20 ) {
323
323
System . out. println(" 没到法定婚龄! 等几年再结婚吧" );
324
324
} else if (年龄 < 5 ) {
@@ -331,7 +331,7 @@ if (年龄 < 20) {
331
331
是的,计算机执行程序就是这么老(si)实(ban), 执行第一个被满足的条件之后的{}内代码, 而且无视后面所有else的条件判断.
332
332
333
333
注意: 不同于数值的比较方法, 字符串的"等于"判断有自己的方法equals, 比大小用compareTo:
334
- ```
334
+ ``` java
335
335
if (" 辛苦" . equals(" 不辛苦" )) {
336
336
System . out. println(" 辛不辛苦无所谓" );
337
337
} else if (" 辛苦" . compareTo(" 不辛苦" ) > 0 ){
@@ -348,7 +348,7 @@ if ("辛苦".equals("不辛苦")) {
348
348
记得算识字量的程序么? 如果要算10年, 难道必须重复10行` 识字量 = (1 + 每年翻倍数) * 识字量; ` 吗? 用脚趾想也不可能吧.
349
349
350
350
在写代码之前, 不妨先构思一下该怎么算. 这里多了一个输入值: 年限. 照原来的思路应该是: 每过一年增加一次识字量, 直到过了10年. 这样就需要记着过了多少年. 之前提到, 一个变量用来"记"变化的值最合适:
351
- ```
351
+ ``` java
352
352
for (int 年份 = 0 ; 年份 < 年限; 年份 = 年份 + 1 ) {
353
353
识字量 = (1 + 每年翻倍数) * 识字量;
354
354
}
@@ -359,7 +359,7 @@ for (int 年份 = 0; 年份 < 年限; 年份 = 年份 + 1) {
359
359
- 3 "年份"加一, 继续执行第2步
360
360
361
361
同样的循环用while的格式来写是这样:
362
- ```
362
+ ``` java
363
363
int 年份 = 0 ;
364
364
while (年份 < 年限) {
365
365
识字量 = (1 + 每年翻倍数) * 识字量;
@@ -369,7 +369,7 @@ while (年份 < 年限) {
369
369
看起来for循环更紧凑, 也更不容易写错. while循环里,如果忘写了"年份 = 年份 + 1;",可就有趣了,因为年份没有增加, 循环中止条件一直不能满足(0永远小于年限), 代码运行停不下来,俗称"死循环". 而for循环里因为定了"(初始化; 循环条件; 累加或递减执行语句)"的格式, 少了一项会很扎眼.
370
370
371
371
如果想要提前结束循环,可以用break. 想知道过几年能认识中文的常用三千字的话:
372
- ```
372
+ ``` java
373
373
int 年份 = 0 ;
374
374
while (年份 < 年限) {
375
375
if (识字量 > 3000 ) {
@@ -383,7 +383,7 @@ System.out.println(年份 + "年后认识" + 识字量 + "个字");
383
383
break执行后,它所在的循环就被打断,程序从循环之后开始执行.
384
384
385
385
如果想要循环继续执行,但是跳过循环内的部分代码,可以用continue. 一个牵强的例子,如果从第三年才开始认识新字(比如在国外呆了三年):
386
- ```
386
+ ``` java
387
387
for (int 年份 = 0 ; 年份 < 年限; 年份 = 年份 + 1 ) {
388
388
if (年份 < 3 ) {
389
389
continue ;
@@ -400,12 +400,12 @@ for (int 年份 = 0; 年份 < 年限; 年份 = 年份 + 1) {
400
400
401
401
我们都是人类,每个人都是一个个体,大多数人有共有的属性和行为,同时也存在个体之间的差异.
402
402
下面就来在程序里定义一个"人"类:
403
- ```
403
+ ``` java
404
404
public class 人 {
405
405
}
406
406
```
407
407
这样的"人"还什么都做不了. 我们出生后都有姓名,那么它也应该有:
408
- ```
408
+ ``` java
409
409
public class 人 {
410
410
String 姓名 = " 无名氏" ;
411
411
@@ -416,7 +416,7 @@ public class 人 {
416
416
```
417
417
这个类具有了"姓名"属性, "自我介绍"方法引用了这个属性并输出加工后的回答.
418
418
class前的public表示"人"可以在其他类里使用. 比如这个"世界"类里, "我"是"人"类的一个个体:
419
- ```
419
+ ``` java
420
420
class 世界 {
421
421
public static void main(String [] 参数) {
422
422
人 我 = new 人();
@@ -425,13 +425,13 @@ class 世界 {
425
425
}
426
426
```
427
427
不过,应该有个像样的名字,而不是默认的"无名氏". 需要在自我介绍之前,先定名字:
428
- ```
428
+ ``` java
429
429
我. 姓名 = " 小白" ;
430
430
```
431
431
编译运行"世界"后,可以看到输出.
432
432
433
433
这个世界好像太单调了,人有不同分类,大人,小孩等等,他们做不同的事.新建"大人"类:
434
- ```
434
+ ``` java
435
435
public class 大人 extends 人 {
436
436
String 责任 = " 扶老携幼" ;
437
437
@@ -441,7 +441,7 @@ public class 大人 extends 人 {
441
441
}
442
442
```
443
443
再新建"小孩"类:
444
- ```
444
+ ``` java
445
445
public class 小孩 extends 人 {
446
446
String 想做的事 = " 大人的事" ;
447
447
@@ -451,7 +451,7 @@ public class 小孩 extends 人 {
451
451
}
452
452
```
453
453
现在的世界要喧闹一些了:
454
- ```
454
+ ``` java
455
455
class 世界 {
456
456
public static void main(String [] 参数) {
457
457
大人 大白 = new 大人();
@@ -474,7 +474,7 @@ class 世界 {
474
474
## 十 让它更像人
475
475
476
476
一个人还有很多属性:
477
- ```
477
+ ``` java
478
478
public class 人 {
479
479
String 姓名 = " 无名氏" ;
480
480
int 年龄 = 0 ;
@@ -487,7 +487,7 @@ public class 人 {
487
487
}
488
488
```
489
489
谁的小秘密都不可以直接让别人知道. private就限制了这个变量只能给个体内部使用, 任何其他类里,都不能直接获取这个值. 下面这个程序在编译会报错:
490
- ```
490
+ ``` java
491
491
class 世界 {
492
492
public static void main(String [] 参数) {
493
493
人 我 = new 人();
@@ -496,7 +496,7 @@ class 世界 {
496
496
}
497
497
```
498
498
既然这个小秘密只能由自己引用和修改, 一般有公开方法可以让其他类间接接触这个变量:
499
- ```
499
+ ``` java
500
500
public String 回答(String 听到的) {
501
501
if (听到的. contains(" ?" )) {
502
502
return " 你猜? 答案长度是" + 小秘密. length();
@@ -513,20 +513,20 @@ public String 回答(String 听到的) {
513
513
这个方法返回(return)一个字符串. 可以在"世界"类里打印出每个回答.
514
514
515
515
在创建个体的时候, 之前都是new xxxx(), 没有传入任何参数. 因此如果在创建后对属性初始化就需要这样做:
516
- ```
516
+ ``` java
517
517
大人 大白 = new 大人();
518
518
大白. 姓名 = " 大白" ;
519
519
大白. 年龄 = 30 ;
520
520
```
521
521
另一种比较简洁的方法是, 在"大人"类里定义一个带参数的创建方法:
522
- ```
522
+ ``` java
523
523
public 大人(String 姓名, int 年龄) {
524
524
this . 姓名 = 姓名;
525
525
this . 年龄 = 年龄;
526
526
}
527
527
```
528
528
然后在创建"大人"个体时,就可以这样:
529
- ```
529
+ ``` java
530
530
大人 大白 = new 大人("大白", 30);
531
531
```
532
532
同样可以在"小孩"类里定义一个类似的创建方法. 黏贴复制的很愉快吧? 不过每当这样愉快的时候,就需要警惕一下,因为重复的代码往往意味着设计问题,而且很可能增加今后代码维护的难度. 一个不成文的经验是, 重复代码越少越好.
@@ -539,7 +539,7 @@ public String 回答(String 听到的) {
539
539
## 十一 数据排排站-数组
540
540
541
541
第四讲里, 已经用过了"参数"这个字符串数组. 下面我们用数组给人排队:
542
- ```
542
+ ``` java
543
543
class 排队 {
544
544
public static void main(String [] 参数) {
545
545
人[] 一队 = {
@@ -560,7 +560,7 @@ class 排队 {
560
560
注意: 数组的序号是从0开始的, 这是比Java年纪还大的一个老传统, 再配合一下吧.
561
561
562
562
数组还有另一种初始化方法:
563
- ```
563
+ ``` java
564
564
人[] 二队 = new 人[10];
565
565
二队[0 ] = new 人("阿狗", 11);
566
566
二队[1 ] = new 人("阿猫", 10);
@@ -570,15 +570,15 @@ class 排队 {
570
570
很直白, 一开始是初始化一个长度是10的数组, 之后就是往数组中的指定位置放个体.
571
571
572
572
如果对二队按照一队的方式来"报数", 会报错NullPointerException,因为位置2还空着. 这时需要加个"不为空"的判断条件:
573
- ```
573
+ ``` java
574
574
for (int 序号 = 0 ; 序号 < 二队. length; 序号++ ) {
575
575
if (二队[序号] != null ) {
576
576
二队[序号]. 自我介绍();
577
577
}
578
578
}
579
579
```
580
580
排了队, 下面就试试按照某个属性排序. 比如要按年龄对一队排序. 大略的思路可能是: 比较相邻的两人年纪,谁小就排在前面. 下面是Java对应这种思路的一种程序:
581
- ```
581
+ ``` java
582
582
java.util. Arrays . sort(一队, new java.util.Comparator<人 >() {
583
583
@Override
584
584
public int compare (人 甲, 人 乙) {
@@ -589,7 +589,7 @@ class 排队 {
589
589
Arrays和Comparator都是java.util包里的类. 如果嫌这样不美观可以在程序前import这两个类.
590
590
591
591
如果想要排个方阵呢? 只要再加一对[ ] 就可以了:
592
- ```
592
+ ``` java
593
593
人[][] 方阵 = new 方阵[10][15 ];
594
594
方阵[0 ][0 ] = new 人("阿狗",3);
595
595
方阵[2 ][4 ] = new 人("阿猫",4);
@@ -624,7 +624,7 @@ Arrays和Comparator都是java.util包里的类. 如果嫌这样不美观可以
624
624
第四讲里, 用到了Integer.parseInt方法. 如果参数输错, 比如"啊呜",运行后会打印出一堆诡异的东西, 其中有NumberFormatException, 也提到"啊呜". 不用懂英文也能猜到这个输入有点问题了.
625
625
626
626
这个NumberFormatException属于Exception, 俗语叫"异常", 但直译是"例外", 感觉后者的字面意思明确些. 比如这个把字符串转换成整数的方法, "啊呜"对它来说就是个束手无策的例外情况, 拿到手里既然处理不了就会把它"丢"出来. 丢出来就得"接住", 不然像前面那样就砸了. 下面的try ... catch 就是"试试看...接住(例外情况)...":
627
- ```
627
+ ``` java
628
628
int 数 = 0 ;
629
629
try {
630
630
数 = Integer . parseInt(参数[0 ]);
0 commit comments