Java码农人生使用手册——数据类型与变量

一、数据类型

1、基本数据类型

        四类(整型、浮点型、字符型、布尔型),八种(byte、short、int、long、float、double、char、boolean)。

 

基本类型默认值表
类型byteshortintlongfloatdoublecharboolean
默认值00000.0f0/u0000FALSE

注意:

  • 不管是16位还是32位的系统,int都占四个字节,long都占八个字节。(Java的跨平台性)
  • 整型和浮点型都是带符号的,最高位为符号位,0为正数,1为负数。
  • 整型默认为int型,浮点型默认为double型。

2、引用数据类型

         三种:类、接口、数组。

2.1类(class)引用

        object:所有类的父类,所有对象(包括数组)都实现了这个类的方法。

        String:字符串。

        此外还有基本数据类型对应的包装类:Byte、Short、Integer、Long、Float、Double、Character、Boolean。

2.2接口(interface)引用

        常用的Map、Set、Lest……

2.3数组引用

        数组:存储在一个连续的内存块中的相同数据类型(引用数据类型)的元素集合。

        注意:数组是定长的。无论,以哪种方式初始化数组,一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化。

2.4默认初始值

        引用数据类型的默认值是null。

二、变量

        语法格式:数据类型 变量名 = 初始值;

1、基本数据变量

1.1整型变量

  • 定义时可以没有初始值,但是在使用前必须设置初值,如果没有合适的初始值,可以设置为0;
  • 无论在什么系统下字节型bite都是一个字节,短整型short都是两个字节,整形都是四个字节,长整型都是八个字节;
  • 变量赋初始值超过其表示范围的,编译器会自动报错;
  • 在Java中整型除以整型还是整型(小数部分直接舍弃); 
  • 长整型的初始值后面加L,如:long a = 100L;
  • 对于byte short 这种小于4个字节的整型变量,赋值的字面值没有超过其最大表示范围时,不会被解析为整型。

1.2浮点型变量

  • 无论在什么系统下单精度浮点型float都是四个字节,双精度浮点型double都是八个字节;
  • 浮点数与整数在内存中的存储方式不同,不能单纯使用 的形式来计算;
  • 上用到浮点数都优先考虑 double, 不太推荐使用 float;
  • 单精度浮点型的初始值后边要加f或F,否则会报错,因为浮点数默认为double。

        浮点数存储原理(以四个字节大小的float为例):

        例如浮点数3.25,转化为二进制为11.01,再用科学计数法表示为1.101^10(这里所有的数字都是二进制的),就这样,1.101被存放在尾数位,10被存放在指数位符号位为0。因为二进制科学记数法的尾数都是以1开头,因此尾数开头的1省去不记。即 23 位的尾数位可存储 24 位尾数。

        有的浮点数的二进制是无限的,但是计算机存储浮点数的位数是固定的。计算机只能表示它能表示的部分,因此浮点数有时候会出现精度丢失的问题。

1.3字符型变量

  • Java 中使用 单引号+ 单个字母 的形式表示字符字面值;
  • 计算机中的字符本质上是一个整数,可以存放整形,Java 中使用 Unicode 表示字符,因此一个字符占两个字节。

1.4布尔型变量

  • boolean 类型的变量只有两种取值, true 表示真, false 表示假;
  • Java boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法;
  • Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在《Java虚拟机规范》给出了单个boolean占4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。
  • 补充:因为在虚拟机规范中说了,boolean值在编译之后都使用Java虚拟机中的int数据类型来代替,而int是4个字节,那么boolean值就是4个字节。boolean类型数组的访问与修改共用byte类型数组的baload和 bastore指令,因为两者共用,只有两者字节一样才能通用呀,所以byte数组中一个byte是1个字节,那么boolean数组中boolean是1个字节。总结:boolean在数组情况下为1个字节,单个boolean为4个字节。

1.5类型转换

        Java作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验。当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和强制类型转换(显式)

1.5.1自动类型转换(隐式)
代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。
特点:数据范围小的转为数 据范围大的时会自动进行。
1.5.2强制类型转换(显式)
当进行操作时,代码需要经过一定的格式处理,不能自动完成。
特点:数据范围大的到数据范围小的。

例如:

int a = 10;
long b = 100L;
a = (int)b;

注意:

  • 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型;
  • 如果需要把范围大的类型赋值给范围小的 , 需要强制类型转换 , 但是 可能丢失数据;
  • 将一个字面值常量进行赋值的时候 , Java 会自动针对数字范围进行检查
  • 强制类型转换不一定能成功,不相干的类型不能互相转换

1.6类型提升

        不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
        对于 short,byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int,再运算。如下图所示,byte byte 都是相同类型 ,, 但是出现编译报错。原因是,虽然a和b都是byte,但是a+b时会先将a和b提升为int再进行计算,这时得到的结果也是int,于是就会初夏这样的错误。

        正确的写法因该是:

byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);

2、引用数据类型

        对应内存存储的值是一个引用,是对象的存储地址。对象的引用在栈中,实际对象存储在堆中。

        null Java 中表示 "空引用" ,也就是一个不指向对象的引用。null的作用类似于C语言中的空指针,都是表示一个无效的内存位置。因此不能对这个位置做任何的读写操作,否则就会抛出空指针异常:NullPointerException。

        注意:Java中没有约定null和0号地址的内存有任何联系。

3、基本类型变量与引用类型变量之间的区别    

        基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

三、问答

1.变量为什么能点出方法?

答:点出来的方法是变量类型所包含的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值