关闭

浅析Java基本数据类型

标签: java数据类型类型转换JVM运算符
835人阅读 评论(2) 收藏 举报
分类:

作为一种强类型语言,Java针对每一种数据都定义了明确的数据类型。大体来讲可分为:基本数据类型和引用数据类型;在此,主要讨论前者,后者以后再继续探究。

Java基本数据类型分为四类八种:

    1: 整数类型       占用字节数
        byte            1
        short           2
        int             4
        long            8

    2:浮点数类型
        float           4
        double          8

    3:字符类型
        char            2

    4:布尔类型
        boolean         1

请注意:

  1. 整数类型默认为int,在内存中占4个字节
  2. 浮点数类型默认为double,在内存中占8个字节
  3. 在声明long类型的数据时,建议添加后缀L
  4. 在声明float类型的数据时,建议添加后缀F
  5. 浮点数中double的精度高于float

不同类型的数据所占字节数也是不一样的,但是它们可以相互转换,请看下图:

这里写图片描述

请注意:

  • 左侧数据类型可自动转换至右侧数据类型,这也称为java数据类型自动转换(提升)
  • 右侧数据类型可强制转换为左侧数据类型;但是在该转换过程中可能造成数据的精度丢失
  • boolean类型数据不可与其他数据类型相互转换

现在我们来通过一些实例,进一步了解Java基本数据类型及其相互转换。

示例一:

public void test0(){
    char c='a';
    int i=9;
    int result=c+i;
    System.out.println(result);
    int int_a=c;
    System.out.println(int_a);
}

先来看字符char类型的数据。字符从本质上来讲是数字;它可以参与算术预算;故也可将char转换成int查看其对应的数值是什么。

示例二:

这里写图片描述

此处,我们想声明一个float类型的变量f用于保存小数123.45,但是IDE报错:

Type mismatch: cannot convert from double to float
不能将double转换为float类型

此处IDE给出了两个修改该错误的建议

第一种建议:将123.45转换为float,即:

float f=(float) 123.45;

这是为什么呢?其实,原因我们刚才已经讲过了:浮点数默认为double类型。所以,此时系统将123.45当做了double类型,故可将其强转为float类型,但是别忘了如此强转可能造成精度丢失

第二种建议:将变量f的类型改为double,即:

double f=123.45;

直接将f声明为double类型,用其来存储123.45是再合适不过的了。

示例三:

这里写图片描述

在该例子中定义了int i=5和byte b=7,再将两者相加赋值给byte类型的result;此时IDE报错:

Type mismatch: cannot convert from int to byte
不能将int类型转换为byte类型

与示例二非常类型,IDE也给出了两个建议,我们可遵循其建议进行修改。

好了,继续看一个例子。

示例四:

这里写图片描述

看到这里,或许就郁闷了:两个byte类型的数据相加再赋值给byte的变量也有错么??居然再次报错:

Type mismatch: cannot convert from int to byte

或许有的人会想:两个byte相加,其结果可能会大于byte的取值范围。这么想没啥错,但这是根本的原因么?继续往下看!

示例五:

这里写图片描述

看到此处,可能没有那么郁闷但是有点麻木了,为啥又报错了呢?

示例六:

这里写图片描述

这些错误的原因到底是什么呢?

JVM在处理byte,char,short的时候会将它们处理成32位长再进一步操作;也就是说JVM会将byte,char,short转换为int类型再继续运算。

关于Java基本数据类型参与+、-、*、/、%运算的时候请注意:

  • 两个操作数中若有一个是double类型的,那么另一个操作数将会被转换成double类型,并且结果也是double类型
  • 两个操作数中若有一个是float类型的,另一个操作数将会被转换成float类型,并且结果也是float类型
  • 两个操作数若有一个是long类型的,另一个操作数将会被转换成long类型,并且结果也是long类型
  • 两个操作数若均为byte、short、int、char中任意一个,那么它们均会被转换成int类型,并且结果也是int类型
  • 以上四点可小结为:整个算术表达式的数据类型自动提升到与表达式中最高等级操作数相同的类型
  • 当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则:运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。

再来看个例子:

public void test7(){
    byte b1=3;
    byte b2=4;
    byte b3=b1+b2;      
    byte b4=3+4;
}

通过之前的讲解我们已经知道了:byte b3=b1+b2;会报错的
但是byte b4=3+4;为什么是对的呢?因为等号的右侧是两个常量相加并不是两个变量相加;就算写byte b4=300;明显超出byte的范围IDE也是不会报错的。变量所表示的值在运行时才会最终确定,而常量所表示的值在编译期间就已经确定了。


最后,附上文中的测试代码:

package cn.com;

/**
 * @Author 原创作者:谷哥的小弟
 * @Blog   博客地址:blog.csdn.net/lfdfhl   
 * @Time   2017年7月13日下午9:45:06
 * @Desc   测试java基本数据类型
 */
public class TestDataType {
    public static void main(String[] args) {
        String arch = System.getProperty("sun.arch.data.model");
        System.out.println(arch);
        TestDataType testDataType=new TestDataType();
        testDataType.test0();
    }

    public void test0(){
        char c='a';
        int i=9;
        int result=c+i;
        System.out.println(result);
        int int_a=c;
        System.out.println(int_a);
    }

    public void test1(){
        float f=123.45F;
    }

    public void test2(){
        int i=5;
        byte b=7;
        int result=i+b;
    }

    public void test3(){
        byte b1=4;
        byte b2=6;
        int b3=b1+b2;               
    }


    public void test4(){
        long l=5;
        double d=6;
        double result=l+d;
    }

    public void test5(){
        int i=9527;
        float f=12.35F;
        float result=i+f;
    }

    public void test6(){
        short s1=3;
        short s2=4;
        short s3=0;
        s3+=s1;
        System.out.println(s3);
    }

    public void test7(){
        byte b1=3;
        byte b2=4;
        int b3=b1+b2;       
        byte b4=3+4;

    }

    public void test8(){
        char c='A';
        int result=c+6;
        System.out.println(result);
    }

}
3
0
查看评论

Java中基本数据类型和包装类

一 java内存分配这里只是在网上找的一些资料; Java 中的数据类型分为 1. 基本类型(原始数据类型) byte short int long float double char boolean 基本类型的变量持有原始值。 2. 符合数据类型(引用类型...
  • u010293702
  • u010293702
  • 2015-03-25 14:52
  • 3267

深入Java基础(一)——基本数据类型及其包装类

这一系列打算慢慢地去接触源码,并且列出相关的题目,对于完全的初学者的话,我到时候会搜一套我认为比较好的培训机构的视频以及给些社区资料和相关博客咯。让我们一起开始思考,深入学习Java吧。这篇文章就数据类型咯-文章结构:1. 基本数据类型的系统描述;2.数据类型的包装类理解(含源码解析);3.数据类型...
  • Jack__Frost
  • Jack__Frost
  • 2016-12-21 22:18
  • 6683

Java的基本数据类型全解(by 星空武哥)

一、Java学习 1、在Java中 Java语言是一种强类型的语言,对各种数据类型都有明确的区分,而计算机使用内存来记忆大量运算时需要使用的数据,而当声明一个变量时,即在内存中划分一块空间存储数据,而变量类型决定划分内存空间的大小。 点击网址支持一下,谢谢! JAVA中分为基本数据类型及引...
  • lsyz0021
  • lsyz0021
  • 2015-07-21 21:44
  • 1017

JAVA - 基本数据类型

Java中的基本
  • zhagener
  • zhagener
  • 2014-11-19 00:39
  • 2183

浅谈Java语言中八种基本数据类型

1.布尔型-----boolean,boolean 类型所占存储空间的大小没有明确指定,其取值为true或false,其默认值为false。 2.字节型----byte,byte 类型所占存储空间大小为1个字节,其取值为-128——127,其默认值为0。 3.整型------in...
  • hs2201056
  • hs2201056
  • 2017-02-28 22:05
  • 1676

java的基本数据类型有哪些java的八大基本数据类型

数据类型 大小 byte(字节)        1(8位)               (bit是比...
  • dianzijinglin
  • dianzijinglin
  • 2016-08-05 10:12
  • 946

[Java] 基本数据类型对常量池的使用

1 常量池是什么.java文件会编译为.class文件,常量池指的是.class文件中一部分,可以理解为.class文件的资源仓库[1]^{[1]}。常量池中主要存放两类常量: 字面量 (Literal) 文本字符串、声明为final的常量值等 符号引用 (Symbolic Reference) ...
  • jitianyu123
  • jitianyu123
  • 2017-06-21 20:08
  • 222

java中的基本数据类型和引用数据类型以及它们的存储方式堆内存和栈内存

java中的基本数据类型和引用数据类型以及它们的存储方式堆内存和栈内存
  • awq520tt1314
  • awq520tt1314
  • 2017-08-12 12:19
  • 379

Java中的8种基本数据类型

Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号...
  • chenbinqq
  • chenbinqq
  • 2016-08-17 15:21
  • 8512

Java 八大基本数据类型

基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。它们是我们编程中使用最频繁的类型。java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化。
  • u014266877
  • u014266877
  • 2017-01-12 09:16
  • 5620
    个人资料
    • 访问:1943537次
    • 积分:27792
    • 等级:
    • 排名:第234名
    • 原创:819篇
    • 转载:0篇
    • 译文:1篇
    • 评论:1296条
    博客专栏
    开发交流


    为方便大家学习和交流Android开发,建了个群,欢迎大家加入。

    QQ群: 183899857(已满)
    QQ群: 250468947(新开)

    文章分类