声明:
本博客是本人在学习《Java 编程的逻辑》后整理的笔记,旨在方便复习和回顾,并非用作商业用途。
本博客已标明出处,如有侵权请告知,马上删除。
开头语
计算机就是个机器,这个机器主要由 CPU、内存、硬盘和输入输出设备组成。计算机上跑着操作系统,如 Windows 或 Linux,操作系统上运行着各种应用程序,如 Word, QQ 等。
操作系统将时间分成很多细小的时间片,一个时间片给一个程序用,另一个时间片给另一个程序用,并频繁地在程序间切换。不过,在应用程序看来,整个机器资源好像都归他使,操作系统给他提供了这种假象。 对程序员而言,我们写程序,基本不用考虑其他应用程序,我们想好怎么做自己的事就可以了。
应用程序看上去能做很多事情,能读写文档,能播放音乐,能聊天,能玩游戏,能下围棋 … 但本质上,计算机只会执行预先写好的指令而已,这些指令也只是操作数据或者设备。所谓程序,基本上就是告诉计算机要操作的数据和执行的指令序列, 即对什么数据做什么操作。
比如说:
- 读文档,就是将数据从磁盘加载到内存,然后输出到显示器上
- 写文档,就是将数据从内存写回磁盘。
- 播放音乐,就是将音乐的数据加载到内存,然后写到声卡上。
- 聊天,就是从键盘接收聊天数据,放到内存,然后传给网卡,通过网络传给另一个人的网卡,再从网卡传到内存,显示在显示器上。
基本上,所有数据都需要放到内存进行处理,程序的很大一部分工作就是操作在内存中的数据。
1.1 数据类型和变量
1.1.1 数据类型
数据类型用于对数据归类,方便理解和操作。对 Java 语言而言,有如下基本数据类型:
- 整数类型:有四种整型 byte/short/int/long,分别有不同的取值范围
- 小数类型 :有两种类型 float/double,有不同的取值范围和精度
- 字符类型:char,表示单个字符
- 真假类型:boolean,表示真假
基本数据类型都有对应的数组类型,数组表示固定长度的同种数据类型的多条记录,这些数据在内存中挨在一起存放。 比如说,一个自然数可以用一个整数类型数据表示,100 个连续的自然数可以用一个长度为 100 的整数数组表示。一个字符用一个 char 表示,一段文字可以用一个 char 数组表示。
Java 是一个面向对象的语言,除了基本数据类型,其他都是对象类型。对象到底是什么呢?简单的说,对象是由基本数据类型、数组和其他对象组合而成的一个东西,以方便对其整体进行操作。
比如说,一个学生对象,可以由如下信息组成:
- 姓名:一个字符数组
- 年龄:一个整数
- 性别:一个字符
- 入学分数:一个小数
日期在 Java 中也是一个对象,内部表示为整形 long。
1.1.2 变量
为了操作数据,需要把数据存放到内存中,所谓内存在程序看来就是一块有地址编号的连续的空间。数据放到内存中的某个位置后,为了方便地找到和操作这个数据,需要给这个位置起一个名字。编程语言通过变量这个概念来表示这个过程。
声明一个变量,比如 int a 其实就是在内存中分配了一个空间,这个空间存放 int 数据类型,a 指向这个内存空间所在的位置。通过对 a 操作即可操作 a 指向的内存空间,比如 a=5 这个操作即可将 a 指向的内存空间的值改为 5。
之所以叫 “变” 量,是因为它表示的是内存中的位置,这个位置存放的值是可以变化的。
虽然变量的值是可以变化的,但名字是不变的,这个名字应该代表程序员心目中这块内存位置的意义,这个意义应该是不变的。比如说这个变量 int second 表示时钟秒数,在不同时间可以被赋予不同的值,但它表示的就是时钟秒数。之所以说应该是因为这不是必须的,如果你非要起一个变量名叫 age 但赋予它身高的值,计算机也拿你没办法。
1.2 赋值
声明变量之后,就在内存分配了一块位置,但这个位置的内容是未知的,赋值就是把这块位置的内容设为一个确定的值。Java 中基本类型、数组、对象的赋值有明显不同,本文介绍基本类型和数组的赋值,关于对象后续文章会详述。
1.2.1 基本类型
1.2.1.1 整数类型
整数类型有 byte, short, int 和 long,分别占用 1/2/4/8 个字节,取值范围如表 1-1 所示。
赋值形式很简单,直接把熟悉的数字常量形式赋值给变量即可,对应的内存空间的值就从未知变成了确定的常量。但常量不能超过对应类型的表示范围。例如:
byte b = 23;
short s = 3333;
int i = 9999;
long l = 32323;
但是,在给 long 类型赋值时,需要在常量后面加大写或小写的 L,例如:
long a = 3232343433L;
1.2.1.2 小数类型
小数类型有 float 和 double,占用的内存空间分别是 4 和 8 个字节,有不同的取值范围和精度,double 表示的范围更大,精度更高,具体如表 1-2 所示。
E 表示以 10 为底的指数,E 后面的 + 号和 - 号代表正指数和负指数,例如:1.4E-45 表示 1.4 乘以 10 的 -45 次方。后续文章会进一步分析小数的二进制表示。
对于 double,直接把熟悉的小数表示赋值给变量即可,例如:
double d = 333.33;
但对于 float,需要在数字后面加大写 F 或小写 f,例如:
float f = 333.33f;
除了小数,也可以把整数直接赋值给 float 或 double,例如:
float f = 33;
double d = 3333333333333L;
1.2.1.3 真假类型
这个很简单,直接使用 true 或 false 赋值,分别表示真和假,例如:
boolean b = true;
b = false;
1.2.1.4 字符类型
字符类型 char 用于表示一个字符,这个字符可以是中文字符,也可以是英文字符。
char 占用的内存空间是两个字节。
赋值时把常量字符用单引号括起来,不要使用双引号,例如:
char c = 'A';
char z = '中';
1.2.1.5 一些说明
上面介绍的赋值都是直接给变量设置一个常量值。但也可以把变量赋给变量,例如:
int a = 100;
int b = a;
变量可以进行各种运算(后续文章讲解),也可以将变量的运算结果赋给变量,例如:
int a = 1;
int b = 2;
int c = 2*a+b; //2乘以a的值再加上b的值赋给c
上面介绍的赋值都是在声明变量的时候就进行了赋值,但这不是必须的,可以先声明变量,随后再进行赋值。
1.2.2 数组类型
1.2.2.1 赋值语法
基本类型的数组有 3 种赋值形式,如下所示:
1. int[] arr = {1,2,3};
2. int[] arr = new int[]{1,2,3};
3. int[] arr = new int[3];
arr[0]=1; arr[1]=2; arr[2]=3;
第 1 种和第 2 种都是预先知道数组的内容,而第 3 种是先分配长度,然后再给每个元素赋值。
第 3 种形式中,即使没有给每个元素赋值,每个元素也都有一个默认值,这个默认值跟数组类型有关。数值类型的值为 0,boolean 为 false, char 为空字符。
数组长度可以动态确定,如下所示:
int length = ... ;//根据一些条件动态计算
int arr = new int[length];
虽然可以动态确定,但定了之后就不可以变。数组有一个 length 属性,但只能读,不能改。
一个小细节,不能在给定初始值的同时还给定长度,即如下格式是不允许的:
int[] arr = new int[3]{
1,2,3}
这是可以理解的,因为初始值已经决定了长度,再给个长