diff --git a/02:Java语言基础/02.md b/02:Java语言基础/02.md index d866bbc..9c41525 100644 --- a/02:Java语言基础/02.md +++ b/02:Java语言基础/02.md @@ -24,7 +24,21 @@ Java的布尔类型和C保持一致,基本的运算符也和C保持一致。 ### 1.3. 位运算 -略 +位运算二进制运算,和C中的位运算是一致的,是指把数字按照二进制的每一位进行运算。 + +例如:0B 和 0A 代表两个byte,转换成位是: + +| 字节1(0x08) | 字节2(0x07) | 说明 | +| ----------- | ----------- | ------------ | +| 0000-1000 | 0000-0111 | 对应的二进制 | + +| 位操作 | 结果 | 说明 | +| ------------ | --------- | ------------------------------ | +| 0x0A & 0x0B | 0000-1000 | 按照每一位对应进行与运算的结果 | +| 0x0A \| 0x0B | 0000-1111 | 按照每一位对应进行或运算的结果 | + +**位操作作为了解。** + ### 1.4. 选择语句 @@ -32,7 +46,7 @@ Java的布尔类型和C保持一致,基本的运算符也和C保持一致。 ### 1.5. 运算优先级 -尽量使用括号 +**尽量使用括号** ### 1.6. 补充例子 @@ -67,6 +81,14 @@ public class LoopRead { } ``` +试一试运行该代码,你可以一直用空格分割,来输入多个整数,这时程序并没有任何的回应;当你输入一个非整形的字符,例如‘a’,这时程序退出,并打印刚刚输入整数的累加和。 + +想一想为什么?重点就在于 `scanner.hasNextInt()` 会一直判断下一个输入是否是整数;如果是整数,就返回真;如果不是整数,就返回假,然后执行break函数。 + +**可以在if语句前面设置断点,然后使用调试工具进行单步跟踪。你会发现,你输入的时候并不会中断;当敲入回车的时候,调试器才会中断;这证明了Scanner是按照一个回车来一次性的读取输入字符串的;如果没有回车,就会一直等待(这是一个阻塞操作)。** + +这个例子很有意思,通过调试过程可以让你更清楚知道Java的每个函数是如何运行的,以及它们都有什么特性。 + ## 2. 重点 本章的内容中的大部分技术要点都与C保持一致,因此之需要掌握几个例子就可以了: diff --git a/02:Java语言基础/03.md b/02:Java语言基础/03.md index 4bf304c..95886cc 100644 --- a/02:Java语言基础/03.md +++ b/02:Java语言基础/03.md @@ -66,7 +66,7 @@ Math.abs(-2.1) returns 2.1 ``` ### 1.3. The random Method -略 +`Math.random();` 函数生成一个0~1之间的double类型的数,包含0,但是不包含1。 ## 2. 字符类型 diff --git a/02:Java语言基础/05.md b/02:Java语言基础/05.md index e69de29..08900d0 100644 --- a/02:Java语言基础/05.md +++ b/02:Java语言基础/05.md @@ -0,0 +1,76 @@ +Java的函数和 C 类似,但因为Java是面向对象的语言,所以又有很多扩展的地方,我们这里主要对其特殊的地方进行讲解。 + +## 静态函数与非静态函数 + + +到目前为止,我们学习的大多是静态函数。什么是静态函数?简单说来,静态函数是不依附对象就可以直接运行的函数。这个怎么解释?要了解静态与非静态函数的区别,首先需要知道什么是对象。前面说过,类是抽象描述的,如同类型定义;对象是类的一个真实变量(分配了具体的内存)。这种关系如果我们第一章的结构体指针类型和一个分配了存储空间的结构体指针变量。 + +### 如何计算字符串的长度 + +接下来看看C的函数的语义。函数是具备高度抽象的计算功能,需要传入参数后返回或者不返回结果(对数据进行修改)。例如C语言如果需要确定字符串的长度,这个函数的原型(签名)是这样的: + +```C {.line-numbers} +int strlen(const char *str) +``` + +注意,C是非面向对象的,因此它需要知道需要计算哪个字符串的长度。 + +接下来,我们看看Java字符串长度的函数: + +```java {.line-numbers} + String s = "Hello world!"; + int size = s.length(); +``` +看到区别了吗?Java计算字符串长度的意思是计算自己本身字符串的长度;C是的含义是计算谁的字符串长度。这个就是最根本的区别。 + +对象是相关数据与在相关数据上操作函数的集合。 + +显然,s这个对象(String类型的实例),本身含有数据(字符串内容),以及相关的操作函数(例如 length 这个函数)。因此length()并不需要传入字符串的参数,因为length()在 s 这个对象上执行,s本身包含数据。 + +一般说来,需要在对象上执行的函数叫做非静态函数;而不需要对象,直接可以运行的函数叫做静态函数。其实,静态变量也是一样的,后面会做解释。 + +在前面几章中我们大多使用静态函数例如对基本类型(小写开头的类型,非类类型,非包装类型)操作的函数大多是静态函数。想一想为什么?因为基本类型尽量做到与C兼容,不是对象,需要静态函数来对基本类型进行操作。后面会学到基本类型的包装类型(warp类型),本生就是对象,因此可以直接在对象上进行操作。 + +想一想,前面学过那些静态函数? + +前面章节也有例外,这些大写的类型都是类,一般都会实例化一个对象进行使用,例如: + +1. String 类型 +2. Scanner 类型 + +### Java与C语言像吗? + +我们看看一个例子: + +```java {.line-numbers} +public class Main { + static int size; + + public static void main(String[] args) { + String s = "Hello world!"; + size = s.length(); + + System.out.printf("String:'%s', size is %d.", s, size); + } +} +``` + +上面这个例子,如果我们把类定义去掉后变成什么样子? + +```java + static int size; + + public static void main(String[] args) { + String s = "Hello world!"; + size = s.length(); + + System.out.printf("String:'%s', size is %d.", s, size); + } +``` + +看看上面的例子,结构是不是非常像C语言? + +思考一个问题:Java有全局变量吗?如果没有,如何实现全局变量? +如何调用一个静态的常量或者是变量?包是如何组织的? + +其实,Java没有C那样的全局变量。因为Java所有的代码必须在一个类定义中(一个类在一个包中)。这样调用一个变量(必须是静态的),可以使用 xxx.yyy.Zzz.var 的方式进行调用。其中:xxx.yyy 是包定义,Zzz是类名,var是该类中的一个静态变量。同理,静态函数的调用也可以使用这种方式。这种方式在Java中叫做命名空间(name space),有什么好处?优势是所有的函数、变量、常量等都在一个空间中,不像C语言是全局的;这样即使是同名的变量、常量、函数,只要不再同一个空间中(也不可能在同一个空间中),那么就是合法的。通过空间的方式,相当于多了一个限定,不必给变量、常量、函数取很长的名字来进行区分。反观C语言,你们会看看很长的命名,因为都在全局中,需要保证命名的唯一性。