【Java基础】数据类型及类型转换

本文详细介绍了Java中的数据类型(基本数据类型如整数、浮点、字符,以及引用类型),包括它们的存储机制、范围和转换规则。重点讲解了强类型语言中的类型转换,以及需要注意的内存溢出和精度问题。
摘要由CSDN通过智能技术生成

数据类型

  • 数据类型决定了变量占据多大的内存
  • 强类型语言: 要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
  • 弱类型语言: 与强类型语言相反

两大数据类型

基本数据类型(primitive type)
  • 数值类型

    • 整数类型(整数默认是int型的)

      • byte(字节型) 占1个字节

        • 范围:-128~127 (-27~27-1)
        • byte的范围为什么是-128~127 ?在这里插入图片描述
      • short(短整型) 占2个字节

        • 范围:-32768~32767( -215 ~ 215-1 )
      • int(整型) 占4个字节 默认值为0

        • 范围:-2147483648~2147483647 ( -231 ~ 231-1 )
      • long(长整型) 占8个字节

        • 范围:-263 ~ 263-1
    • 浮点类型(小数默认是double型的)

      • float(单精度浮点型) 占4个字节,有7~8位有效数字
      • double(双精度浮点型) 占8个字节,有15~16位有效数字
    • char(字符类型) :占2个字节

      • 范围:-32768~32767( -215 ~ 215-1 )

      • 默认值:’u0000‘

      • 每个字符都有其编码(数值)

      • 编码:ASCII ISO8859-1 GBK UTF-8(3个字节)
        在这里插入图片描述

  • boolean(布尔型):占一位,其值只有true和false两个 默认值为false

public class Demo{
    public static void main(String[] args){
        //八大基本数据类型:
        //整数
        int num1 = 10;
        byte num2 = 20;
        short num3 = 30;
        long num4 = 40;
        //小数:浮点数
        float num5 = 50.1f;//小数默认是double型的,需要在小数结尾加‘f'
        double num6 = 3.141592653589793238462643;
        //字符
        char name = '中';
        char c2=65;//因为编码,输出为a
        int num='a';//输出为65
        /*字符串:String不是关键字,是类
        String nameA = "Shania";*/
        //布尔值:是非
        boolean flag1 = true;
        boolean flag2 = false;
    }
}
引用类型(reference type)
  • 接口
  • 数组
对比
  • 基本数据类型的变量:
    1.存储的是数据本身
    2.作为参数,传递的是数值

  • 引用数据类型的变量:
    1.存储的是在堆中开辟内存的数据的首地址
    2.作为参数传递的是数值(地址值)

数据类型转换

  • 由于Java是强类型语言,所以要进行混合运算的时候,需要用到类型转换。

    由低到高:

    byte, short, char < int < long < float < double

    浮点数数值范围比整数的数值范围大

  • 运算中,不同类型的数据先转化为同一类型,然后进行运算。

  • 字符串和任何类型的数据相连接都被转为字符串

    // +号:数值相加or字符串连接
    int a = 66;
    int b = 5;
    System.out.println("hehe" + a + b);//hehe665
    System.out.println(a + b + "ok");//71ok
    
强制数据类型转换
  • (类型)变量名

  • 高→低

byte x=66; // 默认是int类型,没有溢出,内部自动进行从高到低的类型转换 00000000 00000000 00000000 01000010=====>去掉前三个字节01000010
byte y=200; // 内存溢出
byte y=(byte)200; // 强制类型转换 去掉前三个字节为11001000,高位为1是负数,按位取反00110111,再加一,为00111000, 输出结果为y=-56
byte b = (byte)128; // 内存溢出,需要强制类型转换 输出结果为b=-128
byte a = 127;
a = a + 10; // a+10 10为整型,a自动类型转换为整型,相加后赋值给byte型的a,报错,需要强制类型转换
a=(byte)(a + 10); // 输出结果为a=-119
自动数据类型转换
  • 低→高
  • 有些从高级别到低级别的情况会自动转换
class Demo6 
{
	public static void main(String[] args) 
	{
		int a = 55;
		float b = 6.6f;
		long c = 77l;
		double d = 99;
		int num = 'a';//低级别自动转为高级别 输出为97
		double sum = a + b + c + d;
		System.out.println("Hello World!");
	}
}
  • 注意点:

    1. 不能对布尔值进行转换;

    2. 不能把对象类型转换为不相干的类型;

    3. 在把高容量转换到低容量的时候,强制转换;

    4. 转换的时候可能存在内存溢出,或者精度问题:

    操作比较大的数时,要注意溢出问题!!!

    public class TypeConversion2 {
        public static void main(String[] args) {
            // 操作比较大的数时,注意溢出问题
            // JDK 7新特性,数字之间可以用下划线分割
            int money = 10_0000_0000;
            // long money = 10_0000_0000;
            // long money = 10_0000_0000L;
            //由于末尾的小写l容易误认,最好用大写L
            int years = 20;
            int total = money * years; // 计算时会溢出
            long total2 = money * years; // money * years默认是int,转换前已将存在问题了
            long total3 = money * ((long) years); // 先把一个数转换为long
            System.out.println(total);
            System.out.println(total2);
            System.out.println(total3);
        }
    }
    
  • 34
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值