单枪匹马你别怕,一腔孤勇又如何,这一路你可以哭,但不能怂。 请关注:源码猎人
目录
简介
Java变量分为类变量、实例变量、局部变量。在Java语言中,所有的变量在使用前必须声明。定义变量就是要告诉编译器这个变量的数据类型,这样编译器才知道需要分配多少空间给它,以及它能存放什么样的数据。在程序运行过程中空间的值是变化的,这个内存空间就成为变量。为了便于操作,给这个变量取个名字,称为变量名。
变量名必须遵循标识符命名规则。
标识符命名规则
应以字母、下划线、美元符开头,后跟字母、下划线、美元符或数字,Java标识符大小写敏感,长度无限制
- java中能用作标识符的有:26个英文字母(大、小写),数字,下划线,美元符号$,但是不能以数字开头。
- 类名首个字母必须大写,多个单词组成的,每个单词首字母都要大写。
- 方法名一般首个字母小写(构造方法例外),多个单词组成方法名,后面单词首字母大写。
- 变量命名规则同方法名名。
不能使用java中的关键字做标识符
类变量(静态变量)
- 类变量也称为静态变量,在类中以static关键字声明,但必须在方法构造方法和语句块之外
- 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝
- 静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变
- 静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量
- 静态变量在程序开始时创建,在程序结束时销毁
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型
- 默认值和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化
- 静态变量可以通过:ClassName.VariableName的方式访问
- 类变量被声明为public static final类型时,类变量名称必须使用大写字母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致
实例变量
- 实例变量声明在一个类中,但在方法、构造方法和语句块之外
- 当一个对象被实例化之后,每个实例变量的值就跟着确定
- 实例变量在对象创建的时候创建,在对象被销毁的时候销毁
- 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息
- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见
- 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定
- 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用对象引用访问
局部变量
- 局部变量声明在方法、构造方法或者语句块中
- 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁
- 访问修饰符不能用于局部变量
- 局部变量只在声明它的方法、构造方法或者语句块中可见
- 局部变量是在栈上分配的
- 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用
变量数据类型
在Java中,变量分为两种:基本类型的变量和引用类型的变量。
其中,8种基本数据类型是Java语言内嵌的,在任何操作系统中都具有相同大属性,而引用数据类型是在Jawa程序中由编程人员自己定义的变量类型。
1、变量整数类型
整数类型变量用来存储整数数值,即没有小数部分的值。在Java中,为了给不同大小范围内的整数合理地分配存储空间,整数类型分为4种不同的类型:字节型(byte)、短整型(short),整型(int)和长整型(long)
类型 | 位数 | 范围 | 默认值 |
---|---|---|---|
byte | 8位(有符号) | -2^7 ~ 2^7 - 1 | 0 |
short | 16位(有符号) | -2^15 ~ 2^15 - 1 | 0 |
int | 32位(有符号) | -2^31 ~ 2^31 - 1 | 0 |
long | 64位(有符号) | -2^63 ~ 2^63 - 1 | 0L或0l |
计算机内存的最小存储单元是字节(byte),一个字节就是一个8位二进制数,即8个bit。它的二进制表示范围从00000000~11111111,换算成十进制是0~255,换算成十六进制是00~ff。
2、变量浮点数类型
浮点数类型变量用来存储小数数值。在Java中,浮点数类型分为两种:单精度浮点数( float)和双精度浮点数( double)。 double型所表示的浮点数比 float型更精确,两种浮点数所占存储空间的大小以及取值范围如下图所示。
类型 | 位数 | 范围 | 默认值 |
---|---|---|---|
float | 32位(符合IEEE 754) | 1.4E-45 ~ 3.4028235E38 | 0.0f |
double | 64 位(符合IEEE 754) | 4.9E-324 ~ 1.7976931348623157E308 | .0d |
在Java中,一个小数会被默认为 double类型的值,因此在为一个float类型的变量赋值时需要注意一点,所赋值的后面一定要加上字母F(或者小写f),而为 double类型的变量赋值时,可以在所赋值的后面加上字符D(或小写d),也可以不加。
3、变量布尔类型
boolean类型只有两个值true和false,默认值是 false
boolean与是否为0没有任何关系,但是可以根据想要的逻辑进行转换
4、变量引用类型
引用数据类型非常多,大致包括:类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型,简单来说,所有的非基本数据类型都是引用数据类型
只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址;在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的,而引用数据类型变量,调用方法时作为参数是按引用传递的
基本类型之间的转换
boolean类型与所有其他7种类型都不能进行转换。
在Java中,对于其他7中数值类型,它们之间都可以进行转换,但是可能会存在精度损失或者其他一些变化。转换分为自动转换和强制转换,对于自动转换(隐式)无需任何操作,而强制类型转换需要显式转换,即使用转换操作符(type)。
取值范围从小到大一次排序如下:
byte | short=char | int | long | float | double |
自动转换:
取值范围小的类型向取值范围大的类型转换时可以自动转换。
因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。
int 可以直接赋值给 byte、short、char 等数据类型,而不需要强制转换,只要不超过该类型的表示范围都能自动转换。
在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。
int--> float
long--> float
long--> double
float -->double
除了可能的精度损失外,自动转换不会出现任何运行时异常。
强制类型转换:
取值范围大的类型向取值范围小的类型转换时必须强制转换
强制转换采用转换操作符(type)。严格地说,将byte转为char不属于强制转换,因为从byte到char的过程其实是byte-->int-->char,所以widening和narrowing都有。强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。
在超范围强转时,需要对目标类型范围取余得到结果。
将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。
基本数据类型转换规则:
- boolean类型与所有其他7种类型都不能进行转换
- 整数直接量可以直接赋值给byte、short、char,但不能超取值范围。
- byte、short、char型数据参与运算时,先一律转换为int再运算。
常见面试题
1、int强转byte时需要注意什么?
首先,int强转byte一定是发生在int值超过byte范围,这时需要int%byte取到结果。
例如:
byte number = (byte)257;
257超出了byte的[-128,127]的范围,所以将257除以byte的范围256(-128到127的范围)取余数得到1;
byte number = (byte)200;
需要注意的是,此时除了256取余数应该为-56,而不是200.
其他类型强转也是一样的道理
2、说一说常量和变量的区别?
常量指的是在程序运行期间不变的数据,而变量可以根据程序需要修改值。
常量定义格式为:
final 常量名 = 值
或
static final 数据类型 常量名 = 值
常量名一般全部大写,而变量一般使用驼峰格式。