变量依照作用范围划分可以分为全局变量和局部变量两类

一.全局变量

全局变量又称为成员变量,它的定义位置是直接定义在类中,一般来说最好将定义放在类的头部,全局变量的作用范围是整个类,以下是全局变量的例子:

package mcing;

public class Use {
	
	float mon=3.2f;
	int non=9;
	
	public void shrink() {
		System.out.println(mon);
		System.out.println(non);
	}
	
	public static void main(String[] args) {
		Use use=new Use();
		use.shrink();
	}
}

Android jni 全局变量和局部变量 全局变量是啥_全局变量

 

全局变量是有默认值的,当定义时未对其初始化,int默认值为0,Boolean默认值为false,float和double默认值都是0.0,引用型变量默认值为null ,但是下面的示例却报错了:

package mcing;

public class Use {
	
	float mon;
	int non;
	
	public static void main(String[] args) {
		System.out.println(mon);
		System.out.println(non);
	}
}

Android jni 全局变量和局部变量 全局变量是啥_全局变量_02

这就是接下来要介绍的全局变量的特性,那就是,如果变量是非静态的,则静态方法中只能通过对象来调用,而不能直接通过类来调用,像上面的代码直接在类中调用非静态的全局变量了,所以会报错,可以有两种修改方法,第一种是将变量改为静态的

package mcing;

public class Use {
	
	static float mon;
	static int non;
	
	public static void main(String[] args) {
		System.out.println(mon);
		System.out.println(non);
	}
}

第二种是在主方法中通过对象来调用

package mcing;

public class Use {
	
	float mon;
	int non;
	
	public static void main(String[] args) {
		Use use =new Use();
		System.out.println(use.mon);
		System.out.println(use.non);
	}
}

都能得到全局变量的默认值

Android jni 全局变量和局部变量 全局变量是啥_全局变量_03

二.局部变量 

 接下来我们来说局部变量,局部变量的定义位置有两种,一种是非静态代码块中,且在创建对象时执行。另一种是在方法参数列表或方法体内定义,以下是两种定义位置的使用的例子:

package mcing;

public class Use {
	
	{
		int non=8;
		System.out.println(non);
	}
	
	public void shrink() {
		int non=4;
		System.out.println(non);
	}
	
	public static void main(String[] args) {
		new Use();
	}
}

Android jni 全局变量和局部变量 全局变量是啥_局部变量_04

运行结果为8,这其中蕴含了局部变量的作用范围,是从定义的位置开始到其所在直接语句块结束 ,所以在主方法中创建对象时只会使用代码块中的值8。要注意的是,它的作用域是到直接语句块结束,而不是所在的方法

三.错误分析

以下是错误的局部变量使用:

package mcing;

public class Use {
	
	public static void shrink() {
		System.out.println(non);
		int non=4;
		System.out.println(non);
	}
	
	public static void main(String[] args) {
		Use.shrink();
	}
}

Android jni 全局变量和局部变量 全局变量是啥_局部变量_05

上述错误是因为在代码块中局部变量的定义之前使用局部变量是无效的 ,我们再看一个错误使用:

package mcing;

public class Use {
	
	public static void shrink() {
		int i=0;
		if(i==0) {
			int non=4;
			System.out.println(non);
		}
		System.out.println(non);
	}
	
	public static void main(String[] args) {
		Use.shrink();
	}
}

Android jni 全局变量和局部变量 全局变量是啥_局部变量_06

上述错误是因为当if代码块结束时局部变量的作用域就已经结束了,所以再使用局部变量就是错误的了

下一个要说的局部变量的特性就是如果局部变量的变量名与成员变量的变量名相同,在局部变量作用范围内使用的是局部变量的值;如果要使用全局变量,则需要使用this

 

package mcing;

public class Use {
	
	int HME=1;
	
	{
		final int HME=2;
		System.out.println(HME);
		System.out.println(this.HME);
	}
	
	public static void main(String[] args) {
		new Use();
	}
}

Android jni 全局变量和局部变量 全局变量是啥_全局变量_07

 但要注意的一点就是,this不能在静态代码块中使用,如果在静态代码块中调用全局变量,需要如下调用:

package mcing;

public class Use {
	
	int HME=1;
	
	static {
		final int HME=2;
		System.out.println(HME);
		System.out.println(new Use().HME);
	}
	
	public static void main(String[] args) {
		new Use();
	}
}

最后一个特性就是,局部变量是没有默认值的,因此局部变量在使用以前必须显式初始化或赋值