JAVA中的成员变量与局部变量

非 Y 不嫁゛ 提交于 2020-01-30 03:53:51

成员变量

成员变量:在类中定义的变量,分为类变量(static修饰)和实例变量(没有satic修饰);
类变量作用域:从该类开始到该类结束,作用域与该类的生存范围相同(与类本身共存亡);
实例变量作用域:从该实例对象被创建开始直至该实例对象销毁,作用域与该实例对象的生存范围相同(与实例共存亡);
1、类存在,访问该类的类变量: 类.类变量 ( Person.eyeNum);
2、实例存在,访问该类的实例变量:实例.实例变量 (p.name);
3、该类实例访问类变量:实例.类变量 ( p.eyeNum)(注意:由于该实例并不拥有类变量,所以通过实例修改类变量的值时,修改的依然是类的类变量,与通过类修改类变量的结果完全相同,修改后其他实例访问该类变量时,获取的修改后的类变量的值)
eg:

class Person{
	//定义一个实例变量
	public String name;
	//定义一个类变量
	public static int eyeNum;
}
public class PersonTest{
	public static void main(String[] args){
		//第一次使用Person类,该类自动初始化,eyeNum变量输出为0
		System.out,println("eyeNum变量值"+Person.eyeNum);
		//创建Person对象
		Person p = new Person();
		//通过引用p访问Person对象name实例变量,通过实例访问类变量
		System.out,println("p的name变量值"+p.name+"p的eyeNum变量值"+p.eyeNum);
		//直接为name变量赋值
		p.name = "张三"//通过p访问eyeNum变量
		p.eyeNum = "2";
		//通过引用p访问Person对象name实例变量,通过实例访问类变量,p.eyeNum输出为2
		System.out,println("p的name变量值"+p.name+"p的eyeNum变量值"+p.eyeNum);
		Person p2 = new Person();
		//通过实例p2访问类变量,p.eyeNum输出为2
		System.out,println("p的name变量值"+p.name+"p的eyeNum变量值"+p.eyeNum);
	}
}

注意:只要为一个类定义了类变量和实例变量,系统会在该类的初始阶段或创建该类的实例化时进行默认初始化。系统默认分配:0、false、null、"\u0000"。

局部变量

局部变量的三种形式:
1、形参:在定义方法签名时定义的变量,作用域在整个方法体内有效;初始化在调用该方法是由系统完成,形参的值由方法的调用者指定;
2、方法局部变量:在方法体内定义的局部变量,作用域从定义的地方开始生效直至该方法结束时失效;
3、代码块局部变量:在代码块内定义的局部变量,作用域从代码块内定义的地方开始生效直至该代码块结束时失效;
注:局部变量除了形参,其余都必须显式初始化(必须指定初始值,否则不可以访问它们)
eg:代码块局部变量作用域

public class BlockTest{
	public static void main(String[] args){
		{
			//定义一个代码块局部变量
			int a;
			//由于a变量海未初始化,所以代码出现错误
			System.out.println(a);
			//为a变量赋值,即进行初始化
			a = 2;
			System.out.println(a);
		}
		//由于访问的a变量超出代码块范围,所以a变量不存在,出现错误
		System.out.println(a);
	}
}

eg:方法局部变量作用域

public class MethodLocalVariableTest{
	public static void main(String[] args){
		//定义一个方法局部变量a
		int a;
		//由于a变量还未进行初始化,所以不能访问
		//System.out.println(a);
		//为a变量进行初始化
		a = 5;
		System.out.println(a);
	}
}

成员变量与局部变量可以同名,若方法里的局部变量与成员变量同名,则局部变量会覆盖成员变量,若想要引用被覆盖的成员变量,则使用this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。

public class VariableOverrideTest{
	//定义一个name实例变量
	private String name = "张三";
	//定义一个类变量
	private static double price = 10;
	public static void main(){
		//定义方法中的局部变量,则局部变量覆盖成员变量
		int price = 15;
		//直接访问price,值为15
		System.out.println(price);
		//使用类名作为price的限定,值为10
		System.out.println(VariableOverrideTest.price);
		//运行info方法
		new VariableOverrideTest.info();
	}
	public void info(){
		//定义方法里的局部变量,并覆盖成员变量
		String name = "王五";
		//直接访问name变量。值为王五
		System.out.println(name);
		//使用this作为name变量限定,值为“张三”
		System.out.println(this.name);
	}
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!