• 数据类型

    • 强类型语言

      • 要求变量的使用严格符合规定,所有变量必须先定义才能使用
      • java、.NET、C/C++
    • 弱类型语言

      • 相较于强类型语言的规定和要求较为宽松。
      • vb,php,JavaScript
    • Java的数据类型分为两大类

      • 基本数据类型(primitive type)
      • 引用数据类型(reference type)

    jdg

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class demo2 {
    public static void main(String[] args) {
    //八大基本数据类型
    //整数

    int num1 = 10;//最常用
    byte num2 = 20;
    short num3 = 30;
    long num4 = 30L;//long类型要在数字后面加个l

    //浮点数:小数
    float num5 = 50.1f;//float类型要在数字后面加个f
    double num6 = 3.1415926d;

    //字符类型
    char name = 'a';
    //字符串,String不是关键字,是类
    String namea = "希文";

    //布尔值
    boolean flag = false;

    补充知识

    • 字节

      • 位(bit):是计算机内部数据储存的最小单位,11001100是一个八位二进制数。

      • 字节(byte):是计算机中数据处理的基本单位,习惯上用大写B来表示。

      • 1B(byte,字节)=8bit(位)

      • 字符:是指计算机中使用的字母、数字、字和符号

    • 转换

    • 1bit表示一位

    • 1Byte表示一个字节 1B=8b

    • 1024B=1KB

    • 1024KB=1M

    • 1024M=1G

      1
      TIPS:一个英文字母为8位,即1个字节;一个汉字为16位,即2个字节。

    简单区分一下32位和64位操作系统的区别

    1. 32位的cpu处理器,只能安装32位的电脑操作系统;
    2. 64位的cpu处理器,则可以安装32位和64位操作系统,所以64位处理器是向下兼容的;
    3. 但是,如果真的在64位处理器的电脑上面安装32位操作系统,那么会导致处理器的性能无法充分发挥。
  • 类型转换

    • 由于Java是强类型语言,所以要进行有些运算的时候,需要用的类型转换

      低—————————————————-高

      byte,short,char→int→long→float→double

      这里的低—–高其实是精度的由低到高!

      小数的优先级一定大于整数!

    • 运算中,不同类型的数据先转化为同一类型,然后再进行运算。

    • 强制类型转换(类型)变量名→高—–低

    • 自动类型转换不需要任何操作→低—–高

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      public class demo5 {
      public static void main(String[] args) {
      int i = 128;
      double b = i;
      System.out.println(i);
      System.out.println(b);
      //强制转换类型:(类型)变量名→高--低
      /*byte b = i;//转换前
      byte b = (byte)i;//转换后
      */
      //自动转换 不需要加任何东西 低--高
      /*
      注意点:
      1.不能对布尔值进行转换
      2.不能把对象类型转换为不相干的类型
      3.在把高容量转换到低容量的的时候,强制转换
      4.转换的时候可能存在内存溢出,或者精度问题。
      */
      System.out.println("==========================");
      System.out.println((int)23.7); //23
      System.out.println((int)-45.89); //45

      System.out.println("==========================");
      char c = 'a';
      int d = c+1;
      System.out.println(d);
      System.out.println((char)d);

      }
      }

      溢出问题(重点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class demo06 {
public static void main(String[] args) {
//操作比较大的数的时候,注意溢出问题。
//JDK新特性,数字之间可以用下划线分割,符合四位分级,并不会速出下划线。
1.int money = 10_0000_0000;
System.out.println(money);

2.int years = 20;
int total = money*years;//-1474836480,计算的时候溢出了
System.out.println(total);

3.long total2 = money*years;//默认是int,转换为long之前已经出现问题了(溢出了)
System.out.println(total2);

4.long total3 = ((long)money)*years;
//先把一个数转换为long(money和years都行,任选其一),整个表达式都提升为long了.这样就 可以避免溢出了。
System.out.println(total3);

}
}

重点分析一下

  1. 新知识点
  • JDK新特性:数字之间可以用下划线分割,符合四位分级,并不会速出下划线。适合我们中国人的一个细节。非常nice!
  1. 溢出问题
  • 溢出问题:money已经超出了int类型的范围溢出了
  1. 问题滞留
  • 这里为什么输出结果还是错的呢,这里涉及到的问题就是在转换为long类型之前已经出现溢出问题了,到达long这里的时候就是一个有问题的数据
  1. 解决方案
  • 先把一个数转换为long(money和years都行,任选其一),整个表达式都提升为long了.这样就 可以避免溢出了。

  • 底层原理

    • 概念:在Java中,如果两个操作数的类型不同,编译器会将它们提升到更高的数据类型,并执行操作。这个过程称为“数据类型提升”
    • 规则:Java会将较低的数据类型自动转换为较高的数据类型,以便进行操作。
    • 实操:在乘法操作中,如果一个操作数是 int 类型,而另一个是 long 类型,Java会自动将 int 类型提升long 类型,然后执行乘法操作。

    为什么呢?

    因为 long 类型的范围比 int 类型更大,可以容纳更大的值,所以将 int 类型提升为 long 类型可以避免溢出问题。

    综上:因此,即使 moneyint 类型,yearslong 类型,Java会自动将 money 提升为 long 类型,然后执行乘法操作,以确保乘法操作在 long 类型范围内进行,避免溢出问题。