Java变量和运算符

已在思维导图中对变量知识框图进行整理!

使用markdown进行详细记录

分以下几点进行介绍:

  1. 变量基本原理
  2. 基本类型和引用类型变量
  3. 变量使用和注意事项
  4. 运算符

1. 变量基本原理

1.1 变量概念

变量表示内存中一块数据存储区域,可以使用变量名访问该存储区域,获取变量值或修改变量值。

变量三要素:数据类型+变量名+值 -----> int a = 10;int数据类型,a变量名,10变量值

变量a指向存储值10的地址,当然,变量a和10都存储在栈上存储区域

1.2 变量注意事项

  • 表示内存中一块存储区域,变量类型不同,占用空间不同,例如数据类型int占4个字节;
  • 该区域有确定的数据类型和变量名;
  • 变量必须先声明,再赋值,然后才能使用,或者一步到位,直接初始化赋值;声明:int a,赋值a = 10,之后才能使用a变量,或者int a = 10,声明和赋值一起,即初始化,才能使用
  • 该存储区域中的数据可以在同一种数据类型的范围变化;int a = 10;a = 20对a的值进行修改,20在int范围之内,所以只要a的值在int范围内,可以随意修改
  • 变量名在同一作用域下不能重复;比如在同一代码块,或者子代码块中,不能重复

2. 基本数据类型和引用数据类型

2.1 基本数据类型

包含:boolean、byte、char、short、int、long、float、double八种

整数类型:byte(1个字节)、char(2个字节)、short(2个字节)、int(4个字节)、long(8个字节)

浮点类型:float(4个字节)、double(8个字节)

布尔类型:boolean(true和false)1个字节

基本数据类型自动和强制转型

向上转型:

byte–>short–>int–>long–>float–>double

char–>int–>long–float–double

char和byte、char和short无自动类型转换

向下转型,即强制类型转换:

由高精度向低精度,由占字节多的向占字节少的转型,需要强制转型。

整型默认使用int类型,浮点数默认使用double类型,如下:

System.out.println(10);//10默认为int型
System.out.println(10.23);//10.23默认为double型
short s1 = 10;//如果赋的是确定的值(常量),判断常量在不在short范围,如果在赋值成功,如果不在,赋值失败
short s2 = s1 + 10;//错误!10默认为int类型,s1和int相加,s1由short自动提升为int类型,两者相加结果为int类型,再赋值给s2时出错,int->short,向下转型,丢失精度,要进行强制转换
short s2 = (short)(s1 + 10);//正确
long l1 = 1024;//1024为int类型,向上转型赋值给long
long l2 = 1024l;//这样表示将long类型值赋值给long 需要加l或Lfloat f1 = 10.23;//10.23在float范围,赋值正确 或者10.23f、10.23F表示float
float f2 = f1 + 3.3;//错误!3.3为double类型,f1+3.3为double类型,赋值给float,错误
float f2 = float(f1 + 3.3);//正确,需要强制类型转换
2.1.1 char字符类型

char字符本身是一个整数,在进行数学计算时,将char字符转换为对应的码表值(Unicode码)进行计算,输出是以字符的形式输出。

编码:

  • ASCII码:1个字符占用1个字节,可以表示英文字母、转义字符、null、+、-、*、/、0-9、>、<、%、$、&、#、空格、换行等,即键盘上大部分键值,可以表示0~127,128个字符,不能表示中文,只能用于美国编程

    char c1 = '0';
    int i1 = c1;//48,48为'0'字符对应的ASCII码值   字符'0',对应码值48
    char c2 = 48;
    System.out.println(c1);//'0'
    System.out.println(c2);//'0'
    //总结:都以字符形式输出,以码值方式计算
    
  • Uincode码:对ASCII码的升级,兼容ASCII的128个字符,1个字母和1个汉字(就是1个字符)都占2个字节,可以表示65536个字符,缺点是1个字母占2个字节,浪费内存空间

  • UTF-8编码:在互联网中使用较多的编码格式,对Unicode改进,根据不同的符号进行变长的编码格式,1~6个字节,1个字母占1个字节,1个汉字占3个字节,兼容ASCII码,javaWeb开发中使用UTF-8

  • gbk编码:1个字母占1个字节,1个汉字占两个字节,windows控制台使用gbk编码

  • gb2312编码

  • big5编码:繁体中文(香港、台湾)

char字符例子

char c1 = 'a';//输出'a'
char c2 = 'a' + 1;//输出'b' 不需要强转是因为'a'和1都是常量,只判断常量在不在char范围内,不判类型
char c3 = (char)(c1 + 1);//必须要强转,因为c1为变量,判断左边和右边类型是否一致,1为int类型,相加时c1提升为int类型,和1相加的结果为int类型,赋值给char时,精度降低,不兼容,需要强制类型转换,可以这样理解,int占四个字节,char占2个字节,4个字节赋值给2个字节是不兼容的。这也说明char本身是整数
//char存入和读取的过程,char c = 'a'
//存入:'a'--->码值97--->二进制0110 0001--->存储
//读取:二进制0110 0001--->码值97--->'a'--->显示
2.1.2 int类型

int类型占4个字节,是java默认的整型类型,byte、short、char和int进行运算时,会自动提升为int类型进行计算。如果int和long、float、double进行计算,会自动提升为相应数据类型。

byte b = 10;
char c = 'a';
short s = 10;
//下面的b、c、s都会提升为int类型进行计算
int sum = b + 10;
sum = c + 10;
sum = s + 10;
long l = sum + 10;//sum提升为long类型 20
float f = sum + 1.1f;//sum提升为float类型  21.1
double d = sum + 1.1;//sum提升为double类型 21.1
2.1.3 long类型

long类型占8个字节,long到float和double会进行自动转型,到int或以下需强制转型

long l = 10;
float f = l + 1.1f;//11.1f
double d = l + 1.1;//11.1
int i = (int)(l + 10);//20 需强制类型转换
2.1.4 float类型

float单精度浮点类型,占4个字节,精度为小数点后6~7位,在小数后需加f或F以表示float类型,计算得到浮点数尽量不要做判断,因为浮点数是小数,是一个近似值,如果是确定的浮点数可以进行判断

float f = 1.1f;
double d = f + 1.1;//2.2
f = (float)(f + 1.1);//2.2f (f + 1.1)为double类型,需要强转成float
//比较
float f1 = 1.1f;
float f2 = 1.1f;
boolean ok = f1 == f2;//true 由于1.1f是明确浮点数,可以判定为相等
float f3 = 8.7f / 3;//2.8999999f,其近似于2.9f
float f4 = 2.9f;
ok = f3 == f4;//false,按照数据计算f3应该为2.9,但是计算器算出来的是2.8999999f,所以小数是一个近似值
//通过数据计算的两个浮点数真要判断相等,应使用两个浮点数差值的绝对值<精度值进行判定
ok = Math.abs(f3 - f4) < 0.000001;//即可判断相等
2.1.5double类型

double双精度浮点类型,占8个字节,精度为小数点后15~16位,java默认的浮点类型,与float一样,不可以判断计算得到的浮点数==。

2.2引用数据类型

引用数据类型:String、数组、类、接口

String s = new String("abc");
int[] arr = new int[3];
Person person = new Person();
Runnable runnable = new Thread();
//以上的s、arr、person、runnable都是引用数据类型,它们的对象都在堆上

3. 变量使用和注意事项

  • 不要进行两个浮点数(计算得到)==比较,使用Math.abs(f3 - f4) < 0.000001;
  • 注意自动类型转换和强制类型转换,由精度高向精度低转换时,需要强制类型转换;
  • 定义float变量时加后缀f或F,定义long变量时后缀加l或L;
  • 基本类型到String类型转换,基本类型+“”;
  • String类型到基本类型转换,使用包装类。Integer.parseInt(“123”);Double.parseDouble(“123”);Long.parseLong(“123”);Float.parseFloat(“123”);

4.运算符

  • 算术运算符:+、-、*、/、%、++、–等;

  • 关系运算符(比较):>、>=、<、<=、==、!=等,结果为表达式 true或false;

  • 逻辑运算符:&、&&、|、||、!、等,!为取反,为true或false,异或,两者不同时为true;

  • 赋值运算符:=、+=、-=、/=、*=、%=、<<=、>>=、&=、^=、!=等,有直接赋值,还有在赋值之前进行相应计算再进行赋值;

  • 位运算符:&、|、^、~、>>、<<、>>>,主要针对二进制进行位运算;

  • 单目运算符:++、–、~、!,操作单个变量

4.1 算术运算符

/:除法

int a = 10 / 3;//结果为3,整数相除结果取商整数部分,接收为int,直接赋值
double b = 10 / 3;//结果为3.0,整数相除结果取商整数部分,接收为double类型,向上转型,为3.0
b = 10.0 / 3;//结果为3.3333333333333335,10.0为double类型,3提升为double类型,相当于浮点数相除,得到结果直接赋值
float c = 10 / 3;//结果3.0,与double一致
c = (float) (10.0 / 3);//结果3.3333333,需要强制类型转换
c = 10.0f / 3;//结果3.3333333,不需要转型,3提升为float类型

%:取余或取模

int a = 10 % 5;//结果0
a = 10 % 3;//结果1
//一般用取模进行一些判断,比如a % 2的结果只有0和1,可以进行奇数和偶数的过滤,a % 3的结果只有0,1和2,可以进行负载均衡的判断

++:加1

//前置++ 先增加再赋值 后置++ 先赋值再增加
int i = 1;
i = ++i;//i的结果为2 过程:先i = i+1=>i = 2,temp = i(2),i = temp(2)
i = i++;//i的结果为2 过程:先temp = i(2),i = i + 1=>i = 3,i = temp(2)
//其实上述例子有些绕
int temp = 0;
int j = 1;
temp = j++;//结果为1 先赋值(将j的值赋给temp),j再增加1,这时j=2
temp = ++j;//结果为3 先增加1(j+1=>3),再将结果赋值给temp

–:减1

与++的用法一样

4.2 关系运算符

关系运算符其实是比较运算符,是一个表达式,结果为true和false,主要用于条件判断

int a = 3;
int b = 4;
boolean ok = a > b;//false
ok = a < b;//true
ok = a >= b;//false
ok = a <= b;//true
ok = a == b;//false
ok = a != b;//true
if (ok) {//逻辑代码........
}

4.3 逻辑运算符

主要连接两个表达式,其结果是true和false

&和&&区别,&&短路判断,如果第一个条件不满足,不判断第二个条件

|和||与上述一样,||如果第一个条件满足,不判断第二个条件

&和|两边条件都会进行判断

//&和&&两个表达式都为真,才为真
boolean ok = 3 > 2 & 5 < 10;//ture
ok = 3 > 2 & 5 < 2;//false
ok = 1 > 2 && 5 < 10;//false,1 > 2不满足,不会进入5 < 10判断
//|和||一个为真就为真
ok = !ok;//true,取反

4.4 赋值运算符

有直接赋值和间接赋值(先进行计算,将计算结果赋值)

int a = 10;//直接赋值
a += 10;//20,先+10,在进行赋值
//间接赋值运算过程有强制类型转换
float f = 10.0f;
f +=  0.0;//等价于f = f + 0.0;0.0为double类型,两者相加为double类型,按理赋值失败,其实底层进行强制类型转换,结果为10.0f
short s = 10;
s += 10;//20,底层将int类型转换为short类型

4.5 位运算

位运算主要是针对二进制进行运算。

二进制:计算机底层是根据二进制进行计算(按二进制补码进行计算和存储),计算机计算的最小单元是位,1byte = 8bit;

二进制:0b00000001 转为十进制为1 由0和1表示;

八进制:0234 转为十进制为156 2乘以8的二次方+3乘以8一次方+4乘以8的0次方 由0~7表示;

十六进制:0x34 转为十进制为52 3乘以16一次方+4乘以160次方 由0~E表示;

二进制到八进制转换:0000 0100从低位开始,每3位转为八进制,100->4,000->0,000->0,结果04;

八进制转换成二进制:0237从高位开始,每1位转为二进制,2->010,3->011,7->111,结果为0b10011111;

二进制到十六进制转换:0000 0100从低位开始,每4位转为十六进制,0100->4,0000->0,结果为0x4;

十六进制转成二进制:0x396从高位开始,每1位转为二进制,3->0011,9->1001,6->0110,结果为

0b1110010110

&按位与运算,两个都为1结果为1;1&1=1,1&0=0 有0则0

|按位或运算,一个为1结果为1;1|0=1,0|1=1,0|0=0,1|1=1 有1则1

按位异或运算:两个相同为0,两个不同为1;11=0,00=0,10=1,0^1=1,0位异或任何数=任何数,1位异或任何数=任何数取反,任何数位异或任何数=0 相同为0,不同为1

~按位取反操作,各二进制位进行取反操作,为单目运算符 按位取反

:>>右移运算符,相当于除以2 0000 0001右移1位 0000 0000

:<<左移运算符,相当于乘以2 0000 0001左移1位 0000 0010

:>>>无符号位右移

计算机中二进制运算都采用补码进行运算(使用二进制补码进行计算,包含加减乘除,按位与,按位或,按位异或,按位取反),主要是针对负数,其实计算机没有减法,都是加法,如果是减一个数,其实是+(负数)。

注意点:

  • 二进制最高位为符号位,正数符号位为0,负数符号位为1
  • java中无无符号数,都是有符号数
  • 正数的原码、反码和补码都一样
  • 负数的反码,符号位不变,其余位置取反
  • 负数的补码,反码+1
  • 0的反码和补码都是0
  • 计算机进行计算时使用的是补码
  • 当我们看运行结果时,要看原码

原码:1000 0110

反码:1111 1001 符号位不变,其余位取反 ,这里的取反和按位取反~不一样,按位取反,全部为都取反

补码:1111 1010 反码+1

/*
比如:2 - 4,计算机:2 + (-4),使用补码进行计算
2是正数,原码、反码和补码一致
-4为负数,计算其补码
-4原码:1000 0100
-4反码:1111 1011 +1  符号位不变,其余位取反
-4补码:1111 11002补码 0000 0010 +
-4补码 1111 1100
结果: 1111 1110 这个结果是补码,要展示结果需要转为原码
补码:1111 1110 -1
反码:1111 1101 符号位不变,其余位取反得到原码
原码:1000 0010 其结果为-2
*/

Java变量和运算符详解相关推荐

  1. java变量和运算符_Java(二)—— 变量和运算符

    java 的循环结构 java 的循环结构 java 的循环结构 1:while 循环 :2:do-while 循环 3:for 循环 ** while 循环 while是最基本的循环,它的结构为: ...

  2. java静态变量重复new_Java非静态成员变量之死循环(详解)

    1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls ...

  3. java环境变量user.home详解

    java环境变量user.home详解 java user.home user.home含义 查看user.home 修改user.home log4j中使用 java user.home 今天梳理项 ...

  4. Java基础以及变量和运算符、包机制、javadoc生成

    Java基础以及变量和运算符.包机制.javadoc生成 注释.标识符.关键字 注释 标识符 关键字 标识符注意点 数据类型 强类型语言 弱类型语言 Java的数据类型 基本类型(primitive ...

  5. java使用变量输出_JAVA定义变量与输出详解

    一些重要知识 一个源文件里只能有一个public类,其它类数量不限.文件名与public类名相同 java程序严格区分大小写 JAVA应用程序的执行入口是main方法固定写法:public stati ...

  6. Java单元测试之JUnit4详解

    2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...

  7. java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...

    java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...

  8. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  9. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java 8引入 ...

最新文章

  1. WINDOWS 2008 脱机文件夹
  2. J2EE从servlet开始
  3. 易语言 服务器抓包,易语言抓包获得地址实现TP路由器登陆的代码
  4. linux shell调用c 程序设计,linux – 在bash -c中设置变量
  5. 基于ansible Role实现批量部署lamp平台
  6. TotalCommander增加回到桌面功能
  7. Linux内存映射实现框架
  8. 单向关联java_java – 使用单向或双向关系的不同行为
  9. Mixly第三方自定义用户库实现
  10. 生物化学,材料化学必备!元素周期表
  11. 基于布隆过滤器实现敏感词识别和过滤 1
  12. ios 权限提示语_uni-app开发经验分享十一: uniapp iOS云打包修改权限提示语
  13. mysql-proxy之奇虎360 Atlas 安装实现mysql读写分离
  14. Mac/Linux/Ubuntu下 视频 显示双语/中英字幕 的方法
  15. WSL1安装rust报错thread ‘main‘ panicked的解决方法
  16. 【物体检测快速入门系列 | 01 】基于Tensorflow2.x Object Detection API构建自定义物体检测器
  17. js输出当前星期几--switch case
  18. java开发电脑配置_新电脑java开发环境配置(自用)
  19. linux pandas教程_十分钟入门 Pandas
  20. 一个简单的判断三角形形状的C程序

热门文章

  1. 斗地主Java课程设计_JAVA面向对象编程课程设计——web版斗地主
  2. 小程序的 wx.createVideoContext 使用
  3. 每个人都活在自己的精神世界中
  4. 什么是IP地址?连接无线网提示“无IP地址分配”该怎么解决?
  5. 2021年全球陀螺测斜仪收入大约6百万美元,预计2028年达到7百万美元
  6. 【shell】转换 秒 为时:分:秒格式
  7. 【ESP 保姆级教程】疯狂传感器篇 —— 案例:ESP8266 + MQ3酒精传感器 + webserver(局域网内曲线变化图)+ 自定义钉钉告警
  8. element UI 组件封装--搜索表单(含插槽和内嵌组件)
  9. 送4G金士顿U盘了,先到先得
  10. Android的自定义view(UI组件)