• [06] Java的数据类型



    1、基本数据类型

    1.1 基本数据类型

    byte、chart、short、int、long、float、double、boolean 共8种数据类型为基本数据类型:
    数据类型    位数    取值范围    
    byte    8    -128 ~ 127
    char    16    'u0000' ~ 'uFFFF'
    short    16    -2^15 ~ 2^15-1
    int    32    -2^31 ~ 2^31-1
    long    64    -2^63 ~ 2^63-1
    float    32    略    
    double    64    略    
    boolean    1    true / false

    另外,Java中的整数从形式表现上来说有四种方式,除了最常见的十进制,还有:
    • 八进制,逢八进一,用0开头
    • 十六进制,逢十六进一,0x开头,0-9,A,B,C,D,E,F
    • 二进制,逢二进一,任何数据在计算机都是二进制存储,八个二进制代表一个字节byte

    另外要提的是,float和double是浮点数类型,即带小数位的数据类型,其数据存储方式是按 “指数位” 和 “有效数字位”,所以尽管double位数和long都是64位,但是double表示的数字范围更广,但同时,也因为这种方式,其数字精度并不准确。(float数据必须带"f"或"F"以和double区分)

    float:1bit(符号位) + 8bits(指数位) + 23bits(尾数位)
    float类型的存储方式

    double:1bit(符号位) + 11bits(指数位) + 52bits(尾数位)
    double类型数据的存储方式


    1.2 类型转换

    1.2.1 自动类型转换

    • 两种类型必须兼容(如boolean无法转int),且目标类型大于源类型(即低精度转高精度)
    • 对于表达式而言,最终结果与表达式中最高的数据类型相同
    • 类型转换自动发生,无需显式说明

    char ch = 'A'; 
    int num = ch;
    float f = num;
    double d = f;

    1.2.2 强制类型转换

    强制进行类型转换,如果被转换的值的数据类型大于其目标类型,将会丢失部分信息。因为强制转换会进行位数截取,如:
    short a = 128;
    byte b = (byte) a;
    System.out.println(a); //128
    System.out.println(b); //-128

    short a = 0000 0000 1000 0000,强制转换截取后8位,正数用源码表示,负数用补码表示,第一位为符号位,所以转换后的a,即b,反而变成了-128

    除非万不得已,或者绝对确定,否则尽量不使用强制转换。



    2、引用数据类型

    除了上述的基本数据类型以外,其他都归属于引用数据类型。其实说人话就是,引用数据类型就是对象。

    不论是String、int[]、还是自定义的类,都是引用数据类型。

    不同的在于,基本数据类型之间的赋值,是对值进行了拷贝;而引用数据类型之间的赋值,是虚地址之间的拷贝。

    一个示例说明:
    public class Test {
        //属性
        int a = 11;
        char[] ch = {'n', 'b'};
        //方法
        public void change(int a,char ch[]) {
            a = 99;
            ch[0] = 's';
        }
        //测试
        public static void main(String args[]) {
            Test test = new Test();
            test.change(test.a, test.ch);
            System.out.println("test.a = " + test.a);
            System.out.println("test.ch = " + test.ch[0] + test.ch[1]);
        }
    }
    
    //对于基本数据类型,拷贝过去对原来的属性没有影响,最终还是11;
    //对于引用数据类型,传递的是虚地址,在方法中远程更改了真正的对象,所以输出不是nb,而是sb

    最后要提一点的就是,对于基本数据类型之间是否相等,我们使用 “==” 的方式,实际是判断其二进制是否相同;而该方式用来判断引用数据类型,则是对比虚地址,我们知道对象和对象之间都是不同的,所以除非是同一个对象否则该方式只会返回给你false,所以对象之间的比较我们更多的是根据需要重写equals方法。


  • 相关阅读:
    gitlab搭建
    java数组
    安裝nextcloud
    Spring的定时任务@Scheduled(cron = "0 0 1 * * *")
    java内存结构(下)
    java内存结构(上)
    多线程的三个特性
    @RequestBody用法
    SwaggerAPI注解详解(转载)
    在jpanel中添加jbutton并自由设置按钮大小和位置
  • 原文地址:https://www.cnblogs.com/deng-cc/p/7461688.html
Copyright © 2020-2023  润新知