2.1 Java核心知识

本节主要讲解Java中的基本数据类型、局部变量和成员变量、运算符和表达式以及流程控制语句等基础知识。读者只有牢牢掌握这些基础知识才能在面试及笔试中应对自如。

2.1.1 数据类型

Java中有两大数据类型,分别为基本数据类型和引用数据类型。

基本数据类型如表2-1所示。

表2-1 基本数据类型

引用数据类型包括类、接口、数组等,这些在之后的章节中将会介绍到。

在Java中的数据类型的转换有两种方法:

(1)自动类型转换:编译器自动完成类型转换,不需要在程序中编写代码。

(2)强制类型转换:强制编译器进行类型转换,必须在程序中编写代码。

由于在基本数据类型中boolean类型不是数字型,所以基本数据类型的转换是除了boolean类型以外的其他7种类型之间的转换。

自动转换类型的情况如下:

(1)整数类型之间可以相互转换,如byte类型的数据可以赋值给short、int、long类型的变量;short、char类型的数据可以赋值给int、long类型的变量;int类型的数据可以赋值给long类型的变量。

(2)整数类型转换为float类型,如byte、char、short、int类型的数据可以赋值给float类型的变量。

(3)其他类型转换为double类型,如byte、char、short、int、long、float类型的数据可以赋值给double类型的变量。

1)自动类型转换规则:从存储范围小的类型到存储范围大的类型,即byte→short(char)→int→long→float→double。

注意在整数之间进行类型转换时,数值不发生改变,而将整数类型(尤其是比较大的整数类型)转换成小数类型时,由于存储方式的不同,可能存在数据精度的损失。

2)强制类型转换规则:从存储范围大的类型到存储范围小的类型,即double→float→long→int→short(char)→byte。

语法格式:

    (type)value

其中,type是要强制类型转换后的数据类型。如:

    int a = 123
    byte b = (byte)a

2.1.2 常量和变量

1.常量

常量即在程序运行过程中一直不会改变的量,常量在整个程序中只能被赋值一次,并且一旦被定义,它的值就不能再被改变。声明常量的语法格式如下:

    final 数据类型 变量名[=值]

常量的名称通常使用大写字母。常量标识符可由任意顺序的大小写字母、数字、下画线(_)和美元符号($)等组成,标识符不能以数字开头,也不能是Java中的保留字和关键字。

当常量用于一个类的成员变量时,必须给常量赋值,否则会出现编译错误。

Java还允许使用一种特殊形式的字符常量值来表示一些难以用一般字符表示的字符,这种特殊形式的字符是以“\”开头的字符序列,称为转义字符。

Java中常用的转义字符及含义如表2-2所示。

表2-2 转义字符及含义

2.变量

变量代表程序的状态,程序通过改变变量的值来改变整个程序的状态。

在程序中声明变量的语法格式如下:

    数据类型 变量名称;

注意数据类型和变量名称之间需要使用空格隔开,空格的个数不限,但是至少需要一个;语句使用“;”作为结束。

1)变量的命名规则

(1)变量名必须是一个有效的标识符。

(2)变量名不可以使用Java中的关键字。

(3)变量名不能重复。

(4)选择有意义的单词作为变量名。

2)变量的分类

根据作用域的不同,一般将变量分为成员变量和局部变量。

(1)成员变量

成员变量又分为全局变量和静态变量。

全局变量不需要使用static关键字修饰,而静态变量则需要使用static关键字进行修饰。

全局变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,因此不需要实例化。

(2)局部变量

局部变量是指在方法或者方法代码块中定义的变量,其作用域是其所在的代码块。可分为以下三种:

①方法参数变量(形参):在整个方法内有效。

②方法局部变量(方法内定义):从定义这个变量开始到方法结束这一段时间内有效。

③代码块局部变量(代码块内定义):从定义这个变量开始到代码块结束这一段时间内有效,常用于try…catch代码块中。

2.1.3 运算符和表达式

程序是由许多语句组成的,而语句的基本单位就是表达式与运算符。表达式是由操作数与运算符组成:操作数可以是常量、变量,也可以是方法,而运算符就是数学中的运算符号,如“+”“-”“*”“/”“%”等。

1.算术运算符

常用的算术运算符及含义如表2-3所示。

表2-3 算术运算符及含义

2.关系运算符

关系运算符也称比较运算符,是指对两个操作数进行关系运算的运算符,主要用于确定两个操作数之间的关系。常用的关系运算符及含义如表2-4所示。

表2-4 关系运算符及含义

3.逻辑运算符

逻辑运算符用来把各个运算的变量连接起来,组成一个逻辑表达式,判断编程中某个表达式是否成立,判断的结果是true或false。常用的逻辑运算符及含义如表2-5所示。

表2-5 逻辑运算符及含义

4.赋值运算符

赋值运算符就是为各种不同类型的变量赋值,简单的赋值运算符由等号(=)来实现,即是把等号右边的值赋给等号左边的变量。常用的赋值运算符及含义如表2-6所示。

表2-6 赋值运算符及含义

5.位运算符

位运算符主要用来对操作数为二进制的位进行运算,按位运算表示按每个二进制位来进行运算,其操作数的类型是整数类型以及字符型,运算的结果是整数类型。常用的位运算符及含义如表2-7所示。

表2-7 位运算符及含义

2.1.4 流程控制语句

1.顺序语句

顺序语句的执行顺序是自上而下,依次执行。

2.条件语句

1)if语句

    if(条件表达式){
        条件表达式成立时执行该语句;
    }

如果条件表达式的值为true,则执行if语句中的代码块,否则执行if语句块后面的代码。

2)if…else语句

    if(条件表达式){
        条件表达式成立时执行该语句;
    }else{
        条件表达式不成立时执行该语句;
    }

3)if嵌套语句

3.选择语句

switch语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

(1)switch语句中的变量类型可以是:byte、short、int或者char。

(2)switch语句可以有多个case语句。每个case后面跟一个要比较的值和冒号。

(3)case语句中值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。

(4)当变量的值与case语句的值相等时,case语句之后的语句开始执行,直到break语句出现才会跳出switch语句。

(5)当出现break语句时,switch语句终止。程序跳转到switch语句后面的语句执行。case语句不包含break语句。如果没有break语句出现,程序会继续执行下一条case语句,直到出现break语句为止。

(6)switch语句可以包含一个default分支,该分支必须是switch语句的最后一个分支。default分支在没有case语句的值和变量值相等的时候执行。default分支不需要break语句。

4.循环语句

1)while语句

while语句的执行过程是先计算表达式的值,若表达式的值为真(非零),则执行循环体中的语句,继续循环;否则退出该循环,执行while语句后面的语句。循环体可以是一条语句或空语句,也可以是复合语句。

    while(循环条件){
        循环体;
        }

2)do…while语句

    do{
        循环体;
        }while(循环条件)

注意while语句属于先判断后执行,而do…while语句先执行一次,而后再进行判断。do…while语句和while语句能实现同样的功能。然而在程序运行过程中,这两种语句还是有差别的。如果循环条件在循环语句开始时就不成立,那么while语句的循环体一次都不会执行,而do…while语句的循环体还是会执行一次。

3)for语句

    for (初值;判断条件;赋值增减量)
    {
        语句1 ;
        …
        语句n ;
    }

for关键字后面()中包括了三部分内容:初始化表达式、循环条件和操作表达式,它们之间用;分隔,{}中的执行语句为循环体。

(1)最先执行初始化步骤。可以声明一种类型、初始化一个或多个循环控制变量,也可以是空语句。

(2)判断条件。如果为true,则循环体被执行。如果为false,则循环终止,开始执行循环体后面的语句。

(3)执行一次循环后,更新循环控制变量。

(4)再次检测判断条件。循环执行上面的步骤。