1变量

1.1变量的定义

变量是一个用于存放用户数据或程序运行产生数据的量。通常来说,如果定义了一个变量,那么计算机会在内存中为该变量开辟一块空间,这块空间用于存放该变量对应的数据。

1.2变量的命名规则

Java中,变量命名有如下规则:

  1. 必须以字母、下划线、或者美元符$开头;以美元符$ 开头命名的变量虽然能够编译通过但是不建议使用;中文也可以作为命名开头且编译也能通过,但是不建议使用。
  2. 除开头外后面的部分可以有字母、下划线、美元符java 可以中文作变量吗 java变量能用中文吗_java 可以中文作变量吗` 的变量虽然能够编译通过但是不建议使用。
  3. 变量名不限制长度,但要能表达清楚命名的含义。
  4. 变量名不可以和java的关键字冲突。(附:Java关键字)
  5. 变量名大小写敏感,即Aa是两个完全不同的变量。

1.3变量的定义和使用

Java的变量定义、赋值和使用规则与C语言一样。

1.3.1变量的作用域

同C语言一样,Java变量的作用域仅限在一个代码块内(即一个花括号内)。

2数据类型

Java的数据类型包括基本类型引用类型,对于基本类型,其又分为四类(整型,浮点型,字符型,布尔型)八种(整型有四种,浮点型有两种,字符型一种,布尔型一种)。

2.1基本类型

2.1.1基本类型

数据类型

所占内存(单位:字节)

范围

整型

byte

1

-128~127

short

2

-32768~32767

int

4

-2147483648~2147483647

long

8

(-2^63)~(2^63-1)

浮点型

float

4

--

double

8

--

字符型

char

2

--

布尔型

boolean

--

true 或 false

注:

  1. 不同于C语言的是,Java中变量所占的内存是固定的,不会因操作平台和编译器的改变而改变;但是对于boolen类型,不同的JVM实现略有不同,有些JVM实现的是占1个字节,有些是占一个比特位,这个没有明确的规定。
  2. Java中的浮点型同样的遵循国际标准IEEE 754,在《C语言数据类型》一文中已经详细说明,此处不再赘述。
  3. 不同于C语言的是,Java中char类型不仅可以表示字符(ASCII码表中的字符),也可以表示汉字,同样的Java中字符也用‘’
  4. boolean类型只有两个值,true或者false,这与一般的情况也是一样的,因为在编程范围内,要么对,要么错,不会存在两种叠加的状态。
  5. 不同于C语言的是,Java中并没有”无符号数“这一概念。

2.1.2包装类

对于基本类型的取值范围,无需刻意记忆,它们的值都已经以常量的形式定义在对应的包装类中了。使用时只需调用相关的命令即可,例如:
  byte的包装类为java.lang.Byte,其用法为

System.out.println(Byte.MIN_VALUE);

即可在屏幕输出byte类型对应的最小值。

基本类型

包装类

最小值

最大值

byte

java.lang.Byte

Byte.MIN_VALUE

Byte.MAX_VALUE

short

java.lang.Short

Short.MIN_VALUE

Short.MAX_VALUE

int

java.lang.Integer

Integer.MIN_VALUE

Integer.MAX_VALUE

long

java.lang.Long

Long.MIN_VALUE

Long.MAX_VALUE

float

java.lang.Float

Float.MIN_VALUE

Float.MAX_VALUE

double

java.lang.Double

Double.MIN_VALUE

Double.MAX_VALUE

char

java.lang.Character

Character.MIN_VALU

Character.MAX_VALUE

2.2字符串类型

在Java中,字符串类型属于引用类型,因为字符串也是较为常用的类型,所以在这里也做一个简单的介绍。

2.2.1字符串定义

字符串定义的基本格式为:

String 变量名 = ”字符串内容“;

例如:

String name = "张三";

同样的,C语言中的转义字符依旧适用于Java。

2.2.2字符串的+运算

字符串+操作,表示对字符串的拼接,例如:

String a = "abc";
String b = "de";
String c = a + b;
System.out.print(c);

//程序的运行结果为
abcde
int a = 1;
int b = 2;
System.out.print("a + b =" + a + b);

//程序的运行结果为
a + b =12

可以看出,当一个含有+的表达式中有字符串的时候,会把其他变量的值也认为是字符串然后进行拼接。有些情况下,为了避免上述情况发生(我们期望输出的实际应该是3),应该加入括号来改变优先级:

int a = 1;
int b = 2;
System.out.print("a + b =" + (a + b));

//程序的运行结果为
a + b =3

2.3常量

在Java中,用final来修饰常量(与C语言中const类似),即

final int a = 10;

2.4类型转换

Java属于强类型语言,当不同类型的变量相互赋值(实际中,这种情况是无法避免的)时,会有严格的校验。
一般有如下规则:

  1. 不同数字类型的变量之间赋值,表示范围更小的类型能够隐式转换为表示范围大的类型,反之则不行(例如:可以把byte(1字节)类型的数据赋给int(4字节),但不能把int赋值给byte)。同样的,由于byte所表示的范围是-128~127,我们也不能把小于-128或大于127的数值赋值给byte类型的数据。
  2. 若要把表示范围更大的数字类型变量赋值给范围小的,则需要强制类型转换。但强制类型转换可能会使精度丢失。即:
int a = 10;
double b = 8.5;
a = (int)b;
  1. 互不相干的两种类型则不能相互赋值,也无法使用强制类型转换赋值。即整型与布尔型、浮点型与布尔型、字符型与布尔型不能相互赋值。但是整型与字符型可以通过强制类型转换赋值。

前两条可以理解为两个大小不一样的容器,大容器可以容纳下小容器的全部内容,而小容器不一定能装下大容器的内容(装不下的部分就被丢掉,即所谓的精度丢失)。

2.5数值提升

在对数据进行混合运算时,如果数据的类型表示的范围不一样(即所占字节数的大小不一样),则需要进行数值提升。

  1. 例如int 和long类型的数据进行计算,计算器会先将int类型的数据提升为long,然后再进行计算。例如:
int a = 10;
long b = 20L;
a+b;

对于a+b的结果,由于发生了数值提升,所以其结果也为long类型,需要用一个long类型的变量来接收,如果使用int类型的来接收,则需要进行强制类型转换,即

int c = (int)(a + b);
//或
long d =a + b;
  1. 计算机CPU通常按照4个字节为一组从计算机内存读取数据,所以为了硬件上实现方便,对于小于4个字节的数据类型(即short,byte类型),会先提升为int类型,然后再进行计算。

2.6int 和String之间的相互转换

2.6.1int转String

int num = 10;
//方法1
String str1 = num + "";
//方法2
String str2 = String.valueof(num);

2.6.2String转int

如果一个字符串中的格式为整数,则可以转换为int,如果字符串中还含有其他的字符,则转换失败。转换方式如下:

String str1 = "1010";
int num =Integer.parseInt(str1);

其他数值类型转换同理。

3运算符

3.1赋值运算符=

在任何一门语言中,最基本的就是赋值运算符=,赋值运算符即为=,其含义为把等号右边表示的值赋给左边的变量。

3.2算术运算符

算数运算符包括基本四则运算符和增量运算符。

3.2.1基本四则运算符

基本四则运算符即为:加减乘除以及求余(又称”求模“,其符号为%)。其中求余运算不仅能对整数求余,也能对浮点数进行求余。
例如:

11.5 % 2.0;
//其结果为
1.5

3.2.2增量赋值运算符

增量赋值运算符包括:+=、-=、/=、*=、%=。例如:

a += 2;
//等价于
a = a + 2;//其他运算符同理。

3.2.3自增/自减运算符++、--

其用法与C语言中一致。

3.3关系运算符

和数学中的关系含义一致,包括:等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。关系运算符的返回值为boolean类型。

3.4逻辑运算符

逻辑运算符为:逻辑与(&&)、逻辑或(||)、逻辑非(!)。
  逻辑运算符的操作数和返回值都是boolean类型的。

3.4.1逻辑与&&

运算规则为:同真则真,一假全假。

3.4.2逻辑或||

运算规则为:一真则真,全假才假。

3.4.3逻辑非!

规则:如果操作数是true,则结果为false,同理,若操作数是false,则结果为true。
  由于逻辑运算符在中学数学、大学相关课程都有相关介绍,此处不再赘述。

3.4.4短路求值

对于逻辑与和逻辑或遵循短路求值的规则。
  所谓的短路求值,就是对于逻辑与,一假全假,如果程序执行过程中发现某个逻辑与符号的左侧条件是假的,则这个符号后边的其他操作数不会再执行。例如:

System.out.print(1>2 && 1/0);

因为1是小于2的,所以1>2结果为false,&&右侧的1/0则不会执行。
  同理,对于逻辑或,一真则真,所以程序执行过程中发现某个逻辑或符号的左侧条件是真,则这个符号后边的其他操作数则不会再执行。

System.out.print(1< 2 || 1/0);

因为1是小于2的,所以1>2结果为true,||右侧的1/0则不会执行。

3.4.5&和|

&|两侧的操作数为boolean类型时,也表示逻辑运算,但这两个符号不支持短路求值。

3.5位运算符

同C语言一样,Java中对数据操作的最小单位是二进制位,位运算符主要有:&、|、~、^。位运算就是按照二进制位来运算。

3.5.1按位与&

同逻辑与一样,只有二进制位全为1结果才为1,否则为0.例如:

1100 & 0101
//结果为
0100

3.5.2按位或|

同逻辑或一样,只要有一个为1,则结果为1,全为0结果才为0.例如:

1100 | 0110
//结果为
1110

3.5.3按位取反~

把对应位置的0变为1,把1变为0.例如:

~(11010)
//结果为
00101

3.5.4按位异或^

如果两个数字二进制位数字相同,则结果为0,否则为1。例如:

(101101) ^ (100010)
//结果为
001111

3.6移位运算

移位运算符有三个:<<、>>、>>>,同位运算符一样,移位运算也是针对二进制位来讲的。

3.6.1左移<<

即最左侧的二进制位丢掉,在右侧补0.

3.6.2右移>>

最右侧的二进制位丢掉,在左侧补符号位(正数为0,负数为1)。

3.6.3无符号右移>>>

最右侧的位丢掉,在左侧统一补0.

3.7条件运算符

条件运算符格式如下:

表达式1 ? 表达式2 : 表达式3

表达式1为true时,整个表达式的结果为表达式2,否则为表达式3.

3.8运算符优先级

一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。

4注释

Java中注释分为3种

  • 单行注释://注释内容
  • 多行注释:/*注释内容*/
  • 文档注释:/**文档注释*/