本篇文章主要让大家理解:
- 变量本质是什么,在开发中有什么用?
- 变量三要素是什么?
- 怎么声明变量?
- 怎么给变量赋值?
- 变量是如何分类的?
- 变量的作用域?
在线观看链接:
https://www.bilibili.com/video/BV1Rx411876f
Java零基础教程视频(适合Java 0基础,Java初学入门)
资料、源码下载:
Java零基础入门视频教程全套免费下载【适合新手初学】 - 动力节点 (bjpowernode.com)
字面量就是数据/数值,例如:1234,true,”abc”,’中’,3.14。在现实生活中每天都会接触到数据,例如:你今天的体重是86Kg,你今天花了500元,买了个西瓜重量是8.6Kg,外面明明是晴天,你却说狂风暴雨,你说的是假话(false),你明明喜欢她,却嘴上说不喜欢,撒谎(false)。软件其实就是为了解决现实生活当中的问题,解决生活当中的问题其实就是处理生活当中的数据,所以一门编程语言首先要能够表示数据,通过字面量就可以表示数据。
在编程语言中数据一般会被分门别类,所以每个数据都是有数据类型的,不同的数据类型会分配不同的内存空间去存储它,数据通常被分为:整数型、浮点型、字符型、布尔型、字符串型等。
需要注意的是,java中规定字符型字面量必须采用半角的单引号括起来,而字符串型字面量必须使用半角双引号括起来。
找出以下代码中哪些是字面量?
public class ConstTest {
public static void main(String[] args) {
System.out.println("小明的体重=" + 86 + "kg");
System.out.println("圆周率=" + 3.1415926);
System.out.println(true);
System.out.println(false);
System.out.println('男');
System.out.println('a');
System.out.println("你的对手在看书!");
System.out.println("你的闺蜜在减肥!");
System.out.println("你的仇人在磨刀!");
System.out.println("隔壁老王在练腰!");
System.out.println("你还不赶紧抓紧时间,还在这愣着干啥呀!!!");
}
}
运行结果如下图所示:
图3-1:字面量
变量是内存当中存储数据最基本的单元,将字面量(数据/数值)放到内存当中,给这块内存空间起一个名字,这就是变量。所以变量就是内存当中的一块空间,这块空间有名字、有类型、有值,这也是变量必须具备的三要素。
例如下图:
图3-2:变量内存抽象图
上图中a、c、pi、sex是4个变量的名字,13、’好’、3.14、true是4个变量中分别存储的数据(字面量),int、char、double、boolean是4个变量分别对应的数据类型。
数据类型在任何一门编程语言当中都很重要,因为程序在运行的过程中会通过不同的数据类型给数据分配不同大小的空间。有的数据类型占用的空间较小,但有的数据类型占用的空间就会很大。
变量要求“变量的数据类型”和变量中存储的“数据(字面量)”必须类型是一致的,换句话说,冰箱是用来存放小食品的,也就是说冰箱只能存放小食品,大象不能往冰箱里放,原因是放不下,空间不合适。例如:int类型就只能存下4个字节大小的整数,再长一点儿放不下,比如long类型的整数占有8个字节,这样的数据肯定是无法放到int类型的变量当中的。
所谓变量:可变化的量。它的意思是变量中存储的数据不是一成不变的,是可以被改变的,假设变量i中之前存储的数据是10,我们可以将10换成100,变量就是这个意思。
声明变量的语法格式为:数据类型 变量名; //例如:int i;
数据类型我们在下一章节会详细讲解,目前我们以“int”类型为例,int表示整数类型(注意:int是关键字,不能随意写,必须全部小写)。变量名只要符合标识符命名规则即可,当然也要见名知意,命名规范中还要求变量名首字母小写,后面每个单词首字母大写。
例如以下代码:
public class VarTest01 {
public static void main(String[] args) {
int age; //年龄
}
}
这个age变量可以访问吗,我们来试一下,请看代码:
public class VarTest01 {
public static void main(String[] args) {
int age;
System.out.println(age);
}
}
编译报错了,请看下图:
图3-3:编译错误提示信息
以上编译错误信息为:可能尚未初始化变量age,这句话的意思是age变量还没有赋值,也就是说变量age中还没有数据,空间还没有开辟出来,可见,java语言中的变量必须先声明,再赋值才能访问。那么java语言中怎么给变量赋值呢?
请看赋值的语法格式:变量名 = 字面量; //字面量就是值
语法中要求“字面量”和“变量的数据类型”一致,不然会出现类型不兼容的错误信息。以上语法当中的“=”是一种运算符,它被称为赋值运算符,赋值运算符右边的表达式优先级较高,也就是说等号右边先执行,将执行结果赋给左边的变量。(注意:java语言中的单等号不是用来判断是否相等的,是为了完成赋值运算。)
接下来我们来修改一下以上错误的代码,让其编译通过并能够运行:
public class VarTest01 {
public static void main(String[] args) {
int age;
age = 20;
System.out.println(age);
}
}
运行的结果是在控制台输出了:20
变量赋值之后可以重新赋值吗?当然可以,要不然怎么能叫变量呢。请看:
public class VarTest01 {
public static void main(String[] args) {
int age;
age = 20;
System.out.println(age);
age = 30;
System.out.println(age);
}
}
重新赋值之后,再次输出到控制台,结果是:30
变量的声明和赋值可以在一行代码上完成吗?可以的,请看代码:
public class VarTest02 {
public static void main(String[] args) {
//声明一个int类型的变量count,赋值15
//声明和赋值一气呵成
int count = 15;
System.out.println(count);
//重新赋值
count = 18;
System.out.println(count);
}
}
在一行上可以同时声明多个变量吗?可以的,请看代码:
public class VarTest03 {
public static void main(String[] args) {
int a, b , c = 300;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
编译出错了,请看下图:
图3-4:编译错误提示信息
根据以上错误提示信息得知,int a , b , c = 300表示声明3个int类型变量,分别起名a,b,c,其中a和b没有赋值,c赋值300。这一点大家需要注意:这行代码并不代表给3个变量全部赋值300哦!要想让以上代码编译通过,在访问变量之前赋上值就行了,可以这样修改:
public class VarTest03 {
public static void main(String[] args) {
int a, b , c = 300;
a = 90;
System.out.println(a);
b = 88;
System.out.println(b);
System.out.println(c);
}
}
在同一个大括号当中,可以声明两个同名的变量吗?不可以的,在同一个大括号当中表示在内存的同一个域当中,在同一块区域上面有两个名字都叫做a的变量,这是不允许的,因为这样程序在运行的时候,java虚拟机也不知道该访问哪个变量了(好比说,你有两个朋友,他们的俩的名字都叫张三,当你们三个人同时在场的时候,你呼张三,其实他俩也不知道你喊谁呢!)。所以,同一个域中变量名不能重名,但是记住:变量是可以重新赋值的。请看以下程序以及编译错误提示信息:
public class VarTest03 {
public static void main(String[] args) {
int a = 10;
int a = 100;
}
}
编译错误提示信息:
图3-5:编译错误提示信息
这一小节的内容需要大家先记住,后面会详细讲解。
变量根据声明的位置不同可以分为:局部变量和成员变量。
在方法体当中声明的变量以及方法的每一个参数变量都是局部变量。
在方法体外,类体内声明的变量称为成员变量,成员变量声明时如果使用static关键字修饰的称为静态成员变量(简称静态变量),如果没有static关键字修饰则称为实例成员变量(简称实例变量),如以下代码:
public class VarTest04 {
//实例变量(成员变量)
int x = 20;
//静态变量(成员变量)
static int y = 200;
//方法:int a,int b都是局部变量
public static void sum(int a, int b){
//局部变量
int firstNum = 100;
}
}
局部变量只在方法体当中有效,方法开始执行的时候局部变量的内存才会被分配,当方法执行结束之后,局部变量的内存就释放了。所以局部变量的生命周期非常短暂。
所谓变量的作用域就是变量的有效范围。通过后面内容的学习大家会更加明白,实际上局部变量、实例变量、静态变量它们存储在Java虚拟机的不同内存区域上,所以变量是有作用域的。
关于变量的有效范围,在这里我给大家总结了一个口诀:出了大括号就不认识了。虽然这句话属于大白话,但很实用。我们来测试一下:
public class VarTest05 {
//后面会学习为什么这里的变量定义为静态变量
static int i = 1000;
public static void main(String[] args) {
System.out.println("k = " + k);
int k = 100;
System.out.println("k = " + k);
int i = 2000;
System.out.println("i = " + i);
}
//后面会学习方法怎么定义
public static void m1(){
System.out.println("k = " + k);
}
public static void m2(){
System.out.println("i = " + i);
}
}
图3-6:变量的作用域
通过以上的测试我们发现:
● 方法体当中的代码是有执行顺序的,遵循自上而下的顺序依次逐行执行,变量在没有声明的时候是不能访问的,需要先声明,接下来才能访问。
● 另外在main方法中声明的变量k有效范围是main方法,只能在main方法中使用,出了大括号就不认识了,在m1方法中是无法访问的。
● 在类体当中声明的变量i作用域是整个类体,所以在m2方法中是可以使用的。
修改以上代码并运行:
public class VarTest05 {
//后面会学习为什么这里的变量这个时候定义为静态变量
static int i = 1000;
public static void main(String[] args) {
//System.out.println("k = " + k);
int k = 100;
System.out.println("k = " + k);
int i = 2000;
System.out.println("i = " + i);
}
//后面会学习方法怎么定义
public static void m1(){
//System.out.println("k = " + k);
}
public static void m2(){
System.out.println("i = " + i);
}
}
图3-7:变量作用域
通过以上程序的运行结果得知,java是遵循就近原则的,在类体当中有i变量,在main方法中声明了i变量,那么在main方法中一定访问离自己最近的变量,也就是就近取材,这就是就近原则,几乎所有的编程语言都是这样的。
视频观看戳
https://www.bilibili.com/video/BV1Rx411876f