用户:
Godeyes查看:6 回复:6 评论:6 创建时间:2020-04-27T08:05:59
勤奋的Godeyes又来更新Java教程了!

废话不多说!直接开讲
5.3.4 变量作用域(理解)
所谓变量的作用域就是变量的有效范围。通过后面内容的学喵家会更加明白,实际上局部变量、实例变量、静态变量它们存储在 Java 虚拟机的不同内存区域上,所以变量是有作用域的。关于变量的有效范围,在这里我给大家总结了一个口诀:出了大括号就不认识了。虽然这句话属于大白话,但很实用。我们来测试一下,请看以下代码:
public class VarTest07 {
public static void main(String[] args){
int k = 100;
}
public static void m(){
System.out.println(k);
}
}
在以上代码中我们可以看到在 main 方法中声明了一个变量 k,根据之前所学得知 k 变量是局部变量,只在本方法中有效(main 方法),那么在 m 方法中是否可以访问局部变量 k 呢,我们对以上程序进行编译,请看下图结果:
通过以上的编译结果可以看到第 6 行出错了,错误信息找不到符号,也就是说 k 变量是不存在的无法访问的。这也印证了之前所说的那句话:出了大括号就不认识了。接下来我们对以上程序进行修改,如果将变量声明为静态变量呢(这里不要纠结为什么声明成静态变量,后面会讲),变量的作用域会发生改变吗,请看以下代码:
public class VarTest07
static int k = 100;
public static void main(String[] args){
System.out.println("main k = " + k);
}
public static void m(){
System.out.println(k);
}
}
我们对以上代码进行编译,并运行,请看下图结果:
我们可以看到编译通过了,并且程序也正常运行了。有同学说,为什么只输出了 main 方法中的 k,而 m 方法中的 k 没有输出呢?这是因为 m 方法并没有执行,程序的执行是从main方法作为入口进来执行的,在 main 方法中并没有手动调用 m 方法,所以 m 方法是不会执行的。不过这个测试也印证了那句话:出了大括号就不认识了,只要没有出大括号,变量就是有效的可访问的,以上程序声明k 变量的位置在类体当中,方法体在类体当中包含,所以在以上的main 方法和 m 方法中都是可以访问 k 变量的。接下来我们对以上的程序进一步修改,请看以下代码:
public class VarTest07 {
static int k = 100;
public static void main(String[] args){
int k = 300;
System.out.println("main k = " + k);
}
public static void m(){
System.out.println(k);
}
}
看到以上代码,我们发现在 main 方法当中声明了一个局部变量 k,有童鞋可能会说,有两个同名的变量 k,这个程序编译会报错的,因为变量名不能重名,如果你要是这么想的就错了,我们之前确实讲过变量名不能重名,但是我们指的是“在同一个域”当中变量名不能重名,以上程序声明的两个变量 k 处在不同的域当中,一个是类体域,一个是方法体域。那么我们对以上程序进行编译并运行,结果会是怎样呢,请看下图结果:
通过上图我们看到程序不但编译通过了,而且还运行了,并且运行的结果不是 100,而是300,这说明了 Java 程序遵守“就近原则”,其实这个就近原则不止是 Java 语言中存在,大部分的编程语言都符合这个原则。也就是说以上程序在 main 方法中访问变量 k 的话,访问的是局部变量 k,而不是静态变量 k。那么有同学就要问了,m 方法中的 k 访问的是哪个呢?我们尝试在 main 方法中调用 m 方法,让 m 方法执行,来测试一下输出结果,请看以下代码:
public class VarTest07 {
static int k = 100;
public static void main(String[] args){
int k = 300;
System.out.println("main k = " + k); m();
}
public static void m(){
System.out.println(k);
}
}
以上 main 方法当中调用 m 方法这段代码大家可以先大概理解一下,方法调用这块的知识点会在后续的内容当中讲解。我们对以上程序进行编译并运行,请看下图结果:
通过以上的测试我们可以看到在m 方法中访问的是静态变量 k,因为输出结果是 100,而
不是 300。
在本小节当中需要大家掌握的是变量的有效范围,还是需要大家记住那句话:出了大括号
就不认识了。另外 Java 遵循就近原则。
5.4 章节小结
通过本章内容的学习,大家需要掌握变量应该如何声明,如何赋值,如何使用。需要理解变量就是内存当中存储数据的一块空间,它包括三要素:数据类型、变量名、值。另外要知道变量根据声明的位置可以分为成员变量和局部变量,并且声明位置不同作用域也是不同的。还需要注意在同一个域当中变量名不能重名,不同的域,变量名可以相同,只不过 Java 遵循就近原则,会自动访问离它最近的数据。
5.5 难点解惑
本章节内容整体比较简单,没有太多的难点,不过对于初学者来说,还是有一定难度的,
尤其是变量的作用域这一小节,关键是对变量作用域的理解。请看以下代码:
public class VarTest08 {
public static void main(String[] args){
int num = 100;
if(num > 99){
int i = 10;
}
System.out.println(i);
}
}
我们对以上程序进行编译,请看下图编译结果:
通过以上的编译结果可以看出,程序的第 7 行出现错误,错误信息表示变量 i 不存在,这是因为变量 i 的声明位置是 if 语句的大括号当中,还是我们之前所说的那句话:出了大括号就不认识了。这里的 i 变量在 if 语句的大括号执行结束之后,内存就会自动释放,它的作用域是语句块级别的,生命周期更短。也就是说 if 语句的大括号之外都不能访问到变量 i。那么,如果想在后续的程序中继续使用变量 i 应该怎么办呢?我们可以将 i 变量的声明位置修改一下,请看代码:
public class VarTest08 {
public static void main(String[] args){
int num = 100;
if(num > 99){
int i = 10;
}
System.out.println(i);
}
}
我们对以上的代码进行编译并运行,请看下图结果:
以上程序之所以可以访问i 变量,是因为 i 变量的作用域修改成了方法体域的级别。扩大
了它的作用范围。
5.6 章节习题
第一题:通过变量来描述学生的信息,学生信息包括:学号、姓名、性别、身高。其中学号采用整数,姓名采用字符串,性别采用字符型,身高采用浮点型(提示:查阅相关资料,在 java 中如何定义字符串类型的变量,如何定义字符型的变量,还有如何定义浮点型的变量)。具体的学生数据有两份,第一个学生信息是:学号 110,姓名张三,性别男,身高1.85 米。第二个学生信息是:学号 120,姓名李四,性别女,身高 1.65 米。要求最终将学生的信息输出到控制台。
蒟蒻OIer1048576变量有坑!:
import java.util.Scanner;
public class Test(){
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int a;
if(sc.nextInt() == 1048576){
a = 666;
}
else{
a = 777;
}
System.out.println(a);
}
}点赞0
评论
Godeyes
Java学习教程(第一章)[介绍java]:https://shequ.codemao.cn/community/281707
java学习教程(第二章)[java的注释]:https://shequ.codemao.cn/community/281722
Java(第三章)[编写第一个java程序]:https://shequ.codemao.cn/community/281753
Java(特殊篇)[运行和编译java程序]:https://shequ.codemao.cn/community/281785
Java学习教程(第四章)[标识符与关键字]:https://shequ.codemao.cn/community/282020
Java学习教程(第五章)[变量]{1.字面量}:https://shequ.codemao.cn/community/282531
Java学习教程(第五章)[变量]{变量概述}:https://shequ.codemao.cn/community/283059
Java学习教程(第五章)[变量]{使用变量}:https://shequ.codemao.cn/community/283194
[教程帖]Java学习教程第五章[变量]{变量分类}:https://shequ.codemao.cn/community/283732
[教程帖]Java学习教程(第五章)[变量]{变量作用域和章节总结}:https://shequ.codemao.cn/community/283745
点赞0
评论