常量、变量、运算符??这分分钟就能理解!

一、Java中的常量

常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符’a’、浮点数3.2等。在Java中,常量包括整形常量、浮点数常量、布尔常量、字符常量等。

1、整型常量

整型常量是整数类型的数据,有二进制、八进制、十进制和十六进制4种表示形式,具体表示形式如下。

  • 二进制:由数字0和1组成的数字序列。在JDK7.0种允许使用字面值来表示二进制数,前面要以0b或0B,目的是为了和十进制进行区分。
  • 八进制:以0开头并且其后由0~7范围内(包括0和7)的整数组成的数字序列。
  • 十进制:由数字0~9范围内(包括0和9)的整数组成的数字序列。
  • 十六进制:以0x或者0X开头并且其后由0~9、A-F(包括0和9、A和F,字母不区分大小写)组成的数字序列。

2、浮点数常量

浮点数常量就是在数学中用到的小数,分为float单精度浮点数double双精度浮点数两种类型。其中,单精度浮点数后面以F或f结尾,而双精度浮点数以D或d结尾。当然,在使用浮点数时也可以咋结尾处不加任何后缀,此时,虚拟机会默认为double双精度浮点数,浮点数常量还可以通过指数形式来表示。

3、字符常量

字符常量用于表示一个字符,一个字符常量要用一对英文半角格式的单引号 ’ ’ 引起来,它可以使英文字母、数字、标点符号以及由转义序列来表示的特殊字符。
注意:’\u0000’ 表示一个空白字符,即在单引号之间没有任何字符。之所以能这样表示,是因为Java采用的是Unicode字符集,Unicode字符以 \u 开头,空白字符在Unicode码表中对应的值为’\u0000’ 。

4、字符串常量

字符串常量用于表示一串连续的字符,一个字符串常量要用一对英文半角格式的双引号(" ")引起来。一个字符串可以包含一个字符或者多个字符,也可以不包含任何字符,即长度为零。

5、布尔常量

布尔常量即布尔型的两个值 true 和 false ,该常量用于区分一个事物的真与假。

6、null常量

null常量只有一个值null,表示对象的引用为空。


二、Java中的变量

在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元被称为变量定义的标识符就是变量名内存单元中存储的数据就是变量的值

1、变量的数据类型

在Java中,变量的数据类型分为两种,即基本数据类型引用数据类型
在这里插入图片描述
其中,8种基本数据类型是Java语言内嵌的,在任何操作系统种豆具有相同大小和属性,而引用数据类型是在Java程序中由编程人员自己定义的变量类型。

在这里插入图片描述

1、整数类型变量

整数类型变量用来存储整数数值,即没有小数部分的值。在Java中,为了给不同大小范围内的整数合理地分配存储空间,整数类型分为4种不通的类型:字节型(byte)、短整形(short)、整型(int)、长整形(long)。

//整数类型示例
byte num1 = 2;	
short num2 = 4;	
int num3 = 6;	
long num4 = 8L;	

在为一个 long 类型的变量赋值时需要注意,所赋值的后面要加上一个字母 L(或小写 l ),说明赋值为 long 类型。

使用以下代码查看 Java 中的整数类型数据范围:

//整型数据范围
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);

//长整型数据范围
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);

2、浮点数类型变量

浮点数类型变量用来存储小数数值。在Java中,浮点数类型分为两种:单精度浮点数(float)和双精度浮点数(double)。double 型所表示的浮点数比 float 型更精确。

在Java中,一个小数会被默认为 double 类型的值,因此在为一个 float 类型的变量赋值时需注意,所赋值的后面一定要加上字母 F(或者小写 f),而 double 类型的变量赋值时,可以在所赋值的后面加上字母 D(或小写d ),也可以不加。

//浮点数类型示例
float f = 123.4f;
double d1 = 100.1;
double d2 = 199.3d;

//也可以给浮点数类型变量赋予整数数值
float f = 100;
double d = 200;

3、字符类型变量

字符类型变量用于存储一个单一字符,在Java中用 char 表示。Java中,每个 char 类型的字符变量都会占用2个字节

//字符类型示例
char c = 'a';
char ch = 97;	//为一个char类型的变量赋值整数97,相当于赋值字符a

4、布尔类型变量

布尔类型变量用来存储布尔值,在 Java 中用 Boolean 表示,该类型只有两个值,即truefalse

//布尔类型示例
boolean flag = false;
flag = true;

注意事项:

  1. boolean 类型的变量只有两种取值, true 表示真,false 表示假。
  2. Java 的 boolean 类型和 int 不能相互转换,不存在 1 表示 true, 0 表示 false 这样的用法。
  3. boolean 类型有些 JVM 的实现是占 1 个字节,有些是占 1 个比特位,这个没有明确规定。

2、变量的命名规则

硬性指标:

  1. 一个变量名只能包含数字, 字母, 下划线。
  2. 数字不能开头。
  3. 变量名是大小写敏感的。即 num 和 Num 是两个不同的变量。

注意:
虽然语法上也允许使用中文/美元符($)命名变量,但是强烈不推荐这样做。

软性指标:

  1. 变量命名要具有描述性,见名知意。
  2. 变量名不宜使用拼音(但是不绝对)。
  3. 变量名的词性推荐使用名词。
  4. 变量命名推荐小驼峰命名法,当一个变量名由多个单词构成的时候,除了第一个单词之外,其他单词首字母都大写。

小驼峰命名示例:

int maxValue = 100; 
String studentName = "张三"; 

三、变量的类型转换

根据转换方式的不同,数据类型转换可分为两种:自动类型转换强制类型转换

1、自动类型转换

自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。要实现自动类型转换,必须同时满足两个条件,第一是两种数据类型被此兼容,第二是目标类型的取值范围大于源类型的取值范围。例如:

byte b = 3;
int x = b;	//程序把byte类型的变量b转换成了int类型,无需特殊声明

上面的语句中,将 byte 类型的变量b的值赋给int类型的变量x,由于int类型的取值范围大于byte类型的取值范围,编译器在赋值过程中不会造成数据丢失,所以编详器能够自动完成这种转换,在编译时不报告任何错误。

除了上述情况,还有很多类型之间可以进行自动类型转换,接下来就列出3种可以进行自动类型转换的情况,具体如下。

  • 整数类型之间可以实现转换,如 byte 类型的数据可以赋值给 short、int、long 类型的变量,short、char 类型的数据可以赋值给int、long类型的变量,int 类型的数据可以赋值给 long 类型的变量。
  • 整数类型转换为 float 类型,如byle、char、short、int 类型的数据可以赋值给 float 类型的变量。
  • 其他类型转换为 double 类型,如byte、char、short、int、long、float 类型的数据可以赋值给 double类型的变量。

2、强制类型转换

强制类型转换也称为显式类型转换,指的是两种数据类型之间的转换需要进行显式的声明。当两种类型被此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换
需要注意的是,在对变量进行强制类型转换时,会发生取值范围较大的数据类型向取值范围较小的数据类型的转换,如讲一个 int 类型的数转为 byte 类型,这样很容易造成数据精度的丢失

3、类型转换小结

  1. 不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型。
  2. 如果需要把范围大的类型赋值给范围小的,需要强制类型转换,但是可能精度丢失
  3. 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查。

四、理解数值提升

1、int 和 long 混合运算

int a = 10; 
long b = 20; 
int c = a + b; // 编译出错, 提示将 long 转成 int 会丢失精度
long d = a + b; // 编译通过. 

结论:
当 int 和 long 混合运算的时候,int 会提升成 long,得到的结果仍然是 long 类型,需要使用 long 类型的变量来接收结果。如果非要用 int 来接收结果,就需要使用强制类型转换。

2、byte 和 byte 的运算

byte a = 10; 
byte b = 20; 
byte c = a + b; 
System.out.println(c); 
// 编译报错
Test.java:5: 错误: 不兼容的类型:int转换到byte可能会有损失
 byte c = a + b; 
 ^ 

结论:
byte 和 byte 都是相同类型,但是出现编译报错。原因是,虽然 a 和 b 都是 byte,但是计算 a + b 会先将 a 和 b 都提升成 int,再进行计算,得到的结果也是 int,这是赋给 c,就会出现上述错误。

由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short 这种低于4 个字节的类型, 会先提升成 int, 再参与计算.

正确的写法:

byte a = 10; 
byte b = 20; 
byte c = (byte)(a + b); 
System.out.println(c); 

类型提升小结:

  • 不同类型的数据混合运算, 范围小的会提升成范围大的.
  • 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.

3、int 和 String 之间的相互转换

int 转成 String

int num = 10; 
// 方法1 
String str1 = num + ""; 
// 方法2 
String str2 = String.valueOf(num); 

String 转成 int

String str = "100"; 
int num = Integer.parseInt(str);

五、Java中的运算符

运算符用于连接表达式的操作数,并对操作数执行运算。在java语言中,运算符可分为5种类型算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符

根据操作数的不同,运算符又分为单目运算符、双目运算符和三目运算符。单目运算符只有一个操作数,双目运算符有两个操作数,三目运算符则有三个操作数。位运算符涉及到二进制位的运算,在java 程序中运用不是很多,因此下面主要介绍算术运算符、赋值运算符、关系运算符和逻辑运算符。

1、算术运算符

Java中的算术运算符就是用来处理四则远算的符号,这是最简单,最常用的运算符号。
在这里插入图片描述
算术运算符一般用于数值运算,可对操作数进行加减乘除、取余、自增和自减操作。

  • 自增(++):将变量的值加1,分前缀式(++a)和后缀式(a++)。前缀式是先加1再使用;后缀式是先使用再加1。
  • 自减(–):将变量的值减1,分前缀式(–a)和后缀式(a–)。前缀式是先减1再使用;后缀式是先使用再减1。

2、赋值运算符

赋值运算符是双目运算符,用在赋值表达式中。它的作用是将运算符右边操作数的值赋给运算符左边的变量
在这里插入图片描述
赋值运算符分为两类,一类是简单赋值,一类是复合赋值

  • 简单赋值是直接把运算符右边操作数的值赋给运算符左边的变量,运算符有“=”;
  • 复合赋值运算符复合赋值是先执行运算符指定的运算,然后再将运算结果赋值给运算符左边的变量,复合赋值运算符有“+=、-=、*=、/=、%=”。

复合赋值运算符“+=”操作执行过程如下:

  • 将运算符右侧的操作数,与运算符左侧的操作数(变量值)执行相加操作;
  • 相加的结果赋值给运算符左侧的变量。

例如下面语句:

int num = 10;
num += 20;	//num = num + 20;

声明的变量num初始值为10,然后执行num+= 20赋值操作,其操作过程是变量num先与数值20相加,相加的结果是30,然后再将30赋值给变量num,此时变量num的值为30。

3、关系运算符

关系运算符也是双目运算符,用于关系表达式。关系运算符对两个操作数进行比较,并返回比较结果,比较结果的值为一个布尔值(true或false)。下表列出了Java语言支持的关系运算符,表中例子假设A和B不相等,并且其A小于B。
在这里插入图片描述

4、逻辑运算符

逻辑运算符连接两个关系表达式或布尔变量,用于解决多个关系表达式的组合判断问题,返回的运算结果为布尔值。下表列出了Java语言支持的逻辑运算符,表中假设布尔变量A为真,变量B为假。
在这里插入图片描述

5、运算符的优先级

和数学中的运算符一样,Java运算符也存在优先级关系。在Java表达式中,优先级高的运算符先参与运算,优先级低的运算符后参与运算。下表给出了运算符的优先级,表中优先级栏,数字越小优先级越高,每个运算符用中文顿号分割。
在这里插入图片描述
注意:
其实没有必要刻意记忆运算符的优先级。编写程序时,尽量使用括号()实现想要的运算顺序,避免产生歧义。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值