一、不同类型之间的数据可以互相转换,但是要满足一定的规则

二、数据类型转换规则

  • 转换规则如图所示 
    • 精度高的数据类型就像容量大的杯子,可以放更大的数据
    • 精度低的数据类型就像容量小的杯子,只能放更小的数据
  • 小杯子往大杯子里倒东西,大杯子怎么都放得下
  • 大杯子往小杯子里倒东西,有的时候放的下有的时候就会有溢出
  • 需要注意的一点是: 
    • 虽然short和char都是16位的,长度是一样的 。但是彼此之间,依然需要进行强制转换。

public class HelloWorld {

public static
void main(String[] args) {

char c = 'A';

short s = 80;

//虽然short和char都是16位的,长度是一样的

//但是彼此之间,依然需要进行强制转换

c = (char) s;

//直接进行转换,会出现编译错误

s = c;

}

}

三、低精度想高精度转换

long l = 50;

int i = 50;

l 是long类型的,其类型长度是64位

i 是int类型的,其类型长度是32位

所以l的精度,比i的精度要高

l = i;

把i的值赋给l, 首先l和i彼此的类型是不一样的,那么能否转换就取决于彼此的精度

这个例子,是低精度向高精度转换 是可以正常转换的

换句话说,int比较小,要放进比较大的long,随便怎么样,都放的进去

public class HelloWorld {

public static
void main(String[] args) {

long l = 50;

int i = 50;

//int比较小,要放进比较大的long,随便怎么样,都放的进去

l = i;

}

}

四、高精度向低精度转换

byte b = 5;

int i1 = 10;

int i2 = 300;

b = i1;

b=i2;

b的类型是byte,其长度是8,最大只能放127

i1 的类型是int, 其长度是32,最大,反正就是很大了,超过127

所以, 把int类型的数据转成为byte类型的数据,是有风险的

有的时候是可以转换的,比如 b = i1 【当i1=10时,未超过127】

有的时候不可以转换 比如 b= i2 【当i2=300时,超过了127】 因为放不下了

编译器就会提示错误

这个时候就只能采用强制转换,强制转换的意思就是,转是可以转的,但是不对转换之后的值负责。 风险自担,后果自负

注:

  • int类型的长度是32位,划分了4个位段,1个位段八位
  • byte类型的长度是8位,划分了1个位段,1个位段八位
  • b为byte类型,值为5,二进制的数值为:00000101
  • i1为int类型,值为10,二进制的数值为:00000000 00000000 00000000 00001010
  • i2为int类型,值为300,二进制的数值为: 00000000 00000000 00000001 00101100
  • int类型转换为byte类型的过程中,前3个八位段都会置空。i1强制转换为b时,因为i1的前3个八位段的值都是0,所以没有造成精度损失。所以该行b = (byte) i1;执行后,b的值被赋为i1的值,等于10
  • 而i2强制转换为b时,因为i2的第3个八位段的最后一位有值1,该值在int类型强制转换成byte类型时,随着前三个八位段一起置空损失掉了,造成了精度损失。所以只留下了最后一个位段的00101100,该值为44

public class HelloWorld {

public static
void main(String[] args) {

byte b = 5;

int i1 = 10;

int i2 = 300;

b = (byte) i1;

//因为i1的值是在byte范围之内,所以即便进行强制转换

//最后得到的值,也是10

System.out.println(b);

//因为i2的值是在byte范围之外,所以就会按照byte的长度进行截取

//i2的值是300,其对应的二进制数是 100101100

//按照byte的长度8位进行截取后,其值为 00101100 即44

b =(byte) i2;

System.out.println(b);

//查看一个整数对应的二进制的方法:

System.out.println(Integer.toBinaryString(i2));

}

}

五、练习及答案

题目:

short a = 1;

short b = 2;

那么 a+b 是什么类型?

官方答案:

整型和整型进行运算的时候,如果两边的值都是小于或者等于int的,那么其结果就是int。

public class HelloWorld {

public
void method1(final
int j) {

short a = 1;

short b = 2;

short c = (short) (a+b);

}

}

个人整理答案:

Java知识系统回顾整理01基础03变量04类型转换的更多相关文章

  1. Java知识系统回顾整理01基础03变量03字面值

    一.字面值定义 创建一个Hero对象会用到new关键字,但是给一个基本类型变量赋值却不是用new. 因为基本类型是Java语言里的一种内置的特殊数据类型,并不是某个类的对象.  给基本类型的变量赋值的 ...

  2. Java知识系统回顾整理01基础03变量02基本变量类型

    一.变量类型分类 一个变量的类型,决定了该变量可以包含什么样的值. Java中有八种基本类型,都是Java语言预先定义好的,并且是关键字. 这八种基本类型分别是:  整型 (4种) 字符型 (1种) ...

  3. Java知识系统回顾整理01基础03变量07final关键字

    一.final赋值 final 修饰一个变量,有很多种说法,比如不能改变等等 准确的描述是 当一个变量被final修饰的时候,该变量只有一次赋值的机会 二.在声明的时候赋值 i已经被赋值为5,所以这里 ...

  4. Java知识系统回顾整理01基础03变量06变量的作用域

    一.变量根据所处的位置对应不同的名称 变量处于不同的位置,有不同的名称 名称分别是  字段,属性 参数 局部变量 不同名称的变量,其作用域是不一样的 二.字段,属性,Field 当一个变量被声明在类下 ...

  5. Java知识系统回顾整理01基础03变量05变量命名规则

    一.命名规则 变量命名只能使用字母 .数字. $. _ 变量第一个字符 只能使用: 字母. $. _ 变量第一个字符 不能使用数字 注:_ 是下划线,不是-减号或者-- 破折号 int a= 5; i ...

  6. Java知识系统回顾整理01基础03变量01变量定义

    定义: 变量:用来命名一个数据的标识符 一.什么是变量? 用具体实例定义变量 变量的定义是: 用来命名一个数据的标识符 1949 这是一个数字,代表某年 如果要命名这个数字,在java里就会写成: i ...

  7. Java知识系统回顾整理01基础03变量09块

    一.定义 块:从{ 开始 到对应的} 结束,即一个块 public class HelloWorld { //类对应的块 public static void main(String[] args) ...

  8. Java知识系统回顾整理01基础03变量08表达式

    一.以 ; 结尾的一段代码,即为一个表达式 表达式是由变量.操作符以及方法调用所构成的结构.如下所示: int i = 5; System.out.println(5); 都是表达式 public c ...

  9. Java知识系统回顾整理01基础06数组04增强型for循环

    增强型for循环在遍历一个数组的时候会更加快捷 一.增强型for循环 注:增强型for循环只能用来取值,却不能用来修改数组里的值 public class HelloWorld { public st ...

随机推荐

  1. 加载PHP的配置扩展文件

    一.在PHP的安装目录中去创建一个  php.ini  的配置文件 复制php.ini-development文件,修改成php.ini文件(注意:不要多加一个空格或标点什么的).其中 php.ini ...

  2. DJL 之 Java 玩转多维数组,就像 NumPy 一样

    本文适合有 Java 基础的人群 作者:DJL-Lanking HelloGitHub 推出的<讲解开源项目>系列.有幸邀请到了亚马逊 + Apache 的工程师:Lanking( htt ...

  3. iOS开发知识梳理博文集

    前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...

  4. Linux下Vim常用操作

    linux下Vim的常用操作 linux ​ 首先\(ctrl+Alt+t\)打开小框框 ​ \(./\):相当于手机上的\(home\)键 ​ \(ls\):当前文件夹的东东 ​ \(mkdir\) ...

  5. 【C#】Random类中构造方法、时间种子与随机数序列的关系

    Random类 构造函数 1) Random random = new Random(); // 无参数构造函数使用系统时钟生成其种子值 然而,系统时钟取值范围有限,因此在小规模计算中,可能无法使用不 ...

  6. Android studio Debug 源码

    原来有的地方打不了断点 会提示no executable code at line xxx 源码sdk里有,sdkManager下好对应版本,然后使用对应版本的模拟器debug就行了 如果要debug ...

  7. 算法专题 | 10行代码实现的最短路算法——Bellman-ford与SPFA

    今天是算法数据结构专题的第33篇文章,我们一起来聊聊最短路问题. 最短路问题也属于图论算法之一,解决的是在一张有向图当中点与点之间的最短距离问题.最短路算法有很多,比较常用的有bellman-ford ...

  8. 在CentOs7上yum安装redis

    在开始安装步骤之前,先把我的CentOs和redis版本号列出来: # 系统/软件 版本号 1 CentOS7 CentOS Linux release 7.2.1511 (Core) 2 redis ...

  9. docker 修改容器配置文件

    启动docker镜像命令docker run 可以指定端口映射,但是容器一旦创建就无法在通过命令修改.通常是保存镜像在创建一个新的容器.有没有办法不保存镜像直接修改这个容器呢?答案是有的,本文已mys ...

  10. 阿里云短信服务验证码封装类 - PHP

    本文记录在ThinkPHP6.0中使用阿里云短信验证码,该封装类不仅仅局限于TP,拿来即用 使用该类之前必须引入 flc/dysms 扩展,该封装类就是基于这个扩展写的 composer requir ...