数据类型和运算符

一、变量和类型

变量:程序运行时可改变的量,开辟内存空间来保存数据
变量作用域:{ }中

  • 注意:在Java中,局部变量使用前一定要先初始化,否则编译无法通过。

类型:对变量的种类进行划分

1.数据变量

数据单位转换:
1Bytes=8 bits(1字节等于8位)
1KB=1024 Bytes(1KB等于1024字节)
1MB=1024 KB
1GB=1024MB
1TB=1024GB

1.1基本类型数据变量
1)整型变量 int

占4个字节,32位      最高位为符号位:0正1负
取值范围:-2^31——2^31-1
定义格式:int 变量名 = 初值(例:int a = 10;)
包装类:Integer
打印int的最大值:System.out.println(Integer.MAX_VALUE)

  • 注意:变量在使用时一定要赋予初始值,若不进行初始化,则编译无法通 过。(体现java的安全性)
            变量赋值时不可取超过其范围的值。
2)long  长整型

占8个字节,64位  
取值范围:-2^63——2^63-1
格式:long a = 10L;(显示加“L”表示长整型,不建议加“l”)。
包装类:Long

3)double  双精度浮点型

占8个字节
包装类:Double
格式:double a = 10(定义时加“d”"D"或者可以不加)
对于小数来说,double是有精度的,计算完并不是准确数字。

4)float  单精度浮点型

占4个字节
格式:float a =10F(定义时必须加“f”或者“F”)
包装类:Float

5)char  字符型

占2个字节
包装类:Character
取值范围:MIN_VALUE:'\u0000'     MAX_VALUE:'\uffff'
                             0          ——          65535

6)byte  字节类型

占1个字节
包装类:Byte
取值范围:-2^7——2^7-1

7)short 短整型

占2个字节
包装类:Short
范围:-2^15——2^15-1

8)boolean 布尔型

标准没有规定大小
取值范围:true,flase

  • 注意:与C不同,Java中不存在1表示true,0表示flase. 因此boolean类型 与int不能相互转换,不存在1表示true,0表示flase.
  • boolean类型不能和其他类型参与运算。
1.2 引用类型数据变量
1)String 字符串类型

定义格式:String 变量名="初始值";
字符串的 + 操作,表示字符串的拼接:

String a = "hello";
String b = "java";
String c = a + b;
System.out.println(c);
//执行结果
hello java

当一个 + 表达式中存在字符串时,若字符串在前,执行字符串的拼接行为(只拼接,不计算);若字符串在后,则先运算再加字符串。(先计算,再拼接)

1.3变量的命名规则

标识符:由字母、数字、下划线、符组成。 但命名时不以下划线或符开始,也不能以下划线或$符结束。
命名时禁止使用拼音与英文混合的方式,更不允许直接用中文的方式。
变量若只含有一个单词,则全部小写;由多个英文字母组成时,命名采用小驼峰的形式,即从第二个单词开始, 每个单词的首字母大写。例如:student_Name.

1.4常量

常量:程序运行期间可以改变值的量。
体现形式:
1.字面常量
例: int a = 10;(10就是字面常量)
2. 被final所修饰的变量

1.5强制类型转换

Java是一种强类型的编程语言, 由表示范围大的类型由表示范围小的类型转换时,编译无法通过。而C是一种弱类型的,由大转换为小时,给出警告但依然可以运行。
强制类型转换:大类型 给 小类型
( 类型:包括字节大小、 精度)

隐式类型转换: 小类型 给 大类型
隐式类型转换中发生类型提升: CPU 在存取数据的时候,以4个字节为单位进行数据的存取
类型提升举例:

public  class Test{
        public static void main(String[] args){
           byte a = 10;
           byte b = 20;
           byte c = (byte)(a + b);//先将a 和 b 进行提升为 int 参与运算
       	   System.out.println(c);
          }
      } 
      结果:30
  • 在运算过程当中,小类型会提升为表达式当中最大的类型,然后参与运算。

二、运算符

2.1 算术运算符
基本四则运算: + - * / %
  • 注意:
    除法中,int / int时,若有小数,则需要用double来计算
    除法中,除数不能为0
    与C不同的是,%不仅能为int求模,也能为double求模
增量赋值运算符

+= -= * = /= %=
例:a += 1;//等价于 a = a+1;
其他赋值运算符与“+=”类似

自增、自减运算符
自增运算符:++

a++:先使用,后+1
++a:先+1,后使用

自减运算符:--

运算规则同上

  • 前置++和后置++若没有进行赋值操作,那代表一个意思。
2.2 关系运算符

等于 ==
不等于 !=
小于 <
大于 >
小于等于 <=
大于等于 >=

  • 注意:关系运算符表达式的返回值都是boolean类型,即返回值为true或false。
2.3 逻辑运算符
  • 注意:逻辑运算符的操作数和返回值都是boolean型
逻辑与 &&

规则:两个操作数都为true,结果为true,否则为false

逻辑或 | |

规则:两个操作数有一个为true,结果为true,否则为false

逻辑非 !

规则:操作数为true,结果为false ; 操作数为false,结果为true

短路求值:

对于&&来说,只要第一个表达式为假,结果为假,后面的均不执行
对于 | | 来说,只要第一个表达式为真,结果为真,后面的均不执行

  • &和 | 操作数类型为boolean类型时,也表示逻辑运算,但不支持短路求值。
2.4 位运算符

均按二进制位运算

按位与 &

同为1取1,其余全取0

例:0xf6 与 0xE3 按位与的结果是
0xf6为16进制,转换为二进制-> 1111 0110
0xE3为16进制,转换为二进制-> 1110 0011
按位与的结果为: 1110 0010

按位或 |

有1取1,没1取0

例:0xf6 与 0xE3 按位或的结果是
0xf6为16进制,转换为二进制-> 1111 0110
0xE3为16进制,转换为二进制-> 1110 0011
按位或的结果为: 1111 0111

按位取反 ~

符号位不变,其他位1变为0,0变为1

例:0xf6 与 0xE3 按位取反的结果是
0xf6为16进制,转换为二进制-> 1111 0110
按位取反的结果为: 1000 1001

按位异或 ^

相同为0,不同为1

例:0xf6 与 0xE3 按位异或的结果是
0xf6为16进制,转换为二进制-> 1111 0110
0xE3为16进制,转换为二进制-> 1110 0011
按位异或的结果为: 0001 0101

  • 注意:
    0x 开头表示16进制,4位二进制表示1位16进制
    0 开头表示8进制,3位二进制表示1位8进制
2.5 移位运算符

均按二进制位来计算。

左移 <<

左移相当于乘法,左移几位乘以2的几次方
例:将0000 1100左移一位:0001 1000

右移 >>

左移相当于除法,左移几位除以2的几次方
例:将0000 1100右移一位:0000 0110

无符号右移 >>>

例:将1111 1111无符号右移一位:0111 1111

  • 注意:
    左移或右移时,最高位符号位原本为1补1,为0补0。
    无符号右移时,最高位符号位只补0。
    没有无符号左移。
2.6 条件运算符
表达式1 ? 表达式2 :表达式3

当表达式1的值为true时,整个表达式的值为表达式2的值;为false时,值为表达式3的值。

异常

编译时异常:在程序编译过程中,发生异常
运行时异常:在程序运行时,发生异常
程序发生异常时, 会有一个异常信息栈,这个栈是JVM中的一部分内存,定义错误的方法是找栈顶的异常信息。
处理异常
运行异常举例:

public class Test{
	      public static void main(String[] args){
		     int a = 10;
		     int b = 0;
		     System.out.println(a/b);
		     System.out.println("hello");
	     }
    }

结果如下:
Exception in thread "main" java.lang.ArothmeticException: / by zero
at Test.main(Test.java:5)

可见,编译时未出现异常,运行时出现算术异常。
异常处理方法:使用try-catch语句。

public class Test{
	public static void main(String[] args){
		int a = 10;
		int b = 0;
		try{
			//放可能发生异常的代码
			System.out.println(a/b);
		}catch(ArithmeticException e){
			System.out.println("除数为0异常");
		}
		System.out.println("hello");
	}
}
结果如下:
除数为0异常
除数为0