猫史档案馆


[教程帖]Java学习教程(第五章)[变量]{变量作用域和章节总结}

用户:GodeyesGodeyes查看:6 回复:6 评论:6 创建时间:2020-04-27T08:05:59


勤奋的Godeyes又来更新Java教程了!emotion_编程猫_厉害了emotion_编程猫_嗨起来

废话不多说!直接开讲emotion_星能猫_欢迎

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 呢,我们对以上程序进行编译,请看下图结果:

center_image

通过以上的编译结果可以看到第 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);
    }
}

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

center_image

我们可以看到编译通过了,并且程序也正常运行了。有同学说,为什么只输出了 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 处在不同的域当中,一个是类体域,一个是方法体域。那么我们对以上程序进行编译并运行,结果会是怎样呢,请看下图结果:

center_image

通过上图我们看到程序不但编译通过了,而且还运行了,并且运行的结果不是 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 方法这段代码大家可以先大概理解一下,方法调用这块的知识点会在后续的内容当中讲解。我们对以上程序进行编译并运行,请看下图结果:

center_image

  通过以上的测试我们可以看到在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);
    }
}

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

center_image

通过以上的编译结果可以看出,程序的第 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);
    }
}

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

center_image

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

了它的作用范围。

5.6 章节习题

第一题:通过变量来描述学生的信息,学生信息包括:学号、姓名、性别、身高。其中学号采用整数,姓名采用字符串,性别采用字符型,身高采用浮点型(提示:查阅相关资料,在 java 中如何定义字符串类型的变量,如何定义字符型的变量,还有如何定义浮点型的变量)。具体的学生数据有两份,第一个学生信息是:学号 110,姓名张三,性别男,身高1.85 米。第二个学生信息是:学号 120,姓名李四,性别女,身高 1.65 米。要求最终将学生的信息输出到控制台。

 

 

 

 


回复

上一页1 页 / 共 1下一页
GodeyesGodeyes

ddddd

点赞0


评论


GodeyesGodeyes

我再顶

点赞0


评论


蒟蒻OIer1048576蒟蒻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


评论


GodeyesGodeyes

我再顶!!

点赞0


评论


************

center_image不知道这个东西你们用过吗?

java程序员必备!!!

点赞0


评论


GodeyesGodeyes

 

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


评论