一、变量
1、变量的概念
-
-
- 内存中一个存储区域;
- 该区域的数据可以在同一类型范围内不断变化;
- 变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值;
-
2、变量的作用
作用:用于在内存中保存数据。在 Java 中,变量本质上,就是代表一块内存区域,变量中的数据是存储在 JVM 内存中。
3、使用变量的注意点
-
-
- Java 中每个变量必须先声明,后使用;
- 使用变量名来访问这块区域的数据;
- 变量的作用域:其定义所在的一对 {} 内
- 变量只有在其作用域内才有效;
- 同一个作用域中,不能定义重名的变量;
-
二、变量的声明与赋值
变量定义的格式包括三个要素:数据类型、变量名、数据值
1、声明变量
语法: <数据类型> <变量名称>
例如: int var;
2、变量的赋值
语法: <变量名称> = <值>
例如: var = 10;
3、声明和赋值变量
语法: <数据类型> <变量名> = <初始化值>
例如: int var = 10;
例如:数据类型 变量名称1,变量名称2,变量名称3 = 值,变量名称4,变量名称5 =值2; //多个相同类型的变量声明并赋值
Tips:
(1)如果创建多个变量,那么变量之间的名称不可以重复。(在同一作用域内)
(2)对于 float 和 long 类型来说,字母后缀 F 和 L 不要丢掉。
(3)java 语言是强类型的编程语言,要求数据类型必须和值的类型相同
(4)如果使用byte或者short类型的变量,那么右侧的数据值不能超过左侧类型的范围。
(5)没有进行赋值的变量,不能直接使用;一定要赋值之后,才能使用。
(6)变量使用不能超过作用域的范围。
【作用域】:从定义变量的一行开始,一直到直接所属的大括号结束为止。
(7)可以通过一个语句来创建多个变量,但是一般情况不推荐这么写。
三、变量的分类
1、按照数据类型
对于每一种数据都定义了明确的具体数据类型(强类型语言),在内存中分配了不同大小的内存空间。
类型 | 含义 | 数据举例 |
整数常量 | 所有的整数 | 0,1,578,-6 |
小数常量 | 所有的小数 | 3.14,-0.1 |
字符常量 | 单引号引起来,只能写一个字符,必须有内容 | 'a',' ','中' |
字符串常量 | 双引号引起来,可以写多个字符,也可以不写 | "a","hello","中国" |
布尔常量 | 只有两个值 | true、false |
空常量 | 只有一个值 | null |
2、按声明的位置
变量被定义出来后只是暂存在内存中,等到程序执行到某一个点,该变量会被释放掉,也就是变量的生命周期。
变量的有效方位能够访问该变量的区域,若超出该区域,则在编译的时候出现错误。根据“有效范围”可以分为以下两类:
在方法体外,类体内声明的变量称为成员变量。
在方法体内部声明的变量称为局部变量。
注意:二者在初始化值方面的异同:
相同:都有各自的生命周期;
不同:局部变量除形参外,需要显示初始化;
案例:
a. 成员变量:在类中定义的变量称为成员变量,成员变量在整个类中都有效。成员变量又可分为两种:静态变量和实例变量。
1 class var{
2 int x = 45;
3 static int y = 80;
4 }
x 为实例变量,y 为静态变量(也称类变量)。如果在成员变量的类型前面加上关键字 static 这样的成员变量就称为 静态变量。
静态变量的有效范围可以跨类,甚至可在整个应用程序之内。对于静态变量,除了能在定义它的类中存取,还能直接以 “类名.静态变量” 的方式在其他类内使用。
b. 局部变量:在类的方法体重定义的变量,方法内部定义,在 { } 之间的代码中声明的变量称为局部变量。局部变量只在当前代码块有效。
Tips:局部变量与成员变量同名时,成员变量将被隐藏。即这个成员变量在此方法中暂时失效。
四、常量
在程序执行过程中,值不会发生变化的量,即固定不变的量称为常量,也被称为“final”变量。
常量在整个程序中只能被赋值一次,在为所有的对象共享值时,常量非常有用。
例如:
final double PI = 3.14159; // 声明 double 型的常量PI 并赋值
扩展:final关键字
其中被 final 关键字修饰的变量称为常量,其实常量的值可以进行改变,不能改变的是这个变量指针与此对象的引用关系。
案例1:
当我们使用final修饰一个String变量是,刚开始赋予了值“abc”,然后在赋值"abcd"时,这时会产生一个新的字符串对象并指向它,所以编译不通过。
案例2:
当使用 final 修饰一个 StringBuilder 的变量时,StringBuilder是在原来的对象上面进行操作,不会产生新的对象,所以这时是可以的。
但是当用 str2 重新指向一个新的StringBuilder对象时,这时就会编译不通过。