「Java教程」语法基础

这是Java教程的第一篇,梳理Java基础知识是学习其他专业知识的第一步阶梯;要想精通编程必须通过大量的编程训练,在实践中掌握编程知识,培养编程能力,并逐步理解和掌握程序设计的思想和方法。

1. 数据类型

1.1 两大类:

  1. 基本数据类型:byte, short, int, long, float, double, boolean, char
  2. 引用类型:数组,类(抽象类)class,接口interface,枚举enum,注解@interface

注:单个字节表示8位二进制位,最左边表示符号位(0:正,1:负)。

1.2 整数类型(byte, short, int, long)

  1. byte: 1字节,范围-2^7 ~ 2^7-1,即-128-127
  2. short: 2字节,范围-2^15 ~ 2^15-1,即-32768 ~ 32767
  3. int: 4个字节,范围-2^31 ~ 2^31-1,即正负21亿之间。
  4. long: 8个字节,范围-2^63 ~ 2^63-1,比int更大。如果要表示long类型数值,需要Ll结尾。

1.3 浮点类型(float,double)

  1. float:4个字节,单精度浮点数,取到小数点后7位有效数字。如果表示float类型数值,需要Ff结尾。
  2. double:8个字节,双精度浮点数,取到小数点后15位有效数字。如果表示double类型数值,需要Dd结尾。

扩展:浮点运算有时会有误差,为了实现精确运算可使用java.math.BigDecimal类型加以描述。

1.5 字符类型(char)

  1. char:2个字节,表示单个字符的数据类型。事实是一个16位无符号整数,值是对应字符的编码,如:'a','1','中' 等。
  • 开发中很少用到char类型,而使用String类型描述的多个字符组成的字符串,使用双引号""引起来。
  • 需记住的ASII码字符:'a':97'A':65'0':48空格:32换行符:10
  • 常用转义符(逃逸字符):\t:制表符,\n:换行,\"\'\\:反斜杠本身,\b:回退一格,\r:回车
  • 字符类型计算
    • 一个字符加一个数字,得到Unicode码表中那个数之后的字符
    • 两个字符相减得到它们在表中的距离
    • char也可以和int之间相互赋值

2. 变量与常量

2.1 常量

  • 常量是一个值,在程序运行的过程中不能再次发生改变
  • 基本类型的值都可以认为是常量:4,3.4,'a',true;引用类型String类的值"abc"视为常量。
  • 常量存储在常量缓冲区(常量池)中,有且只有一份,常量池中的值默认空间大小int(32bit),double(64bit)

2.2 变量

  • 变量是在栈内存中开辟的一块内存空间,程序执行过程中可以改变;
  • 变量空间在创建的时候(声明变量),必须指定数据类型,变量空间的名字
  • 变量空间,里面只能存储一个内容(值/引用)
  • 空间内的类容的类型与定义时一致,内容可以改变
  • 内存结构与执行过程:类的定义,编译,加载空间各个区,变量赋值

2.3 标识符(变量)命名规则

  1. 必须字母,数字,下划线以及美元$等组成,且首位非数字。
  2. 不能使用Java语言中的关键字,如classstaticvoidint等。
  3. 区分大小写,长度无限制,但不能过长,尽量见名知意。

2.3 命名的规约

  • 类名字:首字母大写,如果两个以上的单词,所有首字母都大写
  • 变量名:首字母小写,如果两个以上的单词,之后的首字母大写
  • 遵循驼峰式命名规约,所有名字都需要见名知义,为了增强程序的可读性

3. 数据类型之间的转换

3.1 基本数据类型之间转换

  1. 自动类型转换:从小类型到大类型自动转换
1
2
byte --> short --> int --> long --> float --> double
char -----^
  1. 强制类型转换:需在被转换数据前加上类型,会造成精度损失或者溢出
1
2
long big = 1024L\*1024\*1024;
int i = (int)big;

3.2其他数据类型之间转换

  • 同种大类型之间才能发生转换
    • 基本–基本 可以直接转换(自动 强制)
    • 引用–引用 可以直接转化(自动 强制 – 上转型 下转型)
    • 基本–引用 不可以直接进行转化(间接-桥梁-包装类)
  • 小数据类型一致:整型–>整型 / 浮点–>浮点
    • 比较内存空间的大小
    • 大数据类型空间可以直接接受小数据类型的值(自动转换)
    • 小数据类型空间不可以直接接受大数据类型的值(强制类型转换)
    • 强制类型转换,写法好用,但是需要注意取值范围的问题,丢失一部分数据
1
2
3
4
byte a = 1;   int b = a;//自动直接转化就可以
int a = 1; byte b = (byte)a;//需要强制类型转换
float x = 3.4F; double y = x;//自动直接转化
double x = 3.4; float y = (float)x;//强制转换
  • 小数据类型不一致:整型–>浮点
    • 比较精确程度
    • 浮点型的精确程度更高
    • 任何一个浮点型空间都可以直接接受一个整型的值
    • 反之需要进行强制类型转换(强行将小数点之后的部分去掉,只保留整数)
1
2
int a = 1;  float b = a;//自动直接转化
float a =1.0F; int b = (int)a;//强制类型转换
  • 整型–>字符
    • 每一个字符都对应这一个Unicode码 a–97
1
2
char x = 'a';  int y = x;//自动转化  y--97
int x = 97; char y = (char)x;//强制的转化
  • 布尔类型很特殊
    • 不能与其他基本类型之间发生转化

4. 运算符

  1. 算术运算符: +-*/%
  2. 关系运算符: ><>=<===!=
  3. 自增减运算符: ++--
  4. 逻辑运算符: &&||(短路特性:逻辑与&&运算,若第一个条件为假,跳过第二个条件;逻辑或||运算,若第一个条件为真,跳过第二个条件)
  5. 三目运算符: 条件 ? 表达式1 : 表达式2
  6. 赋值运算符:=+=-=*==

5. 循环

  1. while循环和for循环完全可以互换。
  2. while循环主要用于明确循环条件,但不明确循环次数的场合
  3. for循环主要用于明确次数或范围的场合
  4. while(true) 等价于 for(;;),表示无限循环。

6. 数组

6.1 一维数组

  • 数组类型[] 数组名 = new 数据类型[长度] :动态方式
1
2
数组类型[] 数组名 = new 数据类型[长度] //动态方式
int[] arr = new int[5];
1
2
3
数组类型[] 数组名 = {初始值1, 初始值1, 初始值1, ...} //静态方式
int[] arr = {10, 20, 30, 40};
/*特殊方式:*/ int[] arr = new int[]{10, 20, 30};

6.2 二维数组

1
2
数组类型[][] 数组名 = new 数据类型[行数][列数]
int[][] arr = new int[5][6];
1
2
数组类型[][] 数组名 = {{初始值1, 初始值1, 初始值1},{值2,...} ...}
int[] arr = {{10, 20, 30}, {01, 5, 3}, {8, 20, 6}};

二维数组arr.length表示行数,arr[0].length表示此行的长度

7. 函数

  • 函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或一个值。
1
2
3
4
5
6
7
8
9
public static int sum(int a, int b){
int i;
int sum=0;
for(i=a; i<=b; i++){
sum += i;
}
System.out.println(a +"到"+ b +"的和是"+ sum);
return sum;
}
  • 函数的调用:函数名(参数值); 即使没有参数也需要(),()起到了调用函数的作用,如果有参数,则需要给出正确的数量和顺序
  • 函数的返回:return停止函数的执行,并返回一个值,可以再赋值给变量,传递给另一个函数,甚至可以丢弃,有时候要的是副作用。