前言:面对“byte b1=3;byteb2=7;byte b=b1+b2;”报错,而“int i1=3;int i2=7;int i=i1+i2;”不报错,进行了深入探究,从而引申出java基本类型之间赋值与运算操作的规律。通过自己制作的图例分析,达到对不同基本数据类型之间的赋值与运算结果的正确判断。不会再出现事实而非的回答,知道运算底层。好了,言归正传。

先送给大家今天我看到的一句话,觉得很有意义

如果你自己都模棱两可的话,不要指望Java虚拟机会明白你的意思。

一、  认识赋值运算符。

赋值使用操作符“=”。它的意思是“取右边的值(即右值),把它复制给左边(即左值)”。右值可以是任何常数、变量或者表达式(只要它能生成一个值就行)。但左值必须是一个明确的,已命名的变量。也就是说,必须有一个物理空间可以存储等号右边的值。

分类 基本数据类型 与 类数据类型 的不同

1、     对基本数据类型的赋值是很简单的。基本数据存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。

2、     但是在为对象“赋值”的时候,情况却放生了变化。对一个对象进行操作,我们真正操作的是对对象的引用。----这种特殊的现象通常称作“别名现象”,是Java操作对象的一种基本方式。

----摘抄自《Thinking In Java》P39

二、  Java中byte、short和char类型运算的细节。

Java中涉及byte、short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果。因此,如果把两个byte类型值相加,最后会得到一个int类型的结果。如果需要得到byte类型结果,必须将这个int类型的结果显式转换为byte类型。

Java虚拟机中没有byte类型!!!

Java虚拟机对基本类型的操作基本都是在栈上完成的(这个是可信的,因为不是我说的)。我们知道,Java在处理一个语句的时候,首先它会先把用到的操作数压到栈中,然后再从栈中弹出进行计算,最后将结果再压回到栈中。任何对byte的操作也会如此。因此,Java对byte类型操作之前会将其压入到栈中。实际上,Java压入栈的不是byte类型,而是一个标准的int类型(32位,byte是8位),也就是说,Java虚拟机将我们短小可爱的byte类型压入栈之前,会先把它拉长成int类型再压栈。不过事实上在压栈之前也是int类型.这样一来,我们不管是在栈里还是从栈里弹出的byte类型实际上都是用int的长度存储的。这也就是我为什么说,Java虚拟机中没有byte类型。因为它们都被变成了int。

----摘抄自网络文章《int与byte的区别》

下面是我做的一些测试

三、  测试一数字值赋值给变量。

格式例如 Xxx  x = 数值;//检验是否正确。

变量\数值

byte

short

int

long

float

double

byte

 

 

X

X

X

short

 

 

X

X

X

int

 

 

X

X

X

long

 

 

X

X

float

 

 

X

double

 

 

说明:例如byte b = 14;14是int类型,能成功,对应表格就打钩。

附带说明:

1、     检测数值是否超出变量范围。

2、     右值是常数

是可以确定,编译器可判断数值大小。

四、  检测二变量赋值给变量。

格式例如 Xxx 变量B=变量A;  //检验是否正确。

变量B\变量A

byte

short

int

long

float

double

byte

X

X

X

X

X

short

X

X

X

X

int

X

X

X

long

X

X

float

X

double

说明:例如

int i = 14;

byte b = i;  //如果通过编译,就在对应的表格打钩。

附带说明:

1、     右值为变量

不确定数值大小,

只能简单判断空间的大小。

根据已知理论,结合两个图片做一些练习:

例1:

byte b = 4;

b = 3+7;

//编译通过,因为“3+7”在编译时直接变为int的“10”,根据表//一,可行。

例2:

byte b1 = 3;

byte b2 = 7;

byte b = b1+b2; //不能通过编译。因为根据原理二,“b1+b2”的//运算操作使其结果为int类型。

//根据表二,int类型的变量不能赋值给byte变量。

例3:

byte b1 = 3;

byte b2 = 7;

int i = b1+b2;  //能通过编译。因为根据原理二,“b1+b2”的运//算操作使其结果为int类型。

//根据表二,int类型的变量能赋值给int变量。

例4:

int i1 = Integer.MAX_VALUE;

int i2 = 2;

int I = i1+i2;  //能通过编译。因为根据原理二,“i1+i2”的运//算操作使其结果为int类型。

//根据表二,int类型的变量能赋值给int变量。

例5:

short s1=1;

s1 = s1+1;   //不能通过编译。因为根据原理二,“s1+1”的运算//操作使其结果为int类型。

//根据表二,int类型的变量不能赋值给short变量。

例6:

short s1=1;

s1 = 1+1;  //能通过编译。因为根据原理二,“1+1”的运算操作//使其结果为int类型。

//根据表一,int类型的数值能赋值给short变量。

例7:

short s1=1;

s1 += 1;

/*

能通过编译。这里“+=”运算符与“+”运算符原理一样,先检查右边,右边不符合对其强转。“s1=1”为一次运算;“s1+=1”为一次运算;“s1=s1+1”为两次运算。所以例题中是将“1”强转为“short”类型参与运算的。

*/

通过例题,获取小结

1、     右边不能判断,就不能赋值、转化。

2、     判断是否可以赋值,查看右边是常数(3,3+7)还是变量(x,x+7,x+y)。

最新文章

  1. PHP 与pdf文档 与条码
  2. jQuery添加options点击事件并传值
  3. 堆heap和栈Stack(百科)
  4. poj: 2262
  5. Android—SDCard数据存取&Environment简介
  6. 基于反射实现自己主动化restful开发
  7. GDI+编程说明及小结
  8. Linux Mono Asp.net 部署方案
  9. Red Gate - SQL Source Control实现对SQL SERVER 的源代码控制
  10. UIButton基础知识
  11. DWR 整合之Hibernate
  12. chrome调试工具高级不完整使用指南(实战一)
  13. SQLServer之修改视图
  14. Linux Hung Task分析
  15. 双重ScrollView,RecyclerView联动实例
  16. linux jpg文件查找木马
  17. CentOS7虚拟机配置ip地址
  18. PB开发境界 多个DW进行update
  19. CABAC总结与补充讨论
  20. bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)

热门文章

  1. vue中类名和组件经过刷新不对应的解决办法
  2. CISP/CISA 每日一题 七
  3. Vue+TypeScript学习
  4. PDF.Js的使用—javascript中前端显示pdf文件
  5. GO语言学习(十三)Go 语言变量作用域
  6. 多线程在python中的使用 thread
  7. WCF REST (一)
  8. CSS笔记 - fgm练习 2-10 - 提示框效果 (清除子元素浮动高度塌陷的影响)
  9. windows下安装emscripten
  10. 为SSO 5.5恢复忘记的administrator@vsphere.local密码