【Java知识点总结】Java数据类型及其相互转换


Java是强类型(Strongly Typed)语言,强类型包含以下两方面的含义:

  • 所有的变量必须先声明、后使用
  • 指定类型的变量只能接受类型与之匹配的值。

所以Java不存在无类型的变量。

在这里插入图片描述

基本数据类型

类型关键字占用内存取值范围
字节型byte1 字节-128 ∼ \sim 127
短整形short2 字节-32768 ∼ \sim 32767
整型int4 字节-2147483648 ∼ \sim 2147483647
长整型long8 字节-9223372036854775808L ∼ \sim 9223372036854775807L
单精度浮点型float4 字节+/-3.4E+38F(6~7 个有效位)
双精度浮点型double8 字节+/-1.8E+308 (15 个有效位)
字符型char2 字节ISO 单一字符集
布尔型boolean1 字节true 或 false

实际上字符型也是一种整数类型,相当于无符号整数类型。

所有的基本数据类型所占用的字节数都已明确规定,在各种不同的平台上保持不变。

整数类型

Java的4种整数类型都是有符号整数。

类型说明
bytebyte 类型是最小的整数类型。当用户从网络或文件中处理数据流时,或者处理可能与 Java 的其他内置类型不直接兼容的未加工的二进制数据时,该类型非常有用。
shortshort 类型限制数据的存储为先高字节,后低字节,这样在某些机器中会出错,因此该类型很少被使用
intint 类型是最常使用的一种整数类型
long对于大型程序常会遇到很大的整数,当超出 int 类型所表示的范围时就要使用 long 类型

计算机的数值应视为连续若干个二进制位的集合,而所谓高、低字节就是此集合中位地址高/低的二进制位集合。例如定义一个unsigned short变量在0x1234 5678,那么这个变量的地址就是0x1234 5678,占用0x1234 56780x1234 5679两字节存储空间,其中0x1234 5678是低字节、0x1234 5679是高字节。一个16进制数有两个字节组成,例如:A9。高字节就是指16进制数的前8位(权重高的8位),如上例中的A。低字节就是指16进制数的后8位(权重低的8位),如上例中的9。

创建一个Java程序,在main() 方法中声明这4种类型的变量:

public static void main(String[] args) {
        byte a = 1;
        short b = 10;
        int c = 100;
        long d = 1000;
    }

byteshortintlong 都是整数类型,故可以使用“+”相加,而非字符串之间的连接。

浮点类型

浮点类型是带有小数部分的数据类型,也叫实型。

Java 默认的浮点型为 double。例如,11.11double 型数值。如果要说明一个 float 类型数值,就需要在其后追加字母 f 或 F,如 11.11ffloat 类型的常数。不过对 double 值来说,d(或 D)是否作后缀是可选的。

创建一个Java程序,在main() 方法中声明这2种类型的变量:

public static void main(String[] args) {
        float a = 1.1f;
        double b = 2.3;
        int num = 2;
        float c = (float)(b * num);
    }

一个 double 类型的数据与一个 int 类型的数据相乘后得到的结果类型为 double,但是由于b * num为一个单精度浮点型(float 类型)的数,因此可以将b * num转换为 float 类型的数据。

字符型

Java 语言中的char类型使用两个字节的 Unicode 编码表示,它支持世界上所有语言,可以使用单引号字符或者整数char 型赋值。

一般计算机语言使用 ASCII 编码,用一个字节表示一个字符。ASCII 码是 Unicode 码的一个子集,用 Unicode 表示 ASCII 码时,其高字节为 0,它是其前 255 个字符。

Unicode 字符通常用十六进制表示。例如“\u0000”~“\u00ff”表示 ASCII 码集。(“\u”表示转义字符,它用来表示其后 4 个十六进制数字是 Unicode 码)

创建一个Java程序,在main() 方法中声明这种类型的变量:

public static void main(String[] args) {
        char a = 'A';
        char b = 'B';
        System.out.println("A 的 ASCII 值与 B 的 ASCII 值相加结果为:"+(a+b));
    }

运行结果为:

A 的 ASCII 值与 B 的 ASCII 值相加结果为:131

字母 A 在 ASCII(和 Unicode)中对应的值为 65,字母 B 在 ASCII(和 Unicode)中所对应的值为 66,因此相加后得出的结果为 131。

布尔型

一个 boolean 类型的变量或表达式只能是取 truefalse 这两个值中的一个。

在 Java 语言中,布尔类型的值不能转换成任何数据类型,true 常量不等于 1,而 false 常量也不等于 0。这两个值只能赋给声明为 boolean 类型的变量,或者用于布尔运算表达式中。

创建一个Java程序,在main() 方法中声明这种类型的变量:

public static void main(String[] args) {
        boolean a = false;
    }

引用数据类型

引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。

引用数据类型是由用户自定义,用来限制其他数据的类型。

Java 语言中不支持C++中的指针类型、结构类型、联合类型和枚举类型。

所谓引用数据类型就是对一个对象的引用,对象包括实例和数组两种。实际上,引用类型变量就是一个指针。

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

空引用(null)是 null 类型变量唯一的值。空引用(null)可以转换为任何引用类型。

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

Remark:

空引用(null)只能被转换成引用类型,不能转换成基本类型,因此不要把一个 null 值赋给基本数据类型的变量。

数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它可以分为隐式转换(自动类型转换)和显式转换(强制类型转换)两种。

隐式转换(自动类型转换)

将一种类型的数据赋给另外一种类型变量的时,如果执行自动类型转换(automatic type conversion),需要同时满足以下两个条件:

  • 两种数据类型彼此兼容。如:double 类型兼容int 类型,但是char型不能兼容int
  • 目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)。如:double类型长度为8字节,int 类型为4字节,因此double类型的变量里直接可以存放int类型的数据,但反过来就不可以了。

这种转换称为拓宽转换(widening conversion)。

在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下:

  • 数值型数据的转换:byteshortintlongfloatdouble
  • 字符型转换为整型:charint

最终转换成表达式中表示范围最大的变量的数据类型。

创建一个Java程序,在main() 方法中进行混合运算:

public static void main(String[] args) {
        float a = 1.18f;
        double b = 2.2;
        int num = 6;
        double sum = a * num + b * num;
        System.out.println(sum);
    }

运行结果为:

20.279999923706058

Remark:

char 类型比较特殊,char 自动转换成 intlongfloatdouble,但 byteshort不能自动转换为 char,而且 char 也不能自动转换为 byteshort
byteshort类型的数据和char类型的数据一样,在运算时都会先提升为int类型再进行运算。

显式转换(强制类型转换)

当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。

这种转换称为缩小转换(narrowing conversion)。

转换的语法格式为:

(typeConvertingTo)variableName

创建一个Java程序,在main() 方法中进行显示转换:

public static void main(String[] args) {
        int a = 2;
        double b = 3.1;
        a = (int)b;
        System.out.println(a);
        int c = 2;
        double d = 3.1;
        d = (double)c;
        System.out.println(d);
    }

运行结果为:

3
2.0

所以,在强制类型转换中,如果是将浮点类型的值转换为整数,直接截去小数点后边的所有数字;而如果是整数类型强制转换为浮点类型时,将在小数点后面补零。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lum0s!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值