Java方法与变量作用域问题修复(学习笔记示例)
Java静态上下文与变量作用域问题修复方案
问题根因
你的代码存在3个典型的Java作用域语法错误,也是初学者最容易踩的坑:
- 静态上下文访问限制:类中定义的
streetName、streetNum是没有加static修饰的实例成员变量,而你写的main方法、两个赋值方法都是静态方法,静态方法属于类本身,不能直接访问属于对象实例的非静态成员。 - 局部变量遮蔽成员变量:你在两个赋值方法内部,重新用
String、int声明了和类成员同名的局部变量,这两个变量的作用域仅局限在当前方法的大括号内,方法执行完就会被销毁,完全不会修改类层面的同名成员变量,这种现象叫变量遮蔽(Shadowing)。 - 赋值逻辑无对外效果:调用两个方法时,仅在方法内部给局部变量赋了值,既没有修改类层面的变量,也没有把值返回给调用方,main方法打印时自然拿不到你设置的地址值。
修复后可运行代码
按照你原本的代码结构做最小修改,调整后代码如下:
public class methodPractice{ // 成员变量加static修饰,和静态方法同属类层级,可被静态方法直接访问 static String streetName; static int streetNum; public static void setStreetName() { // 去掉局部变量声明,直接给类的静态成员变量赋值,避免变量遮蔽 streetName = "Pope Ave."; } public static void setStreetNum() { // 同理去掉int声明,不要创建同名局部变量 streetNum = 11825; } public static void main(String[] args) { setStreetName(); setStreetNum(); // 补上门牌号和街道名之间的空格,修正address拼写错误 System.out.println("This is your home address: " + streetNum + " " + streetName); } }
学习笔记要点
- 变量作用域优先级:方法内部的局部变量优先级高于类层面的成员变量,如果你需要修改外层的成员变量,不要在方法内部重复写变量类型声明,否则会创建全新的局部变量,和外层变量没有任何关联。
- static修饰规则:被
static修饰的方法、变量归属于类本身,不依赖类的实例对象;没有static修饰的成员归属于类生成的对象,静态方法中不能直接访问非静态成员,初学时如果全用静态方法写练习代码,对应要操作的成员变量也要加上static修饰。 - 局部变量生命周期:方法内部声明的局部变量,仅在方法被调用时存在,方法执行结束后就会被回收,对方法外部的代码没有任何影响。
- 编码规范提示:尽量不要让方法名和成员变量名同名,很容易引发读写混淆,赋值类的方法建议用
setXxx的命名格式,可读性更高。
运行结果
修复后代码运行输出为:
This is your home address: 11825 Pope Ave.
内容的提问来源于stack exchange,提问作者jorge reyes
相关产品推荐
相关产品推荐

