Java语言基础-基础数据类型

数据类型总览

Java的数据类型分为基本数据类型与引用数据类型。

数据类型

一共有8种基础数据类型,3种引用数据类型。这里有个要注意的地方是在Java内字符串String是一个类。

英文名称 中文名称 长度(位) 表数范围
byte 字节型 8 -128~127
short 短整型 16 -215~215-1
int 整型 32 -231~231-1(约21亿)
long 长整形 64 -263~263-1
float 单精度浮点型 32 -3.403E38~3.403E38
double 双精度浮点型 64 -1.798E308~1.798E308
char 字符型 16
boolean 布尔型 32
class
interface 接口
array 数组

注:Java规范中没有明确给出布尔类型的长度,但是在Java中布尔类型false存储为0,true存储为1,也就是占据1bit;但是在计算机中最小的处理单位是1byte,也就是8bit;但是在JVM规范中指出,将布尔类型作为整型来计算,也就是说布尔类型占4byte,也就是32bit。

整型

Java各整数类型有固定的表数范围和字段长度,不受操作系统的影响,以保证Java程序的可移植性。

Java的整数常量默认为int型,声明long型常量须后加‘l’或者‘L’。

Java程序中变量通常声明为int型,除非不足以表示比较大的数,才是用long。

class VariableTest1{
    public static void main(String[] args) {
        // byte
        byte b1 = 127;
        byte b2 = -128;
        System.out.println(b1);
        System.out.println(b2);

        // short
        short s1 = 32767;
        short s2 = -32768;
        System.out.println(s1);
        System.out.println(s2);

        // int
        int i1 = 2147483647;
        int i2 = -2147483648;
        System.out.println(i1);
        System.out.println(i2);

        // long
        long l1 = 9223372036854775807L;
        long l2 = -9223372036854775807L;
        System.out.println(l1);
        System.out.println(l2);
    }
}

浮点型

与整型类似,Java浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响

浮点型常数有两种表示形式:

  • 十进制数形式,如:5.12 512.0f .512(必须要有小数点)

  • 科学计数法形式,如:5.12e2 512E2 100E-2

float:单精度,尾数可以精确到7位有效小数,很多情况下,精度很难满足需求。

double:双精度,精度是float的两倍,通常使用这种类型。

class VariableTest1{
    public static void main(String[] args) {
        // float
        float f1 = 0.9999999f;
        float f2 = 0.1f;
        System.out.println(f1);
        System.out.println(f2);
        // float的精度只有7位,如果小数点后超过7位呢?
        float f3 = 0.99999999f;
        System.out.println(f1 == 1);  //false
        System.out.println(f3 == 1);  //true

        // double
        double d1 = 0.9999999999999999;
        double d2 = 0.1;
        System.out.println(d1);
        System.out.println(d2);
    }
}

字符型

char型数据用来表示通常意义上的“字符”

Java中所有的字符都是使用Uncicode编码,故一个字符可以存储一个字母,一个汉字或者其他语言的一个字符。

字符型变量的三种表现形式:

  • 字符常量是用单引号(’’)括起来的单个字符。例如:char c1='a',char c2='中',char c3='9'
  • Java中还允许使用转义字符’\'来将其后的字符转变为特殊字符型常量,例如:char c1='\n',\n表示换行符
  • 直接使用Unicode值来表示字符型常量:’\uXXXX’。其中XXXX代表一个十六进制整数。如\u000A表示\n。
class VariableTest1{
    public static void main(String[] args) {
        // char
        char c1 = 'a';
        char c2 = '中';
        char c3 = 'ぬ';
        // char c4 = 'ab';    报错(错误: 不是语句),因为char类型的变量只能有一个字符。
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3); 
        // 转义字符
        char c5 = '\n';
        System.out.println("hello"+c5+"world");
        // Unicode字符
        char c6 = '\u0043';   // '\u0043' == C
        System.out.println("hello"+c6+"world");
    }
}

布尔型

class VariableTest1{
    public static void main(String[] args) {
        // 布尔型
        boolean be1 = true ;
        boolean be2 = false;
        System.out.println(be1);
        System.out.println(be2);
    }
}

自动类型转换

类型转换只包含除布尔型外的七种基础数据类型。

class VariableTest2 {
    public static void main(String[] args) {
        // 自动类型转换
        byte b1 = 2;
        int i1 = 129;
        // byte b2 = i1 + b1;   编译不通过(错误: 不兼容的类型: 从int转换到byte可能会有损失)。应该使用能够承载他们运算结果长度的数据类型来接收。
        int i2 = i1 + b1;       // i2是int类型,长度是4byte,可以接收i1和b1的和
        System.out.println(i2);
        
        long l1 = i1 + b1;      // l1是long类型,长度是8byte,远远超过i1和b1的长度,当然可以接收他们的和
        System.out.println(l1); 

        float f1 = i1 + b1;     // f1是float类型,长度是4byte,也可以用来接收i1和b1的和,但是结果会自动添加小数点
        System.out.println(f1); // 相对于,double也可以。

        // 这里总结一下就是:短类型和长类型进行运算,结果类型自动提升为长类型。和浮点型进行运算,结果类型自动提升为浮点型。
        // 短类型是容量小的类型,长类型是容量大的类型,容量大小指的是表示数的范围,大小是相对的。

        // 我们这里并没有特别点明是数值类型才可以,因为字符类型也可以进行运算。
        char c1 = 'a';
        System.out.println(c1 + i1);   // 运算将字符类型看作ASCII码值进行运算,同时将字符类型识别为整型。'a'(char) == 97(int).

        // Java中的布尔值只有true和false两个值,所以不进行运算。

        // 补充:当byte,char,short三种类型做运算时,结果为int类型。
        // short s1 = 3;
        // byte b2 = b1 + s1;    编译不通过(错误: 不兼容的类型: 从int转换到byte可能会有损失)。
        // char c2 = b1 + c1;    编译不通过(错误: 不兼容的类型: 从int转换到char可能会有损失)。
        // short s2 = s1 + b1;   编译不通过(错误: 不兼容的类型: 从int转换到short可能会有损失)。

    }

}

强制类型转换

自动类型转换的逆运算,自动类型转换会将短类型提升为长类型,那么如果要把长类型转换为短类型,那就要用强制类型转换。

class VariableTest2 {
    public static void main(String[] args) {
        // 强制类型转换
        double d1 = 12.3;
        int i1 = (int)d1;   // 强制类型转换需要使用强转符,但是有可能损失精度。
        System.out.println(i1);   // 因为int无法存放小数,所以必须舍去小数部分,影响精度

        int i2 = 128;
        short s1 = (short)i2;
        System.out.println(s1);   // 因为short可以放下128,所以精度没有损失

        byte b1 = (byte)i2;
        System.out.println(b1);   // 因为byte类型只能存放8位(-128~127),所以byte会将128强转成-128
    }

}
发布了242 篇原创文章 · 获赞 60 · 访问量 2156

猜你喜欢

转载自blog.csdn.net/qq_41106844/article/details/105684254