Skip to content

Commit e2056d6

Browse files
authored
#4 语法高亮
1 parent 4053280 commit e2056d6

File tree

1 file changed

+40
-40
lines changed

1 file changed

+40
-40
lines changed

README.md

+40-40
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ Java入门代码用中文写更能被新手理解, 可惜没有看到类似教
6161

6262
新建文本文件,命名为"问好.java".输入最简单的一个Java程序:
6363

64-
```
64+
```java
6565
class 问好 {
6666
public static void main (String[] 参数) {
6767
// 待续: 要让它做的事
@@ -74,7 +74,7 @@ class 问好 {
7474

7575
这个程序可以编译运行(见"手把手"部分),但运行后没有任何输出.因为这个程序是个空架子,没有任何可以看到的运行结果.下面就让它做点事.
7676

77-
```
77+
```java
7878
class 问好 {
7979
public static void main (String[] 参数) {
8080
// 要让它做的事
@@ -131,7 +131,7 @@ $ java 问好
131131
## 四 用Java算术
132132

133133
新建文件"四则运算.java"
134-
```
134+
```java
135135
class 四则运算 {
136136
public static void main (String[] 参数) {
137137
System.out.println(1+2);
@@ -144,7 +144,7 @@ class 四则运算 {
144144
恭喜! 你已经可以用Java程序完成数学运算了.
145145

146146
那么其他的运算呢? 新建文件"根号.java"
147-
```
147+
```java
148148
class 根号 {
149149
public static void main (String[] 参数) {
150150
System.out.println(Math.sqrt(4));
@@ -155,16 +155,16 @@ class 根号 {
155155
应该不用啰嗦了,试试把4改成其他的数,看看结果如何?
156156

157157
现在,你可能已经觉得程序的"回答"太"精简"和生硬了,那么人性化一些吧,下面开始只列出main方法内的代码
158-
```
158+
```java
159159
System.out.println("4的平方根是" + Math.sqrt(4));
160160
```
161161
输出听起来顺耳些了,但如果想要把4改成其他数,需要改程序的两个地方,这种麻烦可要不得! 可以把4先存到一个变量里,然后在两处引用同一个变量:
162-
```
162+
```java
163163
int= 4;
164164
System.out.println(数 + "的平方根是" + Math.sqrt(数));
165165
```
166166
这样只要改一处了.不过,为了改输入值,还是要改程序,再编译再运行,这种麻烦可要不得! "参数"终于派上用场了.
167-
```
167+
```java
168168
int= Integer.parseInt(参数[0]);
169169
System.out.println(数 + "的平方根是" + Math.sqrt(数));
170170
```
@@ -184,7 +184,7 @@ Math是Java自带标准库中的数学类,包含很多有用的方法.详细请
184184

185185
标准库有很多有用的类. 比如随机数, 用在很多聊天机器人上.
186186
新建"随机数生成器.java":
187-
```
187+
```java
188188
class 随机数生成器 {
189189
public static void main (String[] 参数) {
190190
java.util.Random 生成器 = new java.util.Random();
@@ -199,7 +199,7 @@ java.util.Random是随机数类的全路径, java.util是它所在的包. 没有
199199
nextInt是产生一个随机数的方法. 为什么Math.sqrt和Integer.parseInt不用new出一个个体呢? 因为它们和main方法一样, 都是静态(static)的.
200200

201201
这样重复类的全名看着真累, 下面用import来开头导入这个类路径, 之后就不用再重复了:
202-
```
202+
```java
203203
import java.util.Random;
204204

205205
class 随机数生成器 {
@@ -216,7 +216,7 @@ class 随机数生成器 {
216216

217217
在上一讲的"根号"类中,用了一个整数(int)变量来保存输入值. "参数"是一个字符串(String)数组.
218218
Java中还有其他几种基本变量: boolean, char, byte, short, long, float, double
219-
```
219+
```java
220220
boolean 年纪尚幼 = true; // true或false,真或假
221221
char= ''; // 单个字符
222222
byte 年龄 = 27; // 字节: -128到127, 即-2^7到(2^7-1)
@@ -231,7 +231,7 @@ double 体重 = 999999999999.9; // 双精度浮点数: 2^-1074到(2-2^-52)*2^102
231231
上一讲的四则运算类中,已经尝试了4种运算符. 变量运算的结果可以赋给自己,或者另一个变量.
232232

233233
举个例子, 如2岁的时候认识一个字,每年增加两倍, 3年之后会变成多少.下面是一个很直白的计算方法:
234-
```
234+
```java
235235
class 识字类 {
236236
public static void main (String[] 参数) {
237237
int 识字量 = 1;
@@ -268,7 +268,7 @@ class 识字类 {
268268

269269
那么反斜杠又是个特殊符号了, 如果要显示它, 就需要再加一个: \\\\
270270
类似的还有\t(制表符), \n(换行)等等. 如果将来有一个想不出怎么显示的东西, 再找本工具书看看Java特殊字符部分吧. 下面的程序演示一些:
271-
```
271+
```java
272272
class 特殊字符 {
273273
public static void main (String[] 参数) {
274274
System.out.println("边检员看了看证件,头没抬地说\t\"这么久没回了啊?\".\n百感交集,咧着嘴回了一句\t\"是啊,还没完呢\"");
@@ -278,7 +278,7 @@ class 特殊字符 {
278278
前几讲已经用过加号连接多个字符串,以及其他类型的变量. 只要是基本变量,都可以这样和字符串用加号连接,产生一个新的字符串.
279279

280280
字符串有不少常用方法,比如获取长度,搜索子字符串,变换英文大小写等等.下面演示他们的用法:
281-
```
281+
```java
282282
class 字符串方法 {
283283
public static void main (String[] 参数) {
284284
String 字符串 = "去是go";
@@ -293,7 +293,7 @@ class 字符串方法 {
293293

294294
## 七 如果...就...不然...
295295
代码说了算:
296-
```
296+
```java
297297
if (年龄 < 20) {
298298
System.out.println("没到法定婚龄! 等几年再结婚吧");
299299
} else {
@@ -308,7 +308,7 @@ Java支持所有数学中的大小比较符号: < > >= <=
308308
另外, 因为单个=被用于变量赋值, 判断"等于"就用了双等号: == 不等于呢? !=
309309

310310
如果有并列的多个条件,可以串起来这样写:
311-
```
311+
```java
312312
if (年龄 < 5) {
313313
System.out.println("这是哪家闺女啊?爸妈在哪儿呢?");
314314
} else if (年龄 < 20) {
@@ -318,7 +318,7 @@ if (年龄 < 5) {
318318
}
319319
```
320320
如果把 <5 和 <20的顺序倒过来:
321-
```
321+
```java
322322
if (年龄 < 20) {
323323
System.out.println("没到法定婚龄! 等几年再结婚吧");
324324
} else if (年龄 < 5) {
@@ -331,7 +331,7 @@ if (年龄 < 20) {
331331
是的,计算机执行程序就是这么老(si)实(ban), 执行第一个被满足的条件之后的{}内代码, 而且无视后面所有else的条件判断.
332332

333333
注意: 不同于数值的比较方法, 字符串的"等于"判断有自己的方法equals, 比大小用compareTo:
334-
```
334+
```java
335335
if ("辛苦".equals("不辛苦")) {
336336
System.out.println("辛不辛苦无所谓");
337337
} else if ("辛苦".compareTo("不辛苦") > 0){
@@ -348,7 +348,7 @@ if ("辛苦".equals("不辛苦")) {
348348
记得算识字量的程序么? 如果要算10年, 难道必须重复10行`识字量 = (1 + 每年翻倍数) * 识字量;`吗? 用脚趾想也不可能吧.
349349

350350
在写代码之前, 不妨先构思一下该怎么算. 这里多了一个输入值: 年限. 照原来的思路应该是: 每过一年增加一次识字量, 直到过了10年. 这样就需要记着过了多少年. 之前提到, 一个变量用来"记"变化的值最合适:
351-
```
351+
```java
352352
for (int 年份 = 0; 年份 < 年限; 年份 = 年份 + 1) {
353353
识字量 = (1 + 每年翻倍数) * 识字量;
354354
}
@@ -359,7 +359,7 @@ for (int 年份 = 0; 年份 < 年限; 年份 = 年份 + 1) {
359359
- 3 "年份"加一, 继续执行第2步
360360

361361
同样的循环用while的格式来写是这样:
362-
```
362+
```java
363363
int 年份 = 0;
364364
while (年份 < 年限) {
365365
识字量 = (1 + 每年翻倍数) * 识字量;
@@ -369,7 +369,7 @@ while (年份 < 年限) {
369369
看起来for循环更紧凑, 也更不容易写错. while循环里,如果忘写了"年份 = 年份 + 1;",可就有趣了,因为年份没有增加, 循环中止条件一直不能满足(0永远小于年限), 代码运行停不下来,俗称"死循环". 而for循环里因为定了"(初始化; 循环条件; 累加或递减执行语句)"的格式, 少了一项会很扎眼.
370370

371371
如果想要提前结束循环,可以用break. 想知道过几年能认识中文的常用三千字的话:
372-
```
372+
```java
373373
int 年份 = 0;
374374
while (年份 < 年限) {
375375
if (识字量 > 3000) {
@@ -383,7 +383,7 @@ System.out.println(年份 + "年后认识" + 识字量 + "个字");
383383
break执行后,它所在的循环就被打断,程序从循环之后开始执行.
384384

385385
如果想要循环继续执行,但是跳过循环内的部分代码,可以用continue. 一个牵强的例子,如果从第三年才开始认识新字(比如在国外呆了三年):
386-
```
386+
```java
387387
for (int 年份 = 0; 年份 < 年限; 年份 = 年份 + 1) {
388388
if (年份 < 3) {
389389
continue;
@@ -400,12 +400,12 @@ for (int 年份 = 0; 年份 < 年限; 年份 = 年份 + 1) {
400400

401401
我们都是人类,每个人都是一个个体,大多数人有共有的属性和行为,同时也存在个体之间的差异.
402402
下面就来在程序里定义一个"人"类:
403-
```
403+
```java
404404
public class 人 {
405405
}
406406
```
407407
这样的"人"还什么都做不了. 我们出生后都有姓名,那么它也应该有:
408-
```
408+
```java
409409
public class 人 {
410410
String 姓名 = "无名氏";
411411

@@ -416,7 +416,7 @@ public class 人 {
416416
```
417417
这个类具有了"姓名"属性, "自我介绍"方法引用了这个属性并输出加工后的回答.
418418
class前的public表示"人"可以在其他类里使用. 比如这个"世界"类里, "我"是"人"类的一个个体:
419-
```
419+
```java
420420
class 世界 {
421421
public static void main(String[] 参数) {
422422
人 我 = new 人();
@@ -425,13 +425,13 @@ class 世界 {
425425
}
426426
```
427427
不过,应该有个像样的名字,而不是默认的"无名氏". 需要在自我介绍之前,先定名字:
428-
```
428+
```java
429429
.姓名 = "小白";
430430
```
431431
编译运行"世界"后,可以看到输出.
432432

433433
这个世界好像太单调了,人有不同分类,大人,小孩等等,他们做不同的事.新建"大人"类:
434-
```
434+
```java
435435
public class 大人 extends 人 {
436436
String 责任 = "扶老携幼";
437437

@@ -441,7 +441,7 @@ public class 大人 extends 人 {
441441
}
442442
```
443443
再新建"小孩"类:
444-
```
444+
```java
445445
public class 小孩 extends 人 {
446446
String 想做的事 = "大人的事";
447447

@@ -451,7 +451,7 @@ public class 小孩 extends 人 {
451451
}
452452
```
453453
现在的世界要喧闹一些了:
454-
```
454+
```java
455455
class 世界 {
456456
public static void main(String[] 参数) {
457457
大人 大白 = new 大人();
@@ -474,7 +474,7 @@ class 世界 {
474474
## 十 让它更像人
475475

476476
一个人还有很多属性:
477-
```
477+
```java
478478
public class 人 {
479479
String 姓名 = "无名氏";
480480
int 年龄 = 0;
@@ -487,7 +487,7 @@ public class 人 {
487487
}
488488
```
489489
谁的小秘密都不可以直接让别人知道. private就限制了这个变量只能给个体内部使用, 任何其他类里,都不能直接获取这个值. 下面这个程序在编译会报错:
490-
```
490+
```java
491491
class 世界 {
492492
public static void main(String[] 参数) {
493493
人 我 = new 人();
@@ -496,7 +496,7 @@ class 世界 {
496496
}
497497
```
498498
既然这个小秘密只能由自己引用和修改, 一般有公开方法可以让其他类间接接触这个变量:
499-
```
499+
```java
500500
public String 回答(String 听到的) {
501501
if (听到的.contains("?")) {
502502
return "你猜? 答案长度是" + 小秘密.length();
@@ -513,20 +513,20 @@ public String 回答(String 听到的) {
513513
这个方法返回(return)一个字符串. 可以在"世界"类里打印出每个回答.
514514

515515
在创建个体的时候, 之前都是new xxxx(), 没有传入任何参数. 因此如果在创建后对属性初始化就需要这样做:
516-
```
516+
```java
517517
大人 大白 = new 大人();
518518
大白.姓名 = "大白";
519519
大白.年龄 = 30;
520520
```
521521
另一种比较简洁的方法是, 在"大人"类里定义一个带参数的创建方法:
522-
```
522+
```java
523523
public 大人(String 姓名, int 年龄) {
524524
this.姓名 = 姓名;
525525
this.年龄 = 年龄;
526526
}
527527
```
528528
然后在创建"大人"个体时,就可以这样:
529-
```
529+
```java
530530
大人 大白 = new 大人("大白", 30);
531531
```
532532
同样可以在"小孩"类里定义一个类似的创建方法. 黏贴复制的很愉快吧? 不过每当这样愉快的时候,就需要警惕一下,因为重复的代码往往意味着设计问题,而且很可能增加今后代码维护的难度. 一个不成文的经验是, 重复代码越少越好.
@@ -539,7 +539,7 @@ public String 回答(String 听到的) {
539539
## 十一 数据排排站-数组
540540

541541
第四讲里, 已经用过了"参数"这个字符串数组. 下面我们用数组给人排队:
542-
```
542+
```java
543543
class 排队 {
544544
public static void main(String[] 参数) {
545545
人[] 一队 = {
@@ -560,7 +560,7 @@ class 排队 {
560560
注意: 数组的序号是从0开始的, 这是比Java年纪还大的一个老传统, 再配合一下吧.
561561

562562
数组还有另一种初始化方法:
563-
```
563+
```java
564564
人[] 二队 = new 人[10];
565565
二队[0] = new 人("阿狗", 11);
566566
二队[1] = new 人("阿猫", 10);
@@ -570,15 +570,15 @@ class 排队 {
570570
很直白, 一开始是初始化一个长度是10的数组, 之后就是往数组中的指定位置放个体.
571571

572572
如果对二队按照一队的方式来"报数", 会报错NullPointerException,因为位置2还空着. 这时需要加个"不为空"的判断条件:
573-
```
573+
```java
574574
for (int 序号 = 0; 序号 < 二队.length; 序号++) {
575575
if (二队[序号] != null) {
576576
二队[序号].自我介绍();
577577
}
578578
}
579579
```
580580
排了队, 下面就试试按照某个属性排序. 比如要按年龄对一队排序. 大略的思路可能是: 比较相邻的两人年纪,谁小就排在前面. 下面是Java对应这种思路的一种程序:
581-
```
581+
```java
582582
java.util.Arrays.sort(一队, new java.util.Comparator<人>() {
583583
@Override
584584
public int compare(人 甲, 人 乙) {
@@ -589,7 +589,7 @@ class 排队 {
589589
Arrays和Comparator都是java.util包里的类. 如果嫌这样不美观可以在程序前import这两个类.
590590

591591
如果想要排个方阵呢? 只要再加一对[]就可以了:
592-
```
592+
```java
593593
人[][] 方阵 = new 方阵[10][15];
594594
方阵[0][0] = new 人("阿狗",3);
595595
方阵[2][4] = new 人("阿猫",4);
@@ -624,7 +624,7 @@ Arrays和Comparator都是java.util包里的类. 如果嫌这样不美观可以
624624
第四讲里, 用到了Integer.parseInt方法. 如果参数输错, 比如"啊呜",运行后会打印出一堆诡异的东西, 其中有NumberFormatException, 也提到"啊呜". 不用懂英文也能猜到这个输入有点问题了.
625625

626626
这个NumberFormatException属于Exception, 俗语叫"异常", 但直译是"例外", 感觉后者的字面意思明确些. 比如这个把字符串转换成整数的方法, "啊呜"对它来说就是个束手无策的例外情况, 拿到手里既然处理不了就会把它"丢"出来. 丢出来就得"接住", 不然像前面那样就砸了. 下面的try ... catch 就是"试试看...接住(例外情况)...":
627-
```
627+
```java
628628
int= 0;
629629
try {
630630
= Integer.parseInt(参数[0]);

0 commit comments

Comments
 (0)