Java零基础如何快速入门|变量

本文章主要内容:

  • 字面量

  • 变量概述

  • 使用变量

  • 变量分类

  • 变量作用域

  • 难点疑惑

学习目标:

  • 理解变量本质是什么,在开发中有什么用?

  • 变量三要素是什么?

  • 怎么声明变量?

  • 怎么给变量赋值?

  • 变量是如何分类的?

  • 变量的作用域?

知识框架

字面量

字面量就是数据/数值,例如:1234,true,”abc”,‟中‟,3.14。在现实生活中每天都会接 触到数据,例如:你今天的体重是 86Kg,你今天花了 500 元,买了个西瓜重量是 8.6Kg,外面明明是晴天,你却说狂风暴雨,你说的是假话(false),你明明喜欢她,却嘴上说不喜欢, 撒谎(false)。

软件其实就是为了解决现实生活当中的问题,解决生活当中的问题其实就是处理生活当中的数据,一门编程语言首先要能够表示数据才可以处理数据,所以 Java 程序通过字面量来表示数据。

在编程语言中数据一般会被分门别类,所以每个数据都是有数据类型的,不同的数据类型会分配不同大小的内存空间去存储它。

数据被分为:整数型、浮点型、字符型、布尔型、字符串型等。

  • 整数型(数字):1、2、100、-2

  • 浮点型(数字,带小数):1.0、2.0、3.14

  • 字符型(文字,单个字符):‟a‟、‟中‟

  • 布尔型(真假):true、false

  • 字符串型(文字,多个字符)

需要注意的是,java 中规定字符型字面量必须采用半角的单引号括起来,而字符串型字面量必须使用半角双引号括起来。这是一个语法规定,不然编译器就报错了。

接下来,我们一起来找出以下代码中哪些是字面量吧?

通过以上的代码我们可以看到这些数据,或者说可以看到这些字面量:

  • “小明的体重=”:字符串型字面量

  • 86:整数型字面量

  • “kg”:字符串型字面量

  • “圆周率=”:字符串型字面量

  • 3.1415926:浮点型字面量

  • true、false:都是布尔型字面量,表示真和假

  • ‘男’、 ‘a’:都是字符型字面量

“你的对手在看书!”、“你的闺蜜在减肥!”、“你的仇人在磨刀!”、"隔壁老王在练腰! "、“你还不赶紧抓紧时间,还在这愣着干啥呀!!!”:这些都是字符串型字面量

以上程序的运行结果如下图所示:

接下来,我们再看一段代码,找出以下程序中字面量属于哪种类型,请看代码:

通过代码我们可以看到这些字面量:‘9’、9、“100”、100、“3.1415926”、3.1415926、“true”、true,其中:

  • '9’由于带有单引号则属于字符型字面量

  • 9 属于整数型字面量

  • "100"由于带有双引号则属于字符串型字面量

  • 100 属于整数型字面量

  • "3.1415926"由于带有双引号则属于字符串型字面量

  • 3.1415926 属于浮点型字面量

  • "true"带有双引号则属于字符串型字面量

  • true 属于布尔型字面量

接下来,再看一段代码,分析以下程序存在什么问题?

以上程序的编译结果如下图所示:

以上程序为什么会编译报错呢,因为在程序中abc 不是一个合法的字面量,abc 不是数字, 也不是布尔型,那我们只能将其看做字符串型,但Java中规定字符串型字面量必须使用双引号括起来,这里没有,所以程序是不符合语法规则的。故编译报错。

接下来,我们再一起来看一段程序,请看以下代码:

我们对以上的程序进行编译,编译结果请看下图:

通过上图我们可以看到编译报错了,错误信息的第一条是:未结束的字符文字,这是为什么呢,因为在java 语言中字符型只能是单个字符,多个字符则是字符串,应该使用双引号括起来。以上程序中编译器检测到‟ab‟之后,发现以单引号开始,会认为后面是一个字符,于是去a 后面找另一半单引号,结果未找到结束的单引号(因为结束的单引号在 b 后面),所以编译器报错了,并且错误信息是“未结束的字符文字”。

  • 通过本小节的学习,大家需要理解的是:什么是字面量。能够知道字面量就是数据,我们 软件处理的就是数据,不同类型的数据在程序中有不同的编写方式,例如:字符型字面量必须 是单个字符,并且使用半角的单引号括起来。字符串型字面量必须是使用半角的双引号括起来。布尔类型字面量只有两个值,写法是true 和false,true 表示真,false 表示假。而浮点型字面量则带有小数点。

变量概述

变量是内存当中存储数据最基本的单元,将数据(字面量)放到内存当中,给这块内存空

间起一个名字,这就是变量。所以变量就是内存当中的一块空间,这块空间有名字、有类型、有值,这也是变量必须具备的三要素。变量在内存中的抽象图形可以参考下图:

在上图当中每一个抽象的椭圆就代表一个变量,其中 a、c、pi、sex 是4 个变量的名字(变量名只要是合法的标识符即可),13、‟好‟、3.14、true 是 4 个变量中分别存储的数据(字面量),int、char、double、boolean 是 4 个变量分别对应的数据类型(int、char、double、boolean 等都是java 的关键字,声明变量时用来指定变量的数据类型)。

  • 数据类型在任何一门编程语言当中都很重要,因为程序在运行的过程中会通过不同的数据类型给数据分配不同大小的空间。有的数据类型占用的空间较小,但有的数据类型占用的空间就会很大。这也是符合现实的,在现实生活中有些数据较大,有些数据则较小。

  • 变量要求“变量的数据类型”和变量中存储的“数据(字面量)”必须类型是一致的,换 句话说,冰箱是用来存放小食品的,也就是说冰箱只能存放小食品,大象不能往冰箱里放,原 因是放不下,空间不合适。例如:int 类型就只能存下 4 个字节大小的整数,再长一点儿放不下,比如long 类型的整数占有 8 个字节,这样的数据肯定是无法放到int 类型的变量当中的。

  • 所谓变量:可变化的量。它的意思是变量中存储的数据不是一成不变的,是可以被改变的, 假设变量i 中之前存储的数据是 10,我们可以将 10 换成 100,变量就是这个意思。

  • 通过以上内容的学习,大家需要掌握一个变量是有三要素组成的,分别是:数据类型、变量名、存储的值。其中存储的值就是上一节讲到的字面量。

使用变量

我们在使用变量之前需要先进行变量的声明,那么声明变量的语法格式是什么呢?请看:

数据类型 变量名;

以上则是声明变量的语法格式,其中数据类型我们在下一章节会详细讲解,目前我们以“int”这种数据类型为例进行学习,int 表示整数类型(注意:int 是关键字,不能随意写,必须全部小写)。

变量名只要符合标识符命名规则即可,当然也要见名知意,命名规范中还要求变量名首字母小写,后面每个单词首字母大写。

请看以下代码则表示声明一个 int 类型的变量age 用来存储年龄数据:

大家可以看到上面的代码中这个 age 变量的三要素当中只具备了两个要素:数据类型和变量名,此时的age 变量并没有存储数据(或者说没有赋值),那么这个age 变量可以访问吗, 我们来试一下,请看代码:

我们对上面的程序进行编译,请看下图:

以上编译错误信息为:可能尚未初始化变量 age,这句话的意思是 age 变量还没有初始化

(没有赋值),也就是说变量age 中还没有数据,空间还没有开辟出来,可见,java 语言中的变量要求必须先声明,再赋值才能访问(这个规则大家一定要记住)。

那么 java 语言中怎么给变量赋值呢?在Java 语言中给变量赋值需要采用赋值运算符“=”,请看赋值的语法格式:

变量名 = 值;

在以上的语法当中,等号右边的值其实就是数据,我们之前所学的字面量就可以当做“值”。其中的等号“=”是一种运算符,它被称为赋值运算符,赋值运算符右边的表达式优先级较高, 所以等号右边先执行,将执行结果赋给左边的变量。(注意:java 语言中的单等号不是用来判断是否相等的,是为了完成赋值运算的。)

接下来我们给age 变量赋值,请看以下代码:

我们对以上的代码进行编译并运行,请看下图结果:

可以看到,以上程序的运行结果是在控制台输出了:20。这里需要注意的是,当在 Java 程序中输出某个变量的时候,会自动输出变量中所保存的值。以上的测试说明了我们的赋值是没有问题的。

那么赋值运算还有其他注意事项吗?有的。

在进行赋值运算的时候,Java 中规定“值”的数据类型必须和“变量”的数据类型保持一致,也就是说 int 类型的变量只能存储int 类型的数据,不能存储其他类型的数据,我们来进行一个简单的测试,请看以下代码:

我们对以上的程序进行编译,请看下图的编译结果:

通过以上的编译我们可以看出,程序的第四行出错了,错误信息是:类型不兼容,这是因为编译器检测到age 变量是int 类型,只能存储int 类型的数据,结果赋给 age 变量的数据不是一个int 类型的数据,而是一个带有双引号的字符串。

通过以上的测试证实了在进行赋值运算的时候,“值”的数据类型必须和“变量”的数据类型一致才可以。

变量赋值之后可以再次重新赋值吗?当然可以,要不然怎么能叫变量呢。请看以下代码:

我们对以上的代码进行编译和运行,结果如下图所示:

通过测试可以看到变量是可以重新赋值的。在以上的程序当中,我们看到变量的声明和赋值是分两行代码完成的,那么变量的声明和赋值可以在一行上完成吗,我们再进行一个简单的测试,请看以下代码:

我们对以上的程序进行编译和运行,请看运行结果:

通过以上的测试,可以看出,变量的声明和赋值是可以在一行上完成的,声明变量的同时可以完成赋值运算。

那么Java 允许一次声明多个同类型的变量吗(C++是允许的,Java 可以吗)?请看以下代码:

以上程序当中,我们看到第三行代码,一次声明了 3 个 int 类型的变量,并且分别进行了赋值。我们对以上的程序进行编译和运行,结果如下图所示:

通过运行结果可以看出,Java 是允许一次声明多个同类型的变量的。我们将以上的代码进行一个简单的修改,请看修改之后的代码:

对以上的程序进行编译,请看以下编译结果:

我们可以看到程序编译报错了,而错误信息中显示 a 变量和b 变量并没有赋值,这说明了代码“int a, b, c = 400;”表示声明了三个int 类型的变量,分别起名a、b、c,其中c 变量赋值400,而a 和b 是没有赋值的,这里一定要注意,以上代码并不表示给a、b、c 三个变量同时赋值 400。

接下来我们再来研究一下,在同一个大括号当中,可以声明两个同名的变量吗?请看以下代码:

我们对以上的代码进行编译,请看下图结果:

通过以上的编译结果,可以看到第4 行出错了,结果也证实了在同一个大括号当中不能同时声明多个同名的变量。这是因为在同一个大括号当中表示在内存的同一个域当中,在同一块区域上面有两个名字都叫做age 的变量,这是不允许的,因为这样程序在运行的时候,java 虚拟机也不知道该访问哪个变量了(好比说,你有两个朋友,他们的俩的名字都叫张三,当你们三个人同时在场的时候,你呼张三,其实他俩也不知道你在叫谁呢!)。

所以,同一个域中变量名不能重名,但是记住:变量是可以重新赋值的。比如以下代码:

我们将以上代码编译并运行,请看下图结果:

最后我们再来看一下,在方法体当中的代码是否存在执行顺序,变量可以先访问,后声明吗?请看以下代码:

对以上程序进行编译,请看下图编译结果:

以上测试结果中显示第3 行报错了,错误信息是找不到符号,换句话说age 变量是不存在的,通过这个测试得知,方法中的代码是有执行顺序的,遵循自上而下的顺序依次逐行执行, 也说明了变量必须先声明,然后才能使用。

通过本小节的学习,大家需要掌握的是在Java 语言中变量如何声明,怎么赋值。另外也要知道变量是可以重新赋值的,还有声明和赋值可以分开完成,也可以一起完成,并且也可以一次声明多个变量。还有就是在同一个域当中变量名是不能重名的。方法当中的代码是有执行顺序的,遵循自上而下的顺序依次逐行执行。

变量分类

变量根据声明的位置不同可以分为:局部变量和成员变量。

在方法体当中声明的变量以及方法的每一个参数都是局部变量。

在方法体外,类体内声明的变量称为成员变量,成员变量声明时如果使用 static 关键字修饰的为静态成员变量(简称静态变量),如果没有 static 关键字修饰则称为实例成员变量(简称实例变量),请看以下代码:

在以上代码当中,sum 是和main 相似的方法,在sum 方法当中a、b 都是方法上的参数属于局部变量,在 sum 的方法体当中声明的 firstNum 属于局部变量。大家也可以看到在sum 方法体外面声明了两个变量,一个是 x,一个是 y,这两个变量都属于成员变量,x 变量没有使用static 修饰属于实例变量,而y 属于静态变量。

局部变量只在方法体当中有效,方法开始执行的时候局部变量的内存才会被分配,当方法执行结束之后,局部变量的内存就释放了。所以局部变量的生命周期非常短暂。

在本小节当中,需要大家掌握的是,看到程序能够找出哪些是局部变量,哪些是实例变量, 哪些是静态变量即可,至于这个变量什么时候声明为局部的,什么时候声明为成员的,后面的 课程当中会详细介绍。

变量作用域

所谓变量的作用域就是变量的有效范围。通过后面内容的学习大家会更加明白,实际上局部变量、实例变量、静态变量它们存储在 Java 虚拟机的不同内存区域上,所以变量是有作用域的。关于变量的有效范围,在这里我给大家总结了一个口诀:出了大括号就不认识了。

虽然这句话属于大白话,但很实用。我们来测试一下,请看以下代码:

在以上代码中我们可以看到在main 方法中声明了一个变量k,根据之前所学得知 k 变量是局部变量,只在本方法中有效(main 方法),那么在m 方法中是否可以访问局部变量k 呢, 我们对以上程序进行编译,请看下图结果:

通过以上的编译结果可以看到第 6 行出错了,错误信息找不到符号,也就是说 k 变量是不存在的无法访问的。这也印证了之前所说的那句话:出了大括号就不认识了。

接下来我们对以上程序进行修改,如果将变量声明为静态变量呢(这里不要纠结为什么声明成静态变量,后面会讲),变量的作用域会发生改变吗,请看以下代码:

我们对以上代码进行编译,并运行,请看下图结果:

我们可以看到编译通过了,并且程序也正常运行了。有同学说,为什么只输出了main 方法中的k,而m 方法中的k 没有输出呢?

这是因为m 方法并没有执行,程序的执行是从main 方法作为入口进来执行的,在 main 方法中并没有手动调用m 方法,所以 m 方法是不会执行的。不过这个测试也印证了那句话:出了大括号就不认识了,只要没有出大括号,变量就是有效的 可访问的,以上程序声明k 变量的位置在类体当中,方法体在类体当中包含,所以在以上的main 方法和m 方法中都是可以访问k 变量的。

接下来我们对以上的程序进一步修改,请看以下代码:

看到以上代码,我们发现在 main 方法当中声明了一个局部变量k,有同学可能会说,有两个同名的变量k,这个程序编译会报错的,因为变量名不能重名,如果你要是这么想的就错了, 我们之前确实讲过变量名不能重名,但是我们指的是“在同一个域”当中变量名不能重名,以 上程序声明的两个变量k 处在不同的域当中,一个是类体域,一个是方法体域。

那么我们对以上程序进行编译并运行,结果会是怎样呢,请看下图结果:

通过上图我们看到程序不但编译通过了,而且还运行了,并且运行的结果不是 100,而是300,这说明了Java 程序遵守“就近原则”,其实这个就近原则不止是 Java 语言中存在,大部分的编程语言都符合这个原则。也就是说以上程序在main 方法中访问变量k 的话,访问的是局部变量k,而不是静态变量k。

那么有同学就要问了,m 方法中的k 访问的是哪个呢?我们尝试在main 方法中调用m 方法,让m 方法执行,来测试一下输出结果,请看以下代码:

以上main 方法当中调用m 方法这段代码大家可以先大概理解一下,方法调用这块的知识点会在后续的内容当中讲解。我们对以上程序进行编译并运行,请看下图结果:

通过以上的测试我们可以看到在m 方法中访问的是静态变量k,因为输出结果是 100,而不是 300。

在本小节当中需要大家掌握的是变量的有效范围,还是需要大家记住那句话:出了大括号就不认识了。另外Java 遵循就近原则。

难点解惑

本章节内容整体比较简单,没有太多的难点,不过对于初学者来说,还是有一定难度的, 尤其是变量的作用域这一小节,关键是对变量作用域的理解。请看以下代码:

我们对以上程序进行编译,请看下图编译结果:

通过以上的编译结果可以看出,程序的第 7 行出现错误,错误信息表示变量i 不存在,这是因为变量i 的声明位置是if 语句的大括号当中,还是我们之前所说的那句话:出了大括号就不认识了。这里的 i 变量在 if 语句的大括号执行结束之后,内存就会自动释放,它的作用域是语句块级别的,生命周期更短。也就是说if 语句的大括号之外都不能访问到变量i。

那么,如果想在后续的程序中继续使用变量i 应该怎么办呢?我们可以将i 变量的声明位置修改一下, 请看代码:

我们对以上的代码进行编译并运行,请看下图结果:

以上程序之所以可以访问i 变量,是因为i 变量的作用域修改成了方法体域的级别。扩大了它的作用范围。

小结

通过本章内容的学习,大家需要掌握变量应该如何声明,如何赋值,如何使用。需要理解变量就是内存当中存储数据的一块空间,它包括三要素:数据类型、变量名、值。另外要知道变量根据声明的位置可以分为成员变量和局部变量,并且声明位置不同作用域也是不同的。还需要注意在同一个域当中变量名不能重名,不同的域,变量名可以相同,只不过 Java 遵循就近原则,会自动访问离它最近的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值