1.3. 基本数据类型

基本数据类型 基本类型表示简单的数据,基本类型分为4大类,共8种数据类型。

  • 整数类型:byte、short、int和long

  • 浮点类型:float和double

  • 字符类型:char

  • 布尔类型:boolean

    其中整数类型、浮点类型和字符类型都属于数值类型,它们之间可以互相转换。

    image0

1.3.1. 整数类型

Java中整数类型包括:byte、short、int和long ,它们之间的区别仅仅是宽度和范围的不同。Java中整数都是有符号,与C不同没有无符号的整数类型。

整数类型:

image1

  • 整数变量的定义
int x;
int x,y;
int x=450, y=-462;

定义以上4种类型的变量时,要注意变量的取值范围,超出相应范围就会出错

对于long型值,若赋给的值大于int型的最大值或者小于int型的最小值,则需要在数字后加L或l,表示该数值为长整数,如:long num=21456733499L
package Number;

public class Number {
//  创建类
    public static void main(String[] args) {
//      主方法
//      声明byte并赋值类型
        byte mybyte=124;
//      声明short类型并赋值
        short myshort=32564;
//      声明int型并赋值
        int myint=45784612;
//      声明long并赋值
        long mylong=46789451;
//      将上面的所有变量相加后输出结构
        long result= mybyte + myshort + myint + mylong;
        System.out.println("结果为: " + result);

    }
}

//输出结果为:
结果为: 92606751

1.3.2. 浮点类型

浮点类型表示有小数部分的数字,Java语音中浮点类型分为单精度浮点类型(float)和双精度浮点,类型(double),双精度浮点数所使用的内存空间比浮点数多,可表示的数值范围与精确度也比较大.它们具有不同的取值范围。

image2

默认情况下,小数都被看作double型,若使用float型小数,则需要在小数后面添加F或f

可以使用后缀d或D来明确表明这是一个double类型数据,不加d不会出错,但声明float型变量时如果
不加f,系统会认为变量时double类型而出错
  • 定义浮点类型变量,实例代码如下:
float f1=13.23f;
double d1=4562.12d;
double d2=45678.1564;

1.3.3. 数字表示方式

进制数字表示 如果为一个整数变量赋值,使用二进制数、八进制数和十六进制数表示,它们的表示方式分别如下:

  • 二进制数:以 0b 或0B为前缀,注意0是阿拉伯数字,不要误认为是英文字母o。
  • 八进制数:以0为前缀,注意0是阿拉伯数字。
  • 十六进制数:以 0x 或0X为前缀,注意0是阿拉伯数字。

例如下面几条语句都是表示int整数28

int decimalInt = 28;
int binaryInt1 = 0b11100;
int binaryInt2 = 0B11100;
int octalInt = 034;
int hexadecimalInt1 = 0x1C;
int hexadecimalInt2 = 0X1C;

1.3.4. 字符类型

  • 1.char型
字符类型(char)用于存储单个字符,占用16位(两个字节)的内存空间。
在定义字符型变量时,要以单引号表示,如‘s’表示一个字符,而"s"则表示一个字符串,
虽然只有一个字符,但由于使用双引号,它仍然表示字符串,而不是字符。
package Number;

public class Gess {
//  定义方法
   public static void main(String[] args) {
//      主方法
//      定义char型变量
   char word = 'd',word2='@';
//  定义int型变量
   int p = 23045,p2 = 45213;
   System.out.println("d 在unicode表中的顺序位置是: " + (int) word);
   System.out.println("@ 在Unicode表中的顺序位置是: " + (int) word2);
   System.out.println("unicode表中的第23045位是: " + (char)p);
   System.out.println("unicode表中的第45231位是: " + (char)p2);

   }
}
  • 2.转义字符
转义字符是一种特殊的字符变量,它以反斜杠“\”开头,后跟一个或多个字符,
转义字符具有特定的含义,不同于字符原有的意义,故称“转义”。

image3

package Number;

public class Gess {
//  定义方法
    public static void main(String[] args) {
//      主方法
    //将转义字符‘\\’赋值给变量c1
    char c1='\\';
    //将转义字符‘\u2605’赋值给变量char1
    char char1='\u2605';
    System.out.println(c1);
    System.out.println(char1);

    }
}

1.3.5. 布尔类型

布尔类型又称为逻辑类型,通过关键字boolean来定义布尔类型变量,只有true和false两个值,

分别代表逻辑中的“真”和“假”。布尔值不能与整数类型进行转换,布尔类型通常被用在流程

提示 在C语言中布尔类型是数值类型,它有两个取值:1和0。而在Java中的布尔类型取值不能用1和0替代,也不属于数值类型,不能与int等数值类型之间进行数学计算或类型转化。

控制中作为判断条件
boolean b;
boolean b1,b2;
//定义布尔型变量b,并赋值给初值true
boolean b = true;

如果试图给它们赋值true和false之外的常量,如下所示

boolean isMan = 1;
boolean isWoman = 'A';

则发生类型不匹配编译错误。

1.3.6. 数值类型相互转换

基本数据类型中数值类型之间可以互相转换,布尔类型不能与它们之间进行转换。但有些不兼容类型之间,如String(字符串)转换为int整数等,可以借助于一些类的方法实现。

数值类型包括了byte、short、char、int、long、float和double,这些数值类型之间的转换有两个方向:

  • 自动类型转换和强制类型转换。

自动类型转换

自动类型转换就是需要类型之间转换是自动的,不需要采取其他手段,总的原则是小范围数据类型可以自动转换为大范围数据类型,列类型转换顺序如下图所示,从左到右是自动。

数据类型转换顺序

image4

注意 char类型比较特殊,char自动转换为int、long、float和double,但byte和short不能自动转换为char,而且char也不能自动转换为byte或short。

自动类型转换不仅发生在赋值过程中,在进行数学计算时也会发生自动类型转换,在运算中往往是先将数据类型转换为同一类型,然后再进行计算。

从低级类型向高级类型的转换

顺序为: byte<short<int<long<float<double

技巧: 要理解类型转换,这么想象,大脑前面是一片内存,源和目标分别是两个大小不同的内存块(由变量和数据类型决定),将源数据赋值给目标内存的过程,就是用目标内存块尽可能多的套取源内存中的数据。

计算过程中自动类型转换规则:

image5

package com.company;

public class Main {

    public static void main(String[] args) {
        // write your code here
        // 声明整数变量
        byte byteNum = 16;
        short shortNum = 16;
        int intNum = 16;
        long longNum = 16L;
        // byte类型转换为int类型
        intNum = byteNum;
        // 声明char变量
        char charNum = '花';
        // char类型转换为int类型
        intNum = charNum;
        // 声明浮点变量
        // long类型转换为float类型
        float floatNum = longNum;
        // float类型转换为double类型
        double doubleNum = floatNum;
        //表达式计算后类型是double
        double result = floatNum * intNum + doubleNum / shortNum;
        System.out.println(result);
        System.out.println(intNum);
    }
}

强制类型转换

在数值类型转换过程中,除了需要自动类型转换外,有时还需要强制类型转换,强制类型转换是在变量或常量之前加上“(目标类型)”实现,示例代码如下:

package Number;

public class test1 {

    public static void main(String[] args) {
        int a=(int)45.23;
        long y=(long)456.6F;
        int b=(int)'d';
        System.out.println(a);  //45
        System.out.println(y);  //456
        System.out.println(b);  //100

    }

}

//输出结果
45
456
100

有时为了提高精度需要种转换。示例代码如下:

package com.company;

public class Main {
    public static void main(String[] args) {
        //int型变量
        int i2 = 20;
        float c1 = i2 / 3;
        System.out.println(c1);
        //把int变量i强制转换为float
        float c2 = (float)i2 / 3;
        System.out.println(c2);
    }
}

/*
6.0
6.6666665
*/

再看一个强制类型转换与精度丢失的示例:

package com.hujianli;

public class Main {
    public static void main(String[] args) {
        long yourNumber = 6666666666L;
        System.out.println(yourNumber);
        int myNumber = (int)yourNumber;
        System.out.println(myNumber);
    }
}

/*
6666666666
-1923267926*/

经过强制类型转换后,原本的6666666666L变成了负数。当大宽度数值转换 为小宽度数值时,大宽度数值的高位被截掉,这样就会导致数据精度丢失。除非大宽度数值的高位没有数据,就是这个数比较小的情况,例如将6666666666L换为6L就不会丢失精度。

1.3.7. 引用数据类型

在Java中除了8种基本数据类型外,其他数据类型全部都是引用(reference)数据类型,引用数据类型 用了表示复杂数据类型,如下图所示,包含:类、接口和数组声明的数据类型。

image6

引用数据类型 提示 Java中的引用数据类型,相当于C等语言中指针(pointer)类型,引用事实上就是指针,是指向一个对象的内存地址。引用数据类型变量中保持的是指向对象的内存地址。很多资料上提到Java不支持指针,事实上是不支持指针计算,而指针类型还是保留了下来,只是在Java中称为引用数据类型。

package com.zhijiekeji;

public class Main {

    public static void main(String[] args) {
        int x = 7;
        int y = x;

        String str1 = "Hello";
        String str2 = str1;
        System.out.println("y value is :" + y);
        System.out.println("str2 value is :" + str2);
    }
}



/*
*
y value is :7
str2 value is Hello
* */