1、关于静态方法的代码分析题
public class Person{
int arr[] = new int[10];
public static void main(String a[]){
System.out.println(arr[1]);
}
}
运行结果
D:/>javac Person.java
Person.java:4: 无法从静态上下文中引用非静态 变量 arr
System.out.println(arr[1]);
^
1 错误
分析
类中有三种变量,局部变量、实例变量和类变量。其中,局部变量是定义在方法里的变量。实例变量是在方法外而在类声明内定义的变量,也叫成员变量,类变量是用关键字static声明的实例变量。 她们的生存期分别是:局部变量在定义该变量的方法被调用时被创建,而在该方法退出后被撤销,实例变量(成员变量)在使用new XXX()创建该类的实例时创建,其生存期和该类的实例对象的生存期相同,类变量在该类被加载时被创建,不一定要用new XXX()创建,所有该类的实例对象共享该类变量,其生存期是类的生存期。
任何变量在使用前必须被初始化,但是需要指出的是局部变量必须显式初始化,而实例变量不必,原始类型的实例变量在该类的构造方法被调用时为他分配默认值,整型是0,布尔型是false,而浮点型是0.0f,引用类型(类类型)是null(没有进行实际的初始化,对他的使用将引起NullPointException),类变量的规则和实例变量一样,不同的是类变量的初始化发生在类被加载时。
当遇到static ,final, finally这样的关键字时,一定要想想他的相关约束规则。
此处static静态方法中不能直接访问类的非静态成员,只能访问类成员,类的普通方法可以访问类的所有成员和方法,而静态方法只能访问类的静态成员和方法,因为静态方法属于类,而普通方法及成员变量属于类的实例,类方法(静态方法)不能使用属于某个不确定类的实例方法和变量, 在静态方法里没用隐含的this,而普通方法有。
2.关于静态变量的选择题
分析下面程序,请选择正确的输出结果
public class NameClass{
private static int x;
public static void main(String args[]){
name(x);
System.out.println(x);
}
public static void name(int x){
x++;
}
}
A.0 B.1 C.2 D.3
分析,注意陷阱,同名变量,作用域不一样,不是同一个变量。
在类NameClass中定义了一个静态变量x和一个静态方法name(int x),注意name()方法中的参数名与静态变量名是相同的,所以在进行x++运算时,改变的是参数x的值,而不是静态变量x的值。这时静态变量x还有另一种身份,即全局变量,当然参数x就是局部变量,他的使用范围仅在name()方法中,所以在main()方法中只能调用静态变量x。但是如果修改如下则选B
public class NameClass{
private static int x;
public static void main(String args[]){
name(x);
System.out.println(x);
}
public static void name(int y ){
x++;
}
}