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

成员变量

成员变量:在类中定义的变量,分为类变量(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);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值