`

JAVA基本功<5>

 
阅读更多

一.常量与变量
1.概念:变量就是内存中的一个存储区域,它有自己的名称和类型。在这个区域中的数据,可以在同一类型范围内不断变化。其实变量就是用来存储某些常量的内存空间。

那么为什么要定义变量呢??
原因就是,它所存储的数据可以在同一类型范围内不断变化,进而可以重复利用。

定义变量的格式:
数据类型  变量名 = 初始化值
注:格式是固定的,记住格式,以不变应万变。
理解:变量就如同数学中的未知数。

2.数据类型
4类八种  1.byte的取值范围是-128到127,即-2的7次方,到2的7次方减1。
             2.老师用了一个很容易记得例子来描述基本数据类型所占的字节:
               一个字节就相当于一两饭,byte 能装一两饭(指占一个字节),short,char能装2两饭,int,float能装4两饭, long,double能装8两饭。
注意:1.一个中文也是2个字节,所以用char来存储中文,也是可以的。Char的取值范围是0到65535。
      2. 一个float类型,必须对其存储的小数数据结尾处添加f标识。表示只取该小数的单精度。
3.类型转换
分为两种:一种是自动类型转换(隐式类型转换),另一种是强制类型转换(即显式类型转换)。
  自动转换:所有short,byte,char,自动转换为int型。(整型默认的是int型)
            小数默认的是double型。
            1如果一个操作数是long型,计算结果就是long型;
                         2 如果一个操作数是float型,计算结果就是float型;
3 如果一个操作数是double型,计算结果就是double型。
注意:    不同数据类型之间是不可以直接进行运算的,
需要转换成同一个类型才可以进行运算。
数值类型因为都代表具体整数和小数,是可以转换的。
通常以占内存空间较大的类型为主,进行转换。

  强制转换:                                                     x=2;
       在需要被转换的数据前面,加上你想要的转换成的类型即可,如:byte b = (byte)(x + 4)    

面试题:
class VarTest
{
public static void main(String[] args)
{

//byte b = 3;

//b = b + 1;//错了。因为1默认就是int类型,所以b+1时,b会自动类型提升为int类型。
//相加的结果还是int类型,所以赋给b装不下。

//b = (byte)(b+1);//一般做这样强制转换的不多。

// byte b3 = 2 + 7;//2和7都是常量,而且加完的结果也是一个常量,9在byte范围内,所以自动转换成byte类型。
byte b1 = 2;//其实2是int类型,在编译时,编译器会判断具体的常量值是否在byte类型范围内。
//如果在,会将其转成byte类型存储到byte的空间中。这个转换动作是自动的。

byte b2 = 7;

//byte b4 = b1 + b2;//错误,因为b1 b2的值是不确定的。所以默认都是用int存储的。
//因为加完的结果有可能超出byte范围,丢失精度。
char ch = 'a';
System.out.println((char)(ch+4));//98//ch和1运算,ch进行提升为int类型,因为字符都有对应的编码表中的数字
//所以ch提升为int后,就是97.因为字符a对应的数字就是97.
//String s = "abc";//定义一个字符串数据。
System.out.println("4+5="+4+5);//任何数据和字符串相加都是相连接。连接后,会变成一个新的字符串。

//"4+5="+4="4+5=4"+5 = "4+5=45"
/*
结论:
当右边的数据是常量值时,编译器会判断是否在左边的类型范围之内,如果在,会自动转换成左边的类型。

当右边的数据是变量时,编译器会使用默认的类型进行存储。如果左边的类型占用空间小于默认类型,
如果不做强制转换,会容易丢失精度。编译会失败。

*/
}

二. 运算符
1. 算术运算符
包括:+  -  *  /  %  ++   - -。
需要注意的问题:1.去模时,左边小于右边,结果是左边。 如:2%3  结果就是 2
左边等于右边,结果是零。   如:2%2 结果为0
             2.运算中,只参考被模数(指左边的数)的正负号。如:-2%3= -2 ; 2%-3 = 2
                3.++  -- 的一些问题 :
int a = 3,b;
//b = a++;//自增就是在变量原有数据的基础上+1,然后将+1后的结果赋值给该变量。
b = ++a;

/*
如果是 b= a++;a在前面,a先参与其他运算,比如将a的值赋值给b。然后a在自增,将a+1的结果赋值给a。
如果是 b= ++a;++在前面,先运算,将a+1的结果赋值给a。然后,a在参与其他运算,比如:将a的结果赋值给b。
如果a++;不参与其他运算,而是单独一条语句,++在前在后都一样。
*/


2. 赋值运算符
包括:= , +=, -=, *=, /=, %=
注意:  =:将右边赋值给左边。
        +=:将左右两边的和赋值给左边。
面试题:
short s = 5;
s = s + 2;
s+=2;
问:代码是否有问题?  这两句代码有什么区别?
答:区别一:第一句代码不能通过编译,第二句代码可以通过编译(因为赋值运算符,会做自动转换动作。)。
     区别二:第一句的代码是两步运算,第二句的代码是一步运算。它相当于s=2,只不过呢,它是把左右两边的和赋值给的s。

3.比较运算符
   包括:>   <    >=   <=   ==   !=
比较运算符运算的结果只有两种值:要么是true。要么是false。

4. 逻辑运算符
逻辑,可以理解为关系。
它包括:与:&    或:|     非:!    异或:^     短路与 &&      短路或 ||
     它们的作用是:用于连接两个boolean类型的表达式。

& 和 &&  的区别:
&:无论左边的结果是true还是false,右边都会被运算。
&&:当左边为false时,右边是不参与运算的。
简单说:
&:两边都执行。
&&,只有左边是false右边不执行,剩下的剩下情况都执行。

| 和 || 的区别:

|:无论左边的结果是true还是false,右边都会被运算。
||:当左边为true时,右边是不参与运算的。
简单说:
|:两边都执行。
||,只有左边是true右边不执行,剩下的剩下情况都执行。
5. 位运算符
   它是专门用于操作二进制位的运算符。
    左移:<< :左移就是乘以2的次幂。左移几位,就乘以2的几次幂。
右移:>> :右移就是除以2的次幂,右移几位,就除以2的几次幂。
注意:右移后,高位出现的空位,按照原来高位的值进行补位,如果原来最高位值是0,就用0补空位。    
  如果最高位是1,就用1补空位。

无符号右移:>>> : 右移后出现的空位,都用0补,不参考原来最高位的值。
~ 这个运算符,叫作反码。如:~6 = -7
注意:计算的时候,先转换为二进制,再进行运算。
      如:6&3 即  110
                & 011
                  010 它转化为十进制就是2

面试题:
问题是: 对两个整数变量的值进行互换(不需要第三方变量)
答案:  int x = 3,y = 5;//要求置换后:x = 5,y = 3;
  //这是利用了异或的特性。面试要答这个答案。 而开发时,要使用第三方变量的形式。
  //因为异或这种形式,阅读性很差,而第三方变量容易阅读和理解。
  x = x ^ y;//x = 3 ^ 5;
  y = x ^ y;//y = (3 ^ 5) ^ 5 = 3;
  x = x ^ y;//x = (3 ^ 5) ^ 3 = 5;

6. 三元运算符
格式是:(条件表达式)?表达式1:表达式二

三. 程序流程控制
1. 判断结构
包括:1.if(){ }  2.if() { }  else     3. if(){}  else if{} …….  Else
注意:三元运算符是if else的简写格式。
好处:简化书写。看起来更加简单明了。
弊端:只能是在if else执行完有具体数据结果时,才可以进行简写。
如:if(x > 2){ System.out.println(“ ok”);}
     else
          System.out.println(“no”);   这种就没有具体的数字结果,所以无法简写。
  但是呢 int x=1 , y=3, z ;
       If(y>x){ z = y;}  else { z = x;}      这种的就可以简写,因为有数字结果。
     简写就可以写成: z =(y > x)? y : x;

2. 选择结构
    格式:
switch(表达式)
{
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
…...
default:
执行语句;
break;
}
特点:
1,和switch语句结束大括号相邻的break可以省略不写。写上也没问题。
2,switch语句的所有答案,没有固定的顺序。可以任意排放。但是执行时,肯定从第一个case执行。
3,switch语句结束,有两种方式。1,执行到break,2,执行到switch语句结束大括号。
4,被选择的值的类型是有限定的。只能接受byte short  int char。四种类型的值。
5,当所有的case都没有匹配时,就会执行default语句。

switch特殊情况:
当匹配的case没有对应的break,那么switch语句会继续执行下面可以执行代码,不会在判断其他case。
将能执行的代码执行完,直到遇到break,或者执行到switch语句。

但是什么时候使用判断结构,什么时候使用选择结构呢???
f和switch的应用场景:
1,对几个值进行判断的时候,
可以用if,也可以用switch。但是建议使用switch。因为swtich效率稍高。
注意:switch有局限性,1,只能是固定个数的值,不能太多。2,类型有限定,只能是byte short int char。
2,对于数据区间的判断,使用if语句。
对于运算的结果是boolean类型的数据,也可以使用if语句。
相对而言,if较为常用。switch较为少用。
所以在JDK不断升级过程中,对switch也进行了升级。
JDK5.0.  switch语句多一种支持的数据类型 enum.枚举。
JDK7.0   switch语句又多一种支持的数据类型 String 字符串类型。

四. 总结:
今天的很多东西,在以前已经学过,但是很多细节上的知识,我在以前是没学到的。今天我觉得收获最大的应该就是赋值运算了,如:a = a + 1; a += 1。它们的区别,以前没了解过,今天一听课,才恍然大悟。明天讲解循环,函数。数组。感觉学的东西越来越多,我还应该更努力的去学习才行。



师傅,今天没有问题呢, 。其实我也不想这么花哨的,但是为了以后复习看起来有针对性,我就不得不整成这样了,加颜色的部分,我是得侧重看的,以后要是工作了,我就不会这样弄了。其实花哨了也浪费了好多时间。唉。师傅,我睡觉去了,明天任务很重,后天我休息。我到时候把这3天的都再压缩总结一下。辛苦师傅啦!!嘿嘿。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics