1. 数据类型

1.1分类

Java的数据类型分为两大类:

  • 基本数据类型:包括 整数 、 浮点数 、 字符 、 布尔 。
  • 引用数据类型:包括 类 、 数组 、 接口 。

二、数据类型、常量、变量、转义字符、运算符 - 图1

1.2基本数据类型

四类八种基本数据类型:

数据类型 关键字 内存占用 取值范围 默认值
字节型 byte 1个字节 -128-127 0
短整型 short 2个字节 -32768~32767 0
整型 int(默认) 4个字节 -2的31次方~2的31次方-1 0
长整型 long 8个字节 -2的63次方~2的63次方-1 0L 超过int范围的必须加L或l(小写L)
单精度浮点数 float 4个字节 1.4013E-45~3.4028E+38 0.0f 要表示float类型,必须加F或f
双精度浮点数 double(默认) 8个字节 4.9E-324~1.7977E+308 0.0d 不加F,就是double类型。
字符型 char 2个字节 0-65535 ‘\u0000’ char常量值,必须使用单引号
布尔类型 boolean 1个字节 true,false false

Java中的默认类型:整数类型是 int 、浮点类型是 double 。

1.2.1进制表示

八进制:以0开头,包括0-7的数字
如:037,056
十六进制表示:以0x或0X开头,包括0-9的数字,及字母a-f,A-F
如:0x12,0xabcf,0XABCFF

2.常量

2.1 常量概述

常量:是指在Java程序中固定不变的数据。

2.2 常量分类

类型 含义 数据举例
整数常量 所有的整数 0,1, 567, -9
小数常量 所有的小数 0.0,-0.1,2.55
字符常量 单引号引起来,只能写一个字符,必须有内容 ‘a’ , ‘ ‘, ‘好
字符串常量 双引号引起来,可以写多个字符,也可以不写 “A” ,”Hello” ,”你好” ,””
布尔常量 只有两个值(流程控制中讲解) true,false
空常量 只有一个值(引用数据类型中讲解) null
  1. public class ConstantDemo {
  2. public static void main(String[] args) {
  3. //输出整数常量
  4. System.out.println(123);
  5. //输出小数常量
  6. System.out.println(0.125);
  7. //输出字符常量
  8. System.out.println('A');
  9. //输出布尔常量
  10. System.out.println(true);
  11. //输出字符串常量
  12. System.out.println("你好Java");
  13. }
  14. }

二、数据类型、常量、变量、转义字符、运算符 - 图2

3. 变量

3.1 变量概述

变量:常量是固定不变的数据,那么在程序中可以变化的量称为变量。
数学中,可以使用字母代替数字运算,例如 x=1+5 或者 6=x+5。
程序中,可以使用字母保存数字的方式进行运算,提高计算能力,可以解决更多的问题。比如x保存5,x也可 以保存6,这样x保存的数据是可以改变的,也就是我们所讲解的变量。

Java中要求一个变量每次只能保存一个数据,必须要明确保存的数据类型。

3.2 变量的定义

变量定义的格式包括三个要素: 数据类型 、 变量名 、 数据值 。

  1. public class Variable {
  2. public static void main(String[] args) {
  3. //定义字节型变量
  4. byte b = 100;
  5. System.out.println(b);
  6. //定义短整型变量
  7. short s = 1000;
  8. System.out.println(s);
  9. //定义整型变量
  10. int i = 123456;
  11. System.out.println(i);
  12. //定义长整型变量
  13. long l = 12345678900L;
  14. //整型字面值默认情况下是int类型,如果表示长整型则在末尾加L或l
  15. System.out.println(l);
  16. //定义单精度浮点型变量
  17. float f = 5.5F;
  18. //如表示float类型,则需要在字面值后加f或F
  19. System.out.println(f);
  20. //定义双精度浮点型变量
  21. double d = 8.5;
  22. //浮点型字面值默认情况下表示double类型,也可以在值后加d或D
  23. System.out.println(d);
  24. //定义布尔型变量
  25. boolean bool = false;
  26. System.out.println(bool);
  27. //定义字符型变量
  28. char c = 'A';
  29. System.out.println(c);
  30. }
  31. }

3.3 最终变量

最终变量习惯上也称为常量,因为它是通过在声明变量的数据类型前面加final的方式实现的,所以叫最终变量。加final修饰后,这个变量的值就不能修改了,一开始赋值多少,就是多少,所以此时的变量名通常称为常量名。常量名通常所有字母都大写,每一个单词之间使用下划线分割,从命名上和变量名区分开来。
这样做的好处,就是可以见名知意,便于维护。

public class FinalVariableDemo {
    public static void main(String[] args){
        //定义常量
        final int FULL_MARK = 100;//满分
        // FULL_MARK = 150;//错误,final修饰的变量,是常量,不能重新赋值

        //输出常量值
        System.out.println("满分:" + FULL_MARK);

        //小王的成绩比满分少1分
        int wang = FULL_MARK - 1;
        //小尚得了满分
        int shang = FULL_MARK;
        //小刘得了一半分
        int liu = FULL_MARK/2;

        //输出变量值
        System.out.println("小王成绩:" + wang);
        System.out.println("小尚成绩:" + shang);
        System.out.println("小刘成绩:" + liu);
    }
}

3.4 类型转换

类型转换分为自动类型转换和强制类型转换

3.4.1 自动类型转换

image.png

自动类型转换原则:

  • 不能对boolean类型进行类型转换。
  • 不能把对象类型转换成不想关类的对象
  • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换
  • 转换过程中可能导致溢出或者损失精度
  • 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,
int i =128;   
byte b = (byte)i;
//因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。

(int)23.7 == 23;        
(int)-45.89f == -45

3.4.2 强制类型转换

    1. 条件是转换的数据类型必须是兼容的。
    1. 格式:(type)value type是要强制类型转换后的数据类型 实例:
      public class QiangZhiZhuanHuan{
      public static void main(String[] args){
         int i1 = 123;
         byte b = (byte)i1;//强制类型转换为byte
         System.out.println("int强制类型转换为byte后的值等于"+b);
      }
      }
      //int强制类型转换为byte后的值等于123
      

      4. Java中的转义字符

      | 符号 | 字符含义 | | —- | —- | | \n | 换行 (0x0a) | | \r | 回车 (0x0d) | | \f | 换页符(0x0c) | | \b | 退格 (0x08) | | \0 | 空字符 (0x0) | | \s | 空格 (0x20) | | \t | 制表符 | | \“ | 双引号 | | \‘ | 单引号 | | \\ | 反斜杠 | | \ddd | 八进制字符 (ddd) | | \uxxxx | 16进制Unicode字符 (xxxx) |

5. 运算符

5.1 算术运算符

算术运算符 名称 举例
+ 加法 5+10=15
- 减法 10-5=5
* 乘法 3*6=18
/ 除法 36/4 = 9
% 求余数 13%3=1
++ 自增1 int n=3;n++
自减1 int n=4;—n
public class OperatorDemo01 {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;

        System.out.println(a + b);// 7
        System.out.println(a - b);// -1
        System.out.println(a * b);// 12
        System.out.println(a / b);// 计算机结果是0,为什么不是0.75呢? 整数/整数结果还是整数
        System.out.println(a % b);// 3


        //余数的符号只看被除数
        System.out.println(5%2);//1
        System.out.println(5%-2);//1
        System.out.println(-5%2);//-1
        System.out.println(-5%-2);//-1
        //商*除数 + 余数 = 被除数
        //5%-2  ==>商是-2,余数时1    (-2)*(-2)+1 = 5
        //-5%2  ==>商是-2,余数是-1   (-2)*2+(-1) = -4-1=-5
    }
}

5.1.1 自增自减运算符的执行方式

理解:++ 运算,变量自己的值加1。反之,— 运算,变量自己的值减少1,用法与++ 一致。

1、单独使用
  • 变量在单独运算的时候,变量前++和变量后++,变量的是一样的;
  • 变量前++ :例如 ++a 。
  • 变量后++ :例如 a++ 。 | 表达式 | 执行方式 | 结果(num1=1) | | —- | —- | —- | | num2=++num1; | num1 = num1 +1;
    num2=num1; | num1 =2;
    num2=2; | | num2=num1++; | num2=num1; num1=num1+1; | num1=2;
    num2=1; | | num2=—num1; | num1=num1-1; num2=num1; | num1=0;
    num2=0; | | num2=num1—; | num2=num1; num1=num1-1; | num1=0;
    num2=1; |

2、复合使用
  • 和其他变量放在一起使用或者和输出语句放在一起使用,前++和后++就产生了不同。
  • 变量前++ :变量先自身加1,然后再取值。
  • 变量后++ :变量先取值,然后再自身加1。

    public class OperatorDemo03 {
      public static void main(String[] args) {
          // 其他变量放在一起使用
          int x = 3;
          //int y = ++x; // y的值是4,x的值是4,
          int y = x++; // y的值是3,x的值是4
    
          System.out.println(x);
          System.out.println(y);
          System.out.println("==========");
    
          // 和输出语句一起
          int z = 5;
          //System.out.println(++z);// 输出结果是6,z的值也是6
          System.out.println(z++);// 输出结果是5,z的值是6
          System.out.println(z);
    
          int a = 1;
          a = a++;//(1)先取a的值“1”放操作数栈(2)a再自增,a=2(3)再把操作数栈中的"1"赋值给a,a=1
    
          int i = 1;
          int j = i++ + ++i * i++;
          /*
          从左往右加载
          (1)先算i++
          ①取i的值“1”放操作数栈
          ②i再自增 i=2
          (2)再算++i
          ①i先自增 i=3
          ②再取i的值“3”放操作数栈
          (3)再算i++
          ①取i的值“3”放操作数栈
          ②i再自增 i=4
          (4)先算乘法
          用操作数栈中3 * 3 = 9,并把9压会操作数栈
          (5)再算求和
          用操作数栈中的 1 + 9 = 10
          (6)最后算赋值
          j = 10
          */
      } 
    }
    
  • 小结:

    • ++在前,先自加,后使用;
    • ++在后,先使用,后自加。

      5.2 关系运算符

  • 比较运算符用于判断两个数据的大小,如大于

  • 比较的结果是一个布尔值 | 运算符 | 名称 | 表达式 | 结果 | | —- | —- | —- | —- | | > | 大于 | 5>3 | true | | < | 小于 | 5<3 | false | | >= | 大于等于 | 5>=3 | true | | <= | 小于等于 | 5<=3 | false | | == | 等于 | 5==3 | false | | != | 不等于 | 5!=3 | true |

5.3 逻辑运算符

  • &&和&区别:
    • &&和&结果一样,&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。
  • ||和|区别:
    • ||和|结果一样,||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。 | 名称 | 运算符 | 表达式 | | —- | —- | —- | | 与 | &&或& | operand1&&operand2 | | 或 | ||或| | operand1||operand2 | | 非 | ! | !operan |

5.4 条件运算符

Java中的条件运算符是三目运算符
语法:

  • 布尔表达式?表达式1:表达式2
  • 当布尔表达式的值为true,则返回表达式1的值,否则返回表达 式2的值

    5.5 位运算符

    位运算符: 对两个操作数中的每一个二进制位都进行运算
    位运算符功能:
    1、按位取反 ~
    2、按位与 &
    3、按位或 |
    4、按位异或 ^
    image.png

    5.6 位移运算符:

    左移:”a<<b;”将二进制形式的a逐位左移b位,最低位空出的b位补0

    运算规则:左移几位就相当于乘以2的几次方 3<<4 类似于 32的4次= 316 = 48

    注意:当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位 byte,short,char在计算时按照int类型处理

带符号右移:”a>>b; “将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位

快速运算:类似于除以2的n次,如果不能整除,向下取整 69>>4 类似于 69/2的4次 = 69/16 =4

无符号右移:”a>>>b;”将二进制形式的a逐位右移b位,最高位空出的b位补0

69>>>4 类似于 69/2的4次 = 69/16 =4 69>>4 类似于 69/2的4次 = 69/16 =4

image.png

5.7 复合赋值运算符

运算符 表达式 计算 结果(假设x=15)
+= x+=5 x=x+5 20
-= x-=5 x=x-5 10
*= x*=5 x=x*5 75
/= x/=5 x=x/5 3
%= X%=5 x=x%5 0
<<= 将左边变量的值左移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量
>>= 将左边变量的值右移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量
>>>= 将左边变量的值无符号右移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量
&= 将左边变量的值和右边的常量值/变量值/表达式的值进行按位与,最后将结果赋值给左边的变量
|= 将左边变量的值和右边的常量值/变量值/表达式的值进行按位或,最后将结果赋值给左边的变量
^=
将左边变量的值和右边的常量值/变量值/表达式的值进行按位异或,最后将结果赋值给左边的变量
public class OperatorDemo04 {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        int c = a + b;        

        b += a;// 相当于 b = b + a ; 
        System.out.println(a); // 3
        System.out.println(b); // 7    
        System.out.println(c); //7

        short s = 3;
        // s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度
        s += 4; // 代码没有报错
        //因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成short
        System.out.println(s);

        int j = 1;
        j += ++j * j++;//相当于  j = j + (++j * j++);
        System.out.println(j);//5

        int m = 1;
        m <<= 2;
        System.out.println(m);
    }
}

5.8 运算符的优先级

运算符 描述
() 圆括号
!,++,— ,~ 逻辑非,自增,自减
*,/,% 乘法,除法,取余
+,- 加法,减法
<< ,>> ,>>> 位移运算符
<,<=,>,>=,instanceof 小于,小于等于,大于,大于等于
==,!= 等于,不等于
& 逻辑与
^ 异或
| 逻辑或
&& 逻辑与
|| 逻辑或
? : 三目表达式
=,*=,/=,%= 赋值运算符
+=,-=,<<=,>>= 复合赋值运算
>>>=,&=,^=,|= 复合赋值运算

提示说明:
(1)表达式不要太复杂
(2)先算的使用()
口诀:

单目运算排第一; 乘除余二加减三; 移位四,关系五; 等和不等排第六; 位与、异或和位或; 短路与和短路或; 依次从七到十一; 条件排在第十二; 赋值一定是最后;