Java语言基础——数据类型

基本数据类型

前面我们介绍了变量和常量,在介绍过程中我们提到了“数据类型”,现在我们就具体的介绍一下数据类型。
Java中有8种基本的数据类型来存储各种各样的值,如下图所示:
基本数据类型

整数类型

整数类型使用来存储整数数值。

数据类型字节长度取值范围
byte1字节8位-128~127
short2字节16位-32768~32768
int4字节32位-2147483648~2147483647
long8字节64位-9223372036854775808~9223372036854775807

int是Java整型值的默认数据类型,当代码使用整数赋值或输出时,都默认为int,例如:System.out.println(3+2);
long类型的数值要以L或l结尾

会出现的一些问题

  • 问题1:如果long类型的数值没有以L或l结尾,那么这个类型的变量其实是int类型的,一旦这个数值超出了int类型取值范围,那么获取到的值会是一个与你想要的不一致的一个值。举个栗子:
public class Main {
    public static void main(String[] args) {
        long number = 123456789 * 987654321;
        System.out.println( number);
    }
}

上面这段代码中,我们声明了一个long类型的变量number,这个变量用来保存123456789*987654321的值,但给其赋值的时候我们没有以l或L结尾,这样在运行过程中会这么执行:

public class Main {
    public static void main(String[] args) {
        int a = 123456789;
        int b = 987654321;
        int c = a * b;
        long number = c;
        System.out.println(number);
    }
}

最终输出的结果是:-67153019,这明显与我们预期想要的输出结果不一致。
再举个栗子:

public class Main {
    public static void main(String[] args) {
        long number = 21474483647;
        System.out.println(number);
    }
}

上面这段代码中,我们声明了一个long类型的变量,给变量的值超过了int类型的最大值,这时编译器会报错,执行后出现下面这个错误:
在这里插入图片描述

  • 问题2 进制问题
    在Java中整型数据有3中形式:十进制、八进制、十六进制
    十进制:除了0以外其余的数字都不能以0开头
    ·八进制必须以0开头
    十六进制必须以0X或0x开头
    举个栗子:
public class Main {
    public static void main(String[] args) {
        int ten = 11;
        int eight = 011;
        int sixteen = 0x11;
        System.out.println("11的十进制值为:" + ten);
        System.out.println("11的八进制值为:" + eight);
        System.out.println("11的十六进制值为:" + sixteen);
    }
}

浮点类型

所谓的浮点类型数据就是带有小数的数据。在Java语言中浮点类型的数据有float(单精度)和double(双精度)。

数据类型字节长度取值范围
float4字节32位1.4E-45~3.0428235E38
double8字节64位4.9E-324~1.7976931348623157E308

double是Java浮点类型的默认数据类型,浮点类型的数值必须需要以f或F结尾,否则会报错。double类型的是以d或D结尾的,但因为它是默认的浮点类型所以可以不加。下面举个栗子:

public class Main {
    public static void main(String[] args) {
        double a = 5.55;
        float b = 55.55f; 
        /*
        变量c的声明会报错,因为没有以f或F结尾,Java会自动将5.55识别为double类型也就是说会自动进行类型转换。
        将double转换为float
        */
        float c = 5.55;
    }
}

又出现问题了

问题1:我们先看一段代码,猜猜看输出的结果是多少?

public class Main {
    public static void main(String[] args) {
        double a = 4.35 * 100;
        System.out.println(a);
    }
}

435,你是不是猜输出结果是435?435是错误的,虽然4.35 *100 的正确答案是435,但实际输出的结果是434.99999999999994,这很接近435。不信你可以运行看一看。
这是因为浮点类型的值是一个近似值,所以在程序运算后的结果可能与实际有些偏差
解决方案:利用四舍五入获取正确的实际值

public class Main {
    public static void main(String[] args) {
        double a = 4.35 * 100;
        System.out.println(a);
        //Math.round是一个四舍五入的数学函数调用。
        a = Math.round(a);
        System.out.println("a = " + a);
    }
}

问题二:从问题1中我们得出了一个解决浮点值的运算结果与实际值有偏差的问题,但并不能完全解决偏差问题。下面我们再看一段代码:

public class Main {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 10-9.9;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println("a==b的结果 " + (a==b));
    }
}

这次的输出结果是:
![在这里插入图片描述](https://img-blog.csdnimg.cn/201904201542056.png
很明显,四舍五入在这里就不起作用了,因为一旦四舍五入,我们得到的b是0.0而不是0.1,不信你可以试试。
解决方案

public class Main {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 10-9.9;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        /*
        Math.abs()用于取绝对值,1e-6表示1*10-6次是计算机中最小数的概念
        如果两数之差的绝对值小于最小数,则认为两个数是相等的。
        */
        boolean bool = Math.abs(a - b) < (1e-6);
        System.out.println("两数之差绝对值小雨最小数的结果:" + bool);
    }
}

字符类型

char类型

char类型是用于存储单个字符的类型占16位(两个字节)的内存存空间。char类型的值要用英文字符单引号('')引起来
Java语言将cahr类型的值当做整数来对待,字符的值其实就是编码的值,而Unicode编码(点击这查看更多Unicode的信息)采用无符号编码,可以存储65536个字符,所以java几乎可以处理所有国家的语言文字。
需要注意的是

  • char的默认值为空格,也可以用于整数运算
  • 可以使用Unicode表中的序位号来声明一个字符,例如:char ch = 65 ch的值是’A’

转义字符

Java中有些符号是编写代码所需要,所以不能直接赋值给变量或直接打印出来例如:
我们想要让a 的值为一个单引符号,如果直接赋值char a = ''';或者是换行输出会报错,这时我们就需要用到转义字符了
转义字符表

转义字符描述
\'单引符号
\"双引符号
\\反斜杠\
\t制表符tab
\r回车
\n换行
\b退格
\f换页

布尔型(boolean)

布尔型又称逻辑型,只有true和false两个值,代表”真“和”假“,常常用于流程控制的判断条件。

数据类型转换

在一定规则下,数据类型之间是可以进行转换的。类型转换分为隐式转换和显示转换

转换的规则

  • 布尔类型的数据不能参与转换
  • 任意类型的数据可以转换成String类型
  • 只能将低精度的数据转换成高精度的数据,例如double类型的数据如果转换成了float类型的数据,会出现溢出,那么会出现信息丢失,甚至有可能失败。

隐式转换

这种转换方式是由Java自己完成,我们不需要进行任何操作,举个栗子:

public class Main {
    public static void main(String[] args) {
        int a = 5;
        float b = a;
        System.out.println(b);
    }
}

使用int类型变量为float类型变量赋值,此时int类型变量隐式转换为float类型变量,b的值为5。

显示转换

显示转换又称强制转换,显示转换的语法如下:
(类型名) 值
举个栗子:

public class Main {
    public static void main(String[] args) {
        int a =(int)4.5;
        long b = (long)5.5f;
        char c = (char)97.55;
        System.out.println("double类型的4.5强制转换成int类型的值为:" + a);
        System.out.println("float类型的5.5f强制转换成long类型的值为:" + b);
        System.out.println("double类型的97.55强制转换成char类型的值为:" + c);
    }
}

如果将整数复制给byte、short、int、long型变量时,不能超出这些变量类型的取值范围,否则必须进行强制转换。例如 byte a =(byte)129;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值