从零开始的JAVA之路.第二章

来源:互联网 发布:淘宝怎么优化宝贝排名靠前 编辑:程序博客网 时间:2024/06/05 22:57

数据类型

JAVA的数据类型分为两大类:基本数据类型和引用数据类型。

基本数据类型

  • 整数型

    • int 整型
    • short 短整型
    • long 长整型
  • 字符型

    • char 单个字符
  • 浮点型
    • float 单精度浮点型
    • double 双精度浮点型
  • 布尔类型
    • boolean 布尔(PS:JAVA中的boolean变量只有两个值:true和false,而且不等于0和1)

默认初始值:JAVA所有的变量必须是先定义后使用。为了防止程序的设计者在创建变量的时候忘了初始化,系统会根据变量的类型给变量赋上初值,比如int类型的默认初值就是0,double类型的就是0.0,boolean类型的就是false等等。

自动类型转换:在一个表达式中,如果存在多个不同类型的变量,则程序会按照运算的顺序对程序进行自动类型转换,自动转换类型的方向是由低精度向高精度方向转换,所以可以得知如果一个表达式中int short long float double类型都聚齐了,那么这个表达式得到的结果就是double类型的。

强制类型转换:在实际的操作中我们有时需要把某一个数据类型的变量转换成另一种数据类型,这往往就需要我们进行强制类型转换,但是强制类型转换往往会带来一个弊端,就是精度的损失。

double x = 5.5;int y = (int)x;//这里的y等于5

因为double类型的变量在内存中占了64位,而int类型的变量在内存中只占32位。所以系统在强制类型转换时,会把double类型变量的其中一部分切断,这种行为带来的后果就是我们失去了小数点后的所有数,这就是精度的损失。

运算符:

运算符算数运算符赋值运算符比较运算符逻辑运算符位运算符三目运算符+、-、*、/、%、++、–==<、<=、>、>=&& 、|| 、!&、|、^、~、<<、>>、>>>(表达式)?执行语句1:执行语句2



算数运算符:这部分运算符与我们日常的数学没有太大的区别,值得注意的是,算数运算符在运算时会进行自动类型转换,如果是两个相同类型的变量进行运算,那么得到的值会保存原类型,例如:两个int类型的变量进行相除,得到的值还是int类型的。

int x = 10;int y = 4;int z = x / y;//z的值为2而不是2.5

有意思的一点是:如果两个整数类型的变量进行相除,如果除数等于0,那么程序就会抛出异常,而如果是两个浮点类型的变量进行相除,那么就会根据算式得到正无穷或负无穷。因为%(取余)是会先进行除法运算,所以如果是两个整型变量进行相除,除数为0,则会得到与上面相同的结果,如果是两个浮点型,则会得到一个NaN(顺便一提:NaN 不等 NaN)。还有自增++和自减–在变量的前后是有一些区别的,在变量前(++i)表示先将i增加1,再使用增加后的i,(i++)是先使用为自增的i,而后自增。

位运算符:因为这个类型的运算符我暂时还没有使用过,所以暂且忽略,等掌握后再来补充。

赋值运算符:赋值运算符只有一个:==,我们可以把它看做是汉语里的变成,如果int x = 1;翻译成汉语就是,创建一个整型变量x并把它变成1。

三目运算符:三目运算符可以看成是一个简易的if else分支。根据表达式返回的布尔值进行分支运算,如果返回true则进行表达式1,反之,则进行表达式2。

运算符的优先级别:虽然在JAVA中各自的运算符都有自己的优先级别,但是实际意义不大,因为一大堆不同运算级别的运算符凑在一块,就算是经验老道的程序猿看了也觉得头晕,所以我们只需要记住最高级别运算符之一的()。在我们的算数表达式中,尽量使用()来让系统和自己明白这条表达式的执行顺序。

控制流程和数组

JAVA中的程序流程分为三大类:顺序结构、分支结构、循环结构。

顺序结构:这一类可以说是我们最常见的结构了。你在程序里怎么写,程序就按照你写的顺序进行执行。

分支结构:这一类结构主要通过if else条件语句和三目运算符等实现,通过一定的判断条件,对不同的情况运行不同的代码块。常见的结构如下:

if(表达式){    执行语句}else if(表达式2){    执行语句}else{    执行语句}//嵌套的if语句if(表达式1){    if(表达式2){        需要满足表达式1和表达式2这段语句才会被执行,相当于if(表达式1 && 表达式2)    }}

if和else后面的花括号并不是必须的,但是建议还是带上,因为这样可以提高程序的可读性,也可以避免一些不必要的错误。

if(表达式)执行语句1;执行语句2

这种情况下,无论表达式返回的值是什么,执行语句2总会被执行,这并不是我们想要的结果。

switch分支语句:根据switch中的表达式,在case中寻找表达式一样的语句执行

switch(表达式){    case 表达式2:    {        语句1break;    }    case 表达式2:    {        语句2break;    }}

switch的表达式支持整数类型、枚举类型、和字符创String类型,注意,每一个case语句后的break非常重要。它以为着,如果某个case符合表达式,那么执行完当前case的代码块后程序会退出这个switch。

循环结构:主要通过while 、 do…while、for、foreach实现
while和do..while的不同在于while是先判断后执行,do..while是先执行一次再进行判断是否需要循环,for与while类似,大部分的while可以改写成for,而foreach是专门为数组创立的增强型for循环。

while(表达式){    如果表达式的值为true,则执行代码;}//注意,此处不能加分号do{    先执行一次代码,再进行判断;}while(表达式);//注意,此处的分号十分重要for(初始化语句;判断语句;迭代语句){    先进行初始化语句,如int i = 0;    然后进行判断语句,如i < 5;    根据结构决定是否执行代码块中的语句    最后执行迭代语句,如:i++;}int[] k = new int[10];for(int i : k){    表示将k中的每一个成员赋值给i,然后执行相关的操作}//循环的嵌套与分支的嵌套类似,而且使用较少,所以这里就不提及了

注意:可以使用break和continue来终止循环,他们的不同点在于break终止循环并跳出该循环,而continue则是终止此次循环,开始下一次循环。

数组

定义数组的方式:type[] arrayName;
初始化数组: arrayName = new type[index];或arrayName = new {成员1,成员2}

如果一个已经初始化的数组里的成员都没有被赋值,他们就会有默认的初值,初值与之前定义基本数据类型差不多一样。值得注意的是,数组一旦被初始化,那么它的长度就是固定的,也就是它在内存中的大小就是固定的了,无论是否拥有成员。

注意:没有多维数组。
我们常说的多维数组比如二维数组,其实是通过在每一个数组成员中赋在另一组内存空间的地址,这样就形成了我们印象中的多维数组,但是其本质依然是一维数组。