java基础4-变量与运算

版权声明:此文章转载自_infocool

原文链接:http://www.infocool.net/kb/Java/201610/205539.html

如需转载请联系听云College团队成员小尹 邮箱:yinhy#tingyun.com

1)局部变量:在方法体内部的变量。成员变量:在方法体外,类体内的变量。

之前我们知道,变量就是存放数据的一块内存区域。所有的变量只在自己的作用域中有效,作用域就是离变量最近的包围着变量的两个大括号的范围,每两个大括号就是一个作用域,不能跨越,除非该变量是静态变量(static变量),才能为所用作用域共用。

2)数据类型:

字符型(char):因为java是用16进制的编码,所以char c = ‘数据’;这里的数据是16进制的。’a’ ‘b’ ‘c’等的都是字符型。【char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。】→这段话摘录《李孝祥面试宝典》。

逻辑型(布尔型boolean):一般用于程序流程的控制,只允许取true和false两个值。

整数类型:分为byte(占1字节)、short(占2字节)、int(占4字节)、long(占8字节)这四种类型。注意的是每种类型都有它的表数范围,如byte类型的表数范围是-128到127(表数范围是这样算的,byte占1个字节,8位,也就是2的8次方等于256,所以-128到127就刚好是256个数),如果有byte b = 500;就是错误的。声明long类型是要在数据后面加l或L表明是long类型,如long l = 88888L;

浮点类型:就是小数点型,可以是3.14,也可以是科学计数法3.14e2,也就是3.14x102。浮点类型分为float(占4字节)和double(占8字节)这两种类型。看到一个小数,系统默认是double型,如果要表示float型,要在数据后面加f,如double d = 123.4(正确),float f = 123.4f(必须要加f)。

3)字符串合并用“+”,数据类型相加也用“+”。

4)各种数据类型的混合运算规则。

Boolean不能转换为其他数据类型所以不能进行混合运算。

各种数据类型按容量大小的排列:double>float>long>int>byte/shot/char,混合运算时,小的自动转换为大的进行运算,如int与byte数据进行运算,byte先转为int再运算,如此类推。特殊情况,如byte,shot,char同容量数据类型之间的混合运算,先转化为int再运算。这里的容量不是指这些数据类型所占的空间的大小,而是这些数据类型的表数范围,如double和long都占8个字节,但double的表数范围远远大于long,即double能装的数值大小远大于long。

容量大的转容量小的要加强制转换符,但可能造成精度的下降或溢出。如果高容量数据类型转低容量数据类型时,没有超过低容量数据类型的表数范围,则转换是完全没有问题的,如long lo = 100L; int in = (int)lo;就如同你一升的瓶子可以装300毫升的水,你将水倒入500毫升的瓶子中还是300毫升的水。但是如果超出了小容量数据类型的表数范围就会有问题,如long lo = 10000000000L; int in = (int)lo;,int类型明显装不下10000000000这么大的数,所以实际得到的int in的值不是10000000000,而是占4个字节的long lo截掉两个字节得到的int类型的数1410065408,所以就会造成结果的不精确,成为数据溢出现象,如同将1000毫升的水倒到500毫升的瓶子中造成水的溢出。如果是浮点类型的数据的上级强制转换为下级,不管是否超出了下级的表数范围都是不能转的,如double do = 123456.7; float fl = (float)do;,得到的结果是infinity,无穷大的意思,因为如果8个字节的double转到4个字节的float,必须要截掉4个字节,那么如果截掉小数点部分,就不再是浮点类型了,所以不行。但是double do = 123456.7; int in = (int)do;这种情况可以,虽然8个字节的double数也会截掉4个字节,得到的数不再是浮点类型,但它赋值给的是int所以不需要浮点类型。总之,小转大没有问题,而大转小不超出表数范围也没问题,如果超出了表数范围则会出现各种问题。

5)java看到3.14就认为是double类型,所以必须加f才知道是float;同理,一看到123就认为是int,一定要加l才知道是long。

6)看不同数据类型的数据之间的混合运算是否正确,首先看 它们算出来的结果是什么类型(注意容量小的要转到容量大的再运算),如果和用于承接结果的数据类型不同却没有加强制转换符则是错误的。然后就是注意表数范围,如两个int数值相加也可能得到一个long类型的值,因为int的表数范围是-2147483648到2147483647(它占4个字节,32位,是2的32次方),所以2147483647和250这两个int的数相加就超出了int的表数范围,是一个long类型的数,如果你还用一个int类型的变量来承接结果而不加强制转换符就是错误的。不同的数据类型之间必须要加强制转换符的,不管小转大还是大转小。

7)程序的编码格式(重要)。

*大括号要对齐:左大括号所在的一行内容的左端要与右大括号对齐。

如 XXX XXX XXX XXX{

                   XXX XXX;

   }

*注意缩进:代码之间应该有层次,按Tab/Shift+Tab;

如 XXX XXX XXX XXX{

         (缩进)XXXXX;  

}

*方法和方法之间,语句块和语句块之间,语句和语句之前都要用空行隔开。

*并排语句间加空格。如XXX XXX XXX;(空格)XXX XXX XXX;

*“{”前面要留个格。

*运算符前后要加个格,如 int i = 10;

*编程时括号成对的写,因为程序中括号都是成对出现的,成对的编写不容易遗漏。

8)运算符:

*++/--是自加/自减运算符。该符号在数据之前,先+/- 1再赋值,在后面则相反。比如int count = 1; int count2 = count++;

你打印出count2得到的还是1,而打印count得到的是2,因为++在后面是先赋值再+1,即先把count的值赋给count2,那么count2自然是1,然后count的值才递增,所以count的值当然是2。又如int count = 1; intcount2 = ++count;打印出来的count2是2,打印出count也是2,因为count的值先递增再赋值给count2,所以必然两个都是2。

不管自加/自减符放在被运算值的前还是后,最后得到的结果都是一样的,比如

int count = 1;

count++;或 ++count;

System.out.println(count);//最后结果一样。

打印出来的结果都是一样的,都是2,也就是最终都为count进行了递增的操作。但是你在打印最后的count之前,分别打印count++ / ++count的返回值,即:

int count = 1;

System.out.println(count++);或System.out.println(++count);//两次打印不同。

System.out.println(count); //最后结果一样。

的结果就不一样了,分别是1和2,因为使用自加/自减运算符相当于调用自加/自减方法,虽然前++或后++运算最后的结果是一样的,但是如果你想把count++ / ++count直接打印出来,也就是打印出方法的返回值,则是不相同的,因为前++或后++实现的逻辑不同,返回值不同,前++是先进行运算,返回的是运算后的被运算值,而后++是先进行赋值,返回运算前的被运算值,所以直接打印返回值的话得到不同的结果,同理,如果你直接把它的返回值赋值给另一个变量,然后打印出来也是不同的(比如一开始的例子)。但是通常情况下,我们很少会去获取自加/自减表达式的返回值,一般访问的都是最后的被运算值的结果,所以前++和后++的差别很少被考虑进来。比如说:

for(int i = 0; i < 10; ++i){
   System.out.println(i);
}

for(int i = 0; i < 10; i++){
   System.out.println(i);
}

运算结果没有区别。

*逻辑运算符:!(逻辑非,即相反);^(逻辑异或,即对^错就是对);  &(逻辑与,即且); |(逻辑或,即“或”);&&(短路与,和逻辑与结果一样,运算方法不同); ||(短路或,和逻辑或结果一样,运算方法不同)。

*赋值运算与扩展赋值运算。”+=”  “-=”  “*=”  “/=”“%=” 都叫扩展赋值运算符。举例用法:a += b; 等效于 a = a+b;

*字符串连接符“+”,用于数值运算时用作“加”,而在字符串之间的连接是用作“与”。当数据类型和字符串类型混合运算时,系统会默认将数据类型变成字符串类型然后进行“与”的运算,也就是说当运算中有一方是字符串类型,都会以“与”来进行运算,最后得到的是一个字符串,打印的时候,不管是什么数据类型,都是转换为字符串类型打印出来。

*三目运算符:语法格式“判断条件?是则返回此表达式结果:否则返回此表达式结果” 例如:

int score = 59;

System.out.println(score >60  ?  "及格" : "不及格");

最后打印出来的是“不及格”。相当于用if语句的下面写法

if(score>60){

  System.out.println(“及格”);

} else {System.out.println(“不及格”);

****注意,不能写成:

score>60 ? System.out.println(“及格”) :System.out.println(“不及格”);

因为后面两个不能是执行语句,只能是表达式,对于表达式的概念见9)。

9)表达式:凡能最终得出结果的式子叫表达式,表达式的类型与结果的数据类型无关。

10)遇到复杂的运算式时由里到外的算。


想阅读更多技术文章,请访问听云技术博客,访问听云官方网站感受更多应用性能优化魔力。

关于作者

coco秋洁

我爱学习,学习使我快乐

我要评论

评论请先登录,或注册