作为名副其实的一个菜鸟,今天终于试着编程了,很简单的一段程序代码,却让我混淆了很久才弄明白。重心就在static上。
源代码如下:
1.public class Person
2.{
3. String personName;
4. int personAge;
5. String personSex;
6. void PersonVar(String name,int age,String sex)
7. {
8. personName=name;
9. personAge=age;
10. personSex=sex;
11. }
12. public static void main(String [] args)
13. {
14. Person person=new Person();
15. person.PersonVar("Julie",23,"女");
16. person.personAge=21;
17. System.out.println(person.personName+"同学,今年"+person.personAge+"岁,是一个"+person.personSex+"生^-^");
17. }
18. }
①若16行改为System.out.println(personName+"同学,今年"+personAge+"岁,是一个"+personSex+"生^-^");
运行后出现“无法从静态上下文引用非静态变量”的错误!这是因为personName、personAge、personSex为非静态的成员变量,而非静态变量必须有了对象的实例才能调用,通俗的讲,不创实例的非静态变量是不存在的,何来调用...^^?
而对于静态变量,是可以不创实例就能调用的。静态的关键字为static。
修改:分别在3、4、5行的成员变量前加static即可。
②若将14行Person person=new Person();放到main()函数外面的话会出现同样的错误。只要在语句前加上static即可。
原因:代码执行顺序是:静态块->静态变量->main()函数->对象成员变量->构造函数
下面有两例有意思的程序:
第一例StaticStuff.java
class StaticStuff{
static int x=10;
static{
x+=5;
}
public static void main(String [] args){
System.out.println("x="+x);
}
static{
x/=3;
}
运行结果:x=5
这一例程序的执行顺序为:类装载->x=10->x=5+10=15->x=15/3=5->main()函数->输出
第二例Tester.java
public class Tester{
private static int i=method();
private static int j= 10;
public static void main(String[] args){
System.out.println(i);
}
static int method(){
return j;
}
}
运行结果为0
这一例的程序先执行static变量i,i调用method()方法,在方法中j还未被赋值(只是int型的初始化值0),所以i为返回值0;下一步执行static变量j,j被赋值为10;第三步执行main()函数,输出i为0。
若将private static int i=method(); 与private static int j= 10; 交换一下,运行后输出的结果为10。
注意:静态属性的初始化和静态代码块的执行顺序与它们的位置有关,放在上面的先执行。故而
private static int i=method(); 与private static int j= 10;的顺序不一样,运行的结果不一样。