zoukankan      html  css  js  c++  java
  • Java数据类型

    目录:

    Java语言支持的类型

    基本数据类型

    引用类型

    空类型(null type)

    1.整型

    2.字符型

    3.浮点型

    4.布尔型


     

    Java语言是强类型语言,意思是每个变量和每个表达式都有一个在编译时就确定的类型,也就是:所有变量必须先声明,后使用。

     

     

    Java语言支持的类型分为两类:

    ①基本类型(Primitive Type)

    ②引用类型(Reference Type)

     

    1 基本数据类型包括:boolean类型和数值类型。
    2 
    3                         ⊥数值类型有:整数类型和浮点类型。
    4 
    5                        ⊥整数类型包括:byteshortintlongchar(字符型也是一种整数类型)
    6                                     ⊥浮点类型:floatdouble

     

    引用类型包括:类、接口和数组类型,还有一种特殊的null类型。 

    所谓引用类型就是对一个对象的引用,对象包括【实例】和【数组】两种。
    引用类型就是一个指针,只是Java语言不再使用指针这个说法。

     


     

    空类型(null type):就是null值的类型,这种类型没有名称。因为null类型没有名称,所以不可能声明一个null类型的变量或者转换到null类型。

    空引用(null)是null类型变量唯一的值。

    空引用(null)可以转换为任何引用类型。

      在实际开发中,程序员可以忽略null类型,假定null只是引用类型的一个特殊直接量。

    注意:空引用(null)只能被 转换成→ 引用类型不能转换成基本类型 ,因此不能把一个null值赋给基本数据类型。

     


     

     

    1.整型 

        通常所说的整型,实际指的是如下4中类型。

        byte:一个byte类型整数在内存里占8位,表示范围:-128(-27)~127(27-1)

        short:一个short类型整数在内存里占16位,表示范围-32,768‬(-215) ~ 32767(215-1)

        int:一个int类型整数在内存里占32位,表示范围是:-2147483648(-231)~2147483647(231-1)

        long:一个long类型整数在内存里占64位,表示范围是:-9223 372036 854775 808(-263)~ 9223 372036 854775 807(263-1)

        

        int是最常用的整数类型,因此在通常情况下,一个Java整数常量默认就是int类型。

        除此之外,有如下两种情形必须指出

        ★如果直接将一个较小的整数常量(在byte或short类型的表示范围内)赋给一个byte或short变量,系统会自动把这个整数变量当成byte或short类型来处理。

        ★如果使用一个巨大的整数常量(超出了int类型的表示范围)时,Java不会自动把这个整数常量当成long类型来处理。如果希望系统把一个整数常量当成long类型来处理,应在这个整数常量后增加 l 或 L 作为后缀。通常推荐使用L,因为字母 l 很容易和 1搞混。

        下面的代码片段验证了上面的结论。

        程序:IntegerValTest.java

    1 //下面代码是正确的,系统会自动把56当成byte类型处理
    2 byte a = 56;
    3 
    4 //下面代码是错误的,系统不会把9999999999999当成long类型处理,所以超过int的表示范围,从而引起错误
    5 long bigValue = 9999999999999;
    6 
    7 //下面代码是正确的,在巨大的整数常量后使用L后缀,强制使用long了类型
    8 long bigValue2 = 9223372036854775807L;

     

        注意:可以把一个较小的整数常量(在int类型的表示范围内)直接赋给一个long类型的变量,这并不是因为Java会把这个较小的整数常量当成long类型来处理,Java依然把这个整数常量当成int类型来处理,只是这个int的类型的值会自动类型转换到long类型。

     

        Java中整型变量有4种表示方式:二进制、十进制、八进制和十六进制,其中八进制的整数常量以0开头,十六机制的整数常量以0x或0X开头,其中10-15分别以a~f来表示(此处的a~f不区分大小写)。

     

        下面的代码片段分别使用八进制和十六进制的数。

        程序IntegerValTest.java

    1 //以0开头的整数常量是八进制的整数
    2 int octalValue = 013;
    3 
    4 //以0x或0X开头的整数常量是十六进制的整数
    5 int hexValue1 = 0x13;
    6 int hexValue2 = 0xaF;

        

       二进制整数:

       在某些时候,程序需要直接使用二进制整数,二进制整数更“真实”,更能表达整数在内存中的存在形式。不仅如此,有些程序(尤其在开发一些游戏时)使用二进制整数会更便捷。

       Java7新增了对二进制整数的支持,二进制的整数以0b或0B开头。

       程序片段如下: 

     1 //定义两个8位的二进制整数
     2 int binVal1 = 0b11010100;
     3 
     4 byte binVal2 = 0b01101001;
     5 
     6 //定义一个32位的二进制整数,最高位是符号位
     7 int binVal3 = 0B10000000000000000000000000000011;
     8 
     9 System.out.println(binVal1);//输出212
    10 System.out.println(binVal2);//输出105
    11 System.out.println(binVal3);//输出-2147483645

        从上面的粗体字可以看出,当定义32位的二进制整数时,表明它是一个负数,负数在计算机里是以补码的形式存在的,因此还需要换算成原码

     

        提示:

        所有数字在计算机底层都是以二进制形式存在的,原码是直接将一个数值换算成二进制数。

        但计算机以补码的形式保存所有的整数。

        补码的计算规则:

            整数的补码和原码完全相同,负数的补码是其反码加1;

            反码是对原码的按位取反,只是最高位(符号位)保持不变。

     

     将上面的二进制整数binVal3转换成十进制的过程如下图所示(二进制整数转换成十进制):

     

        正如前面所指出的,一个Java整数常量默认就是int类型,因此使用二进制形式定义整数时,二进制整数默认占32位,其中第32位符号位

        如果在二进制整数后添加l或L后缀,那么这个二进制整数默认占64位,其中第64位是符号位。

        例如,如下程序:

     1 // 定义一个8位的二进制整数,该数值默认占32位,因此它是一个正数。
     2 //只是强制类型转换成byte时产生了溢出,最终导致binVal4变成了-23
     3 
     4 byte binVal4 = (byte)0b11101001;
     5 
     6 // 定义一个32位的二进制整数,最高位是符号位,但由于数值后添加了L后缀,因此该整数实际占64位,第32位的1不是符号位。
     7 // 因此binVal5的值等于2的31次方+2+1
     8 
     9 long binVal5 = 0B10000000000000000000000000000011L;
    10 
    11 System.out.println(binVal4); // 输出-23
    12 System.out.println(binVal5); // 输出2147483651

     

         上面程序中粗体字代码与前面程序片段的粗体字代码基本相同,只是在定义二进制整数时添加了'L'后缀,这就表明把它当成浪long类型处理,因此该整数实际占64位,此时的第32位不再是符号位,因此它依然是一个正数。

        至于程序中的byte binVal4 = (byte)0b11101001; 代码,其中0b11101001依然是一个32位的正整数,只是程序进行强制类型转换时发生了溢出,导致它变成了负数 。

     


    2.字符型 

        字符型通常用于表示单个字符,字符常量必须使用单引号(')括起来。

        Java语言使用16位的Unicode字符集作为编码方式,而Unicode的被设计成支持世界上所有书面语言的字符,包括中文字符,因此Java程序支持各种语言的字符。

        字符型常量有如下三种表示形式:

        ★直接通过单个字符来指定字符型常量,例如'A'、'9'和'0'等。

        ★通过转义字符表示特殊字符型常量,例如' '、' '等。

        ★直接使用Unicode的值来表示字符型常量,格式是'uXXXX',其中XXXX代表一个十六进制的整数。

        Java语言中常用的转义字符如下表(Java语言中常用更多转义字符):

       

     

        字符型常量也可以采用16进制编码方式来表示,范围是:'u0000'~'uFFFF',一共可以表示65,535个字符,其中前256个字符和ASCII码中的字符完全重合。

        不仅如此,char类型的值也可直接作为整数类型的值来使用,但它是一个16位的无符号整数,即全部是正数,表示范围是0~65,53。

        如果把0~65,535范围内的一个int整数赋给char类型变量,系统会自动把这个int整数当成char类型来处理,下面程序简单示范了字符型变量的用法。

        程序:CharTest.java

     1 public class CharTest{
     2     public static void main(String[] args){
     3         // 直接指定单个字符作为字符类型常量
     4         char aChar = 'a';
     5         
     6         // 使用转义字符来作为字符类型常量
     7         char enterChar = '
    ';
     8 
     9         // 使用用Unicode的编码值来指定字符类型常量
    10         char ch = 'u9999';
    11 
    12         // 将输出一个 '香' 字符
    13         System.out.println(ch);
    14 
    15         // 定义一个 '疯' 字符类型常量
    16         char zhong = '疯';
    17 
    18         // 直接将一个char类型变量当成int类型变量使用
    19         int zhongValue = zhong;
    20         System.out.println(zhongValue);
    21 
    22         // 直接把0~65,535范围内的一个int整数赋给一个char类型变量
    23         char c = 97;
    24         System.out.println(c);
    25     }
    26 }

     

         Java没有提供表示字符串的基本数据类型,而是通过String类来表示字符串,由于字符串有多个字符组成,因此字符串常量使用双引号括起来。如下代码:

     1 // 下面代码定义了一个s变量,它是一个字符串实例的引用,是一个引用类型的变量
     2 String s = '沧海月明珠有泪,蓝田玉暖日生烟。';

        读者必须注意:

        char类型使用单引号括起来,而字符串使用双引号括起来。

        关于String类的用法以及对应的各种方法,读者应该通过查阅API文档来掌握,以此来练习使用API文档。

        

        值得指出的是,Java语言中的单引号,双引号和反斜线都有特殊的用途,如果一个字符串中包括了这些特殊字符,则应该使用转义字符的表示形式。

        例如,在Java程序中表示一个绝对路径:"c:coeds",这种写法得不到我们期望的结果,因为Java会把反斜线当成转义字符,所以应该写成如下形式:"c:\codes",只有同时写两个反斜线,Java才会把第1个反斜线当成转义字符,和后一个反斜线组成真正的反斜线。

     


     

    3.浮点型

        Java的浮点类型有两种:float和double。

        Java的浮点类型有固定的表示范围和字段长度,字段长度和表示范围与机器无关。

        Java的浮点数遵循IEEE 754标准,采用二进制数据的科学计数法来表示浮点数,

        对于float型数值,第1位是符号位,接下来8位表示指数,再接下来的23位表示尾数;

        对于double类型数值,第1位也是符号位,接下来的11位表示指数,再接下来的52位表示尾数。

        注意: 因为Java浮点数使用二进制数据的科学计数法来表示浮点数,因此可能不能精确表示一个浮点数。例如,我们把5.2345556f值赋给一个float类型变量,接着输出这个变量时看到这个变量的值已经发生了改变。使用double类型的浮点数比float类型的浮点数更精确,但如果浮点数的精度足够高(小数点后的数字很多时),依然可能发生这种情况。如果开发者需要精确保存一个浮点数,则可以考虑使用BigDecimal类。

        double类型代表双精度浮点数, 一个double类型的数值占8个字节、64位;

        float类型代表单精度浮点数,一个float类型的数值占4个字节、32位。

        Java语言的浮点数有两种表示形式:

        ★十进制数形式:这种形式就是简单的浮点数,例如5.12、512.0、.512。浮点数必须包含一个小数点,否则会被当成int类型处理。

        ★科学计数法形式:例如5.12e2(即5.12×102),5.12E2(也是5.12×102)。

        

        必须指出的是,只有浮点类型的数值才可以使用科学计数法形式表示。例如,51200是一个int类型的值,但512E2则是浮点类型的值。

        Java语言的浮点类型 默认是double类型,如果希望Java把一个浮点类型值当成float类型处理,应该在这个浮点类型值后紧跟f或F。

            例如,5.12代表一个double类型的常量,占64位的内存空间;5.12f或者5.12F才表示一个float类型的常量,占32位的内存空间。

        

        除此之外,Java还提供了3个特殊的浮点数值:正无穷大、负无穷大和非数,用于表示溢出和出错。

            例如,使用一个正数除以0将得到正无穷大,使用一个负数除以0将得到负无穷大0.0除以0.0对一个负数开方将得到一个非数

            正无穷大通过Double或Float的POSITIVE_INFINITY表示;

            负无穷大通过Double或Float的NEGATIVE_INFINITY表示,

            非数通过Double或Float的NaN表示。

       

        必须指出的是,所有的正无穷大数值都是相等的,所有的负无穷大数值都是相等的;而NaN不与任何数值相等,甚至和NaN都不相等。

        注意:

        只有浮点数除以0才可以得到正无穷大负无穷大,因为Java语言会自动把和浮点数运算的0(整数)当成0.0(浮点数)处理。

        如果一个整数值除以0,则会抛出一个异常:ArithmeticException:/by zero(除以0异常)。

        下面程序示范了上面介绍的关于浮点数的各个知识点:FloatTest.java

     1 public class FloatTest{
     2     public static void main(String[] args){
     3         float af = 5.2345556f;
     4          //下面将看到af的值已经发生了改变
     5         System.out.println(af);
     6 
     7         double a = 0.0;
     8         double c = Double.NEGATIVE_INFINITY;
     9         float d = Float.NEGATIVE_INFINITY;
    10 
    11         //看到float和double的负无穷大是相等的
    12         System.out.println(c == d);
    13 
    14         //0.0除以0.0将出现非数
    15         System.out.println(a / a);
    16 
    17         //两个非数之间是不相等的
    18         System.out.println(a / a == Float.NaN);
    19 
    20         //所有的正无穷大都是相等的
    21         System.out.println(6.0 / 0 == 555.0/0);
    22 
    23         //负数除以0.0得到负无穷大
    24         System.out.println(-8 / a);
    25 
    26         //下面代码将抛出除以0的异常
    27         //System.out.println(0 / 0);      
    28     } 
    29 }

        Java 7新增的数值中使用下画线分隔

        正如前面程序中看到的,当程序中用到的数值位数特别多时,程序员眼睛“看花”了都看不清到底有多少位数。

        为了解决这种问题,Java 7引入了一个新功能:程序员可以在数值中使用下画线,不管是整型数值,还是浮点型数值,都可以自由地使用下画线。

        通过使用下画线分隔,可以更直观地分辨数值常量中到底包含多少位。

        如下面程序所示(UnderScore.java):

        

     1 public class UnderscoreTest{
     2     public static void main(String[] args){
     3         // 定义一个32位的二进制数,最高位是符号位
     4         int binVal = 0B1000_0000_0000_0000_0000_0000_0000_0011;
     5         double pi = 3.14_15_92_65_36;
     6         System.out.println(binVal);
     7         System.out.println(pi);
     8         
     9         double height = 8_8_4_8.23;
    10         System.out.println(height);
    11     }
    12 }

    4.布尔型

        布尔型只有一个boolean类型,用于表示逻辑上的“真”或“假”。

        在Java语言中,boolean类型的数值只能是true或false,不能用0或者非0来代表。

        其他基本数据类型的值也不能转换成boolean类型。

        例如,下面代码定义了两个boolean类型的变量,并指定初始值(BooleanTest.java):

     

    1 // 定义b1的值为true
    2 boolean b1 = true;
    3 
    4 // 定义b2的值为false
    5 boolean b2 = false;

     

        字符串"true"和"false"不会直接转换成boolean类型,但如果使用一个boolean类型的值和字符串进行连接运算,则boolean类型的值将会自动转换成字符串。看下面代码(程序清单同上)。

    1 //使用boolean类型的值和字符串进行连接运算,boolean类型的值会自动转换成字符串
    2 String str = true + "";
    3 
    4 //下面将输出true
    5 System.out.println(str);

        boolean类型的值或变量主要用做旗标来进行流程控制,Java语言中使用boolean类型的变量或值控制的流程主要有如下几种:

        ★ if条件控制语句

        ★ while循环控制语句

        ★ do循环控制语句

        ★ for循环控制语句

        除此之外,boolean类型的变量和值还可在三目运算符(?:)中使用。


     

  • 相关阅读:
    SDNU 1311.Binomial Coeffcients
    SDNU 1306.兑数
    SDNU 1272.SL的秘密
    SDNU 1270.超超的难题
    XCode 自动化打包总结
    Xrun 将 app 转化为 IPA
    mac终端下运行shell脚本
    ios 检测应用程序升级问题
    在iis6.0公布asp.net mvc3网站
    IOS 中 NSArray
  • 原文地址:https://www.cnblogs.com/LinQingYang/p/12460674.html
Copyright © 2011-2022 走看看