变量
一、对变量的整体认识
首先附上本节知识的思维导图从宏观上掌握变量:
接下来我们逐一梳理-----以 int num = 10; 为例
-
int是类型
-
num是变量名,变量名只能由数字字母下划线构成.但是数字不能开头.
-
变量名命名规则-------见名知意.
-
变量名最好采用驼峰书写;其中类名采用大驼峰命名,即第一个单词首字母大写;对于变量和方法的命名采用小驼峰,即,第一个单词字母小写,后续单词首字母大写.
-
变量最好采用"名词"词性的单词来命名.
-
"="即赋值,换句话说也就是初始化.
-
故此举代码的含义是把10放到num对应的空间中.
-
输出变量num,"+“是java语法,即java中可以使用”+"对字符串 和 数字 进行拼接.其功能类似于C语言中的strcat函数.
-
变量的形态
-
c是存在于方法中的,因此称作局部变量
-
b是存在于类里面的,因此叫做成员变量
-
a前面被static修饰,故叫做静态属性
class Test {
static int a; // 静态属性/类成员变量/类变量
int b; // 属性/成员变量/实例变量
public static void main(String[] args // 局部变量) {
int c; // 局部变量
}
二、整型变量–int
-
在java中,int整型变量占4byte.则可以表示的数的范围为[-231,231],这是因为1byte = 8bit.此处的范围用十进制表示大致为[-21亿,21亿].
-
此处我们介绍一下中文数量级与英文数量级的对应:
- thousand = 1000(千) 2^10 = 1024
- billion = 1000 000; (百万) 2^20 = 1,048,576
- million = 1000 000 000;(十亿)2^30 = 1,073,741,824
我们若要验证此范围,只需要一句代码
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
- Integer 是java标准库中已经实现好的一个类
- Integer 也叫作 int 类的 “包装类”
- '.'是成员访问操作符,相当于 “的”
运行结果如下图所示:
从图中我们可以看出 int 可以表示的数据范围和我们理论推算的一样.
- 因此如果在实际情况中运算结果超出int所表示的最大范围,则会出现数据溢出.以最大范围加一验证一下此理论:
System.out.println(Integer.MAX_VALUE + 1);
运行结果如图所示:
这是为什么呢?
其实在计算机中,数字增大减小的表示范围我们可以用下图来表示:
上图就是 int 表示的数字范围原理.
- int 有正有负,最高位用来表示正负,即:若为0则为正;若为1,则为负.
三、长整型–long
- 如果 int 所表示的数据范围无法满足要求,则需要使用长整型 long 类型来表示
- long所表示数据范围是[-2^63, 2 ^63].
- 在给 long 类型的变量赋值时,要在变量后面加上’L’,不区分大小写.如果不加,当我们需要表示一个非常大的值时,编译器会报错.
如果加上’L’,则会通过编译
四、双精度浮点型–double
-
在java中,整数之间的相除会舍弃小数部分.比如:
-
Java 的浮点数表示遵守IEEE754标准,这就造成很多时候是无法表示精确值的.
例如,输入以下代码,则会和我们日常认为的结果大相径庭
那么,计算机对于 a * b 的运算结果是多少呢?
因此,在代码中不能使用 ‘’==’’ 判断两个浮点数是否相等.而是应该将误差考虑进去.即:两个数的差值在误差允许的范围内即可认为是相等的.请看下面演示代码:
五、单精度浮点型–float
- 表示小数的时候优先使用float
- 需要在变量后面加上’f’
小结
- 10这样的字面值,对应的类型是int.
- 10 L这样的字面值,对应的类型就是long.
- 1.5这样的字面值,对应的类型就是double.
- 1.5f这样的字面值,对应的类型就是float.
六、字符型变量–char
-
Java中的char类型占两个字节,而C语言中,char类型占一个字节
-
C语言中由于ASCII码表的存在,导致字符和整型数值之间可以混用
如果我们使用C语言中的char类型转换大小写在java中使用则会报错!!
-
因此引出了强类型和弱类型的概念,而Java是一门强类型的语言,不太支持隐式类型转换.相反,C是一门弱类型的语言.
-
Java中char类型占两个字节,表示的数值范围为[-32768,32767],其中2^16 = 65535
-
Java也可以表示其他一些字符,如下图所示:
但是若要在javac上编译时,需要加上一个编译选项-encoding
七、字节类型–byte
- byte占一个字节----8个比特位,故其可以表示的空间大小为[-128,127],因此在给此类型变量赋值时不得超过此范围,否则会报错。如下图所示:
- byte是有符号的;Java的内置类型,就没有“无符号”的.
- 网络数据传输中常用byte.
- 尽量不要使用无符号的数据类型,因为无符号的数据在运算的时候可能出现负数,而又因为计算机中负数的最高位是-1,当数据类型将其判断为无符号的时候,就会变成1,这样1就在最高位了,在64位计算机中,最高位1代表十进制2^32.如下图所示:
八、短整型–short
- 占2字节,表示的数据范围为[-32768,32768]
- 不常用,常用int,long
九、布尔类型–boolean
-
只有两个值,即 true(真) 和 false(假).
boolean value1 = true ; boolean value2 = false;
-
和C语言中的真假不同(非0为真,0为假),和整数无关.
这也是Java强类型的体现 -
boolean 类型在JVM的实现中有时候占1个字节,有时候占2个字节
十、字符串类型–String
- String 是 Java 标准库中已经创建好的类
String s = "he he";
- 使用 “+” 进行字符串拼接,类似于C语言中的 strcat.
转义字符
- \n 换行
- \r 回到首行
- \t 水平制表符
- ’ 单引号
- " 双引号
- \ 反斜杠
- 例如:输出一句话: my name is “zhangsan”
十一、变量的作用域
- 一般的编程语言都要求同一作用域中变量名不能重复.
- 局部变量的作用域在当前的代码块({})中生效.
- 成员变量或者静态成员变量,作用域更大一些.
- 若在当前类的内部,则可直接访问;若是在类的外部,得看其他规则的限制(受限于"访问权限控制").
十二、变量的命名规则
硬性指标
- 变量只能包含:数字,字母,下划线.
- 数字不能作为开头.
- 拼音作为变量名很常见.
- 变量名对大小写比较敏感.
软性指标
- 见名知意.
- 使用名词.
- 驼峰命名:多个单词构成的变量,除第一个单词之外,其他单词首字母大写.
十三、字面值和常量
- 10 int 字面值常量,十进制.
- 010 int 字面值常量,八进制.
- 0x10 int 字面值常量,十六进制.
- 10L long 字面值常量,也可以写作 10l.
- 1.0 double 字面值常量,也可以写作 1.0d 或者 1.0D.
- 1.5e2 double 字面值常量,相当于1.5 * 10^2.
- 1.0f float 字面值常量,也可以写作 1.0F.
- true boolen 字面值常量,同样的还有 false.
- ‘a’ char 字面值常量.
- “abc” // String 字面值常量.
final关键字修饰常量
十四、理解类型转换
-
类型转换的场景:使用不同类型的变量相互赋值,或者混合运算.
-
由于Java是强类型的编程语言,所以对类型检查比较严格.
-
强制类型转换可以完成赋值.但是强制类型转换会将代码的正确性的风险转嫁给编程开发人员.
-
反向赋值是可以的
-
再看一个例子
-
int / char和boolean之间的类型转换
-
若进行强制类型转换
-
数据类型转换,表示范围小的可以隐式转换到大的数据范围类型中去.反之则要使用强制类型转换,但是这样会使得数据精度丢失.
十五、理解数值提升
- 如果两个操作数都是比int短的类型,就会先统一都转成int,再进行运算.
- 若要编译通过,则需要强制类型转换
- 对于强制类型转换的快捷键:Alt + 回车,弹出如下所示对话框之后,再按回车.
总结
- 一张完整的思维导图来梳理今天学的知识。