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. 多层iframe取值问题

    var fid = self.frameElement.getAttribute("id");//获取当前页面的iframe的id值 var fid = ‘workspace’: ...

  2. 去掉BigDecimal类型变量小数点后多余的零

           业务背景:mysql中A表中的B字段的类型是decimal类型,小数位数是三位,某一条数据的值是3000000,在Java中查询出来的结果是3000000.000,这样显示在页面中不太好 ...

  3. Hadoop Aggregate Resource Allocation解释

    1.在hadoop里面运行程序的时候,查看某个任务的具体信息如下: [hadoop@master monitor]$ yarn application -list 如上图,这里面的Aggregate ...

  4. JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

  5. Java 面向对象(八)

    常用类之String String字符串类 什么是字符串?就是把多个字符,串连一起. String字符串的本质 其实是一个char[]数组 /**该值用于字符存储.*/ private final c ...

  6. Qt之模型/视图(委托)

    概念 不同于模型 - 视图 - 控制器模式,模型/视图设计不包括用于管理与用户交互的一个完全独立的组件.一般情况,视图负责将模型数据呈现给用户以及处理用户输入.为了输入更加具有灵活性,则由委托来执行交 ...

  7. go中json的tag使用

    指定json中的key名字: 指定数据类型, string number, boolean 忽略空值(值不为空, 不忽略) 忽略字段 "-" (无论有没有值, 都忽略) type ...

  8. STM32F4 LTDC

    首先配置同步时序先看参考手册 下面看一个实际例子,一块439的开发板 设置: 配置时序 LTDC_InitStruct.LTDC_HorizontalSync = ; /* */ LTDC_InitS ...

  9. linux几种传输方式与拷贝方式的性能分析

    本文记录linux系统中文件传输的多种方式,留作备忘.linux中文件传输的方式有ftp,scp,rsync,rz,sz等,但各个工具的功能又有所区别: FTP : FTP是文件服务器,可实现文件的上 ...

  10. Java 签名(SHA1WithRSA、SHA256WithRSA、SHA256withECDSA)

    RSA1.RSA256 签名 public static String MakeSign(String Data) { try { byte[] data = Data.getBytes(); byt ...