thingking in java 读书感悟

作者 :淮左白衣

写于2018年4月8日17:51:44

关于整数的默认类型,以及会产生的一些小问题

在java中,整数 默认是 int 类型,小数 默认是 double 类型 ;因此,在一些地方会造成一些错误;

  • 比如下面的代码。在编译的时候,是报错的:
 long num = 99999999999999;  // error

原因:因为整数默认是int类型,但是 99999999999999 明显的超出了 int 的取值范围;因此,这里就会报错,我们需要在整数后面加上一个 L ,告诉编译器,这是一个 long 类型数字 ;

long num = 99999999999999L;  // ok
  • 下面的代码,我们思考下原因:
        byte a = 127 ;       // ok
byte b = -128 ; // ok
byte c = a + b ; // error byte d = 3 + 5 ; // ok
byte e = 125 + 5 ; // error byte f = (byte) (127 + 5); // ok
System.out.println(f); // output : -124 byte g = 8 ;
g = g + 10 ; //error
g += 10 ; // ok

你可能会有一些疑问:

  1. byte a = 127 ; // 为什么代表 int 类型的整数,可以直接赋值给 byte

    byte的取值范围: -128 ~ 127 ;我们一般向下转型的时候,会产生丢失进度的问题,但是,当我们使用明明确确的 整形常量: -128~127 ;将它们赋值给byte的时候,是不错产生这样的错误的,因为,它们的确是byte的取值范围 ;编译器,是认识常量值的,知道它们的值是 byte 的合法取值范围 ;因此,java允许这样的赋值 ;

  2. byte c = a + b ; // error

    为什么,这里又错了呢?因为 a 和 b 都是 变量。编译器虽然可以确定 a 和 b 两个变量的值,都是byte的取值范围,但是由于他们是变量,变量相加的值,编译器在编译器期间是无从得知的,也就是说,到底会不会超过byte的取值范围,编译器是不确定的 ;因此,报错 ;

  3. byte d = 3 + 5 ; // ok

    byte e = 125 + 5 ; // error

    3 + 5 OK 的原因是:编译器是认识常量值的,知道 3 + 5 = 8 ;还没有超过byte的取值范围 ;同样的道理,编译器发现了 125 + 5 = 130 ;超过了byte的取值范围了,因此,报错 ;

  4. byte f = (byte) (127 + 5); // ok

    System.out.println(f); // output : -124

    输出为什么是 -124 ;我们可以把byte的取值范围想象成一个表盘表盘的正上方是 0 ;表盘的正下方是 - 128 和 127 ;对 byte 进行加减操作的时候,类似于在表盘上移动 ;当127 + 5 的时候,就移动到了 -124 的位置了 ;

  5. byte g = 8 ;

    g = g + 10 ; //error

    g += 10 ; // ok

    首先 g = g + 10 ;错误的原因,跟第二条是一样的,由于 g 是个变量,编译器无法得知它和10相加完的具体值 ,是否产生溢出,因此报错;

    大家可能都听别人说 g = g + 10 ; 与 g += 10 ; 是等价的 ;;其实 它们不是完全等价的, += 操作符,会默认帮我们进行强转 ;这也解释了 g += 10 ; 是正确的原因 ;底层有个自动强转在里面 ;


涉及基本数据类型的重载

    public void aha(char b){}
public void aha(byte b){}
public void aha(short b){}
public void aha(int b){}
public void aha(long b){}
public void aha(float b){}
public void aha(double b){}

当我们想要调用 aha( ) 方法的时候,编译器会根据参数进行选择调用哪一个方法;

但是当没有参数,与我们传入的参数匹配的时候,编译器会将我们传进去的参数进行向上提升

一般都是向上一个类型一个类型的提升,比如byte,先提升到short ,没有合适的,再提升到int 等等,以此类推 ;

其中char,有点特殊;如果没有匹配的话,则直接提升到 int类型

这里需要注意,long 会被 提升为 float因为,float 的取值范围是大于 long 的 ; 至于原因,可查看我的另一篇博客:floa取值范围为什么比 long取值范围

java中整数的默认为int类型的一些问题的更多相关文章

  1. Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题

    在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...

  2. Java中List、integer[]、int[]之间的转化

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...

  3. java中整数类型(short int long)的存储方式

    在java中的整数类型有四种,分别是 byte  short int long 其中byte只有一个字节 0或1,在此不详细讲解. 其他的三种类型如下: 1.基本类型:short 二进制位数:16包装 ...

  4. 谈谈Java中整数类型(short int long)的存储方式

    在java中的整数类型有四种,分别是byte short in long,本文重点给大家介绍java中的整数类型(short int long),由于byte只是一个字节0或1,在此就不多说了,对ja ...

  5. 解决DataTable中的DataColumn类型默认为int类型时, 导致不能修改其列值为其他类型的解决办法

    问题起因: 扔给数据库一条select * from [表名] , 得到一个DataTable, 发现有一列status状态的DataColumn的类型是int,然后我想换成字典表里的文字描述,然后就 ...

  6. Java中的BigDecimal类和int和Integer总结

    前言 我们都知道浮点型变量在进行计算的时候会出现丢失精度的问题.如下一段代码: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0. ...

  7. Java中基本数据类型和包装器类型的关系

    在程序设计中经常用到一系列的数据类型,在Java中也一样包含八中数据类型,这八种数据类型又各自对应一种包装器类型.如下表: 基本类型 包装器类型 boolean Boolean char Charac ...

  8. java中如何使用BigDecimal使得Double类型保留两位有效数字

    一.场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常. 如果要再此基础上计算,就会发生异常. 比如:读出数据为0.0092,将其乘以100,则变成了0.9 ...

  9. Java中的long类型和Long类型比较大小

    Java中我们经常要做一些判断,而对于判断的话,用的最多的便是“>”.“==”.“<”的比较,这里我们进行一个Long类型数据和long类型数据的比较大小的讲解. Java中Long和lo ...

随机推荐

  1. word 实现多级列表编号

  2. mysql的存储引擎与锁

    一.背景知识 1.锁是计算机协调多个进程或线程并发访问某一资源的机制. A.锁分类. | 共享锁(读锁):在锁定期间,多个用户可以读取同一个资源,读取过程中数据不会发生变化. | 排他锁(写锁):在锁 ...

  3. zabbix(10)自动发现规则(low level discovery)

    1.概念 在配置Iterms的过程中,有时候需要对类似的Iterms进行添加,这些Iterms具有共同的特征,表现为某些特定的参数是变量,而其他设置都是一样的,例如:一个程序有多个端口,而需要对端口配 ...

  4. Java实现通过IP获取域名,通过域名获取IP

    一.通过Linux命令实现 ping www.baidu.com nslookup www.baidu.com nslookup 14.215.177.166 为什么这个命令会有一个192.168.1 ...

  5. HttpClient学习(四)—— 关于Http

    一.Http状态码 状态码分类 100 ~ 199 信息提示 200 ~ 299 成功 300 ~ 399 重定向 400 ~ 499 客户端错误 500 ~ 599 服务端错误 常见状态码 200 ...

  6. nodejs配置QQ企业邮箱

    安装模块 npm install -g nodemailer npm install -g nodemailer-smtp-transport 代码示例 var nodemailer = requir ...

  7. Linux 系统配置IPv6

    1.自动获取IPV6地址 1)修改/etc/sysconfig/network文件,修改如下字段,不存在则手动添加,部分系统默认是开启的NETWORKING_IPV6=yes 2)修改/etc/sys ...

  8. Python 自学笔记(八)

    import math def A(a,b): print("第一个参数的值为"+str(a)) print("第一个参数的值为"+str(b)) a = 1 ...

  9. vue+Typescript初级入门

    Typescript 在前端圈已经逐渐普及,Vue 2.5.0 改进了类型声明,使得对 TypeScript 更加友好 不过要想在项目中直接使用 TypeScript 仍然需要对项目进行一些改造 PS ...

  10. 机器学习 - 算法 - SVM 支持向量机

    SVM 原理引入 支持向量机( SVM,Support Vector Machine ) 背景 2012年前较为火热, 但是在12年后被神经网络逼宫, 由于应用场景以及应用算法的不同, SVM还是需要 ...