【摘要】 在Java中,static关键字可以用来修饰成员变量、成员方法、静态代码块、静态内部类、静态导包等*。 能力所限,本篇目前仅能讨论static修饰成员变量、成员方法时的使用情况。
静态变量
在一个java类中,可以用static关键词来修饰成员变量,该变量被称作静态变量。
此静态变量在内存中只有一份,并且能够被一个类中的所有实例对象共享。也正因为在一个类的内存中只…
在Java中,static关键字可以用来修饰成员变量、成员方法、静态代码块、静态内部类、静态导包等*。
能力所限,本篇目前仅能讨论static修饰成员变量、成员方法时的使用情况。
静态变量
在一个java类中,可以用static关键词来修饰成员变量,该变量被称作静态变量。
此静态变量在内存中只有一份,并且能够被一个类中的所有实例对象共享。也正因为在一个类的内存中只有一份,所以也可直接使用”类名.变量名“的方式进行访问。
访问值和修改值都是可以进行的。
该静态变量有两种访问形式:
(1)类名.变量名
(2)实例对象名.变量名
代码示例:
package com.company;
class City{ static String CountryName;
}
public class Main { public static void main(String[] args) { City Beijing = new City(); City Shanghai = new City(); City.CountryName = "China";//类名.变量名 System.out.println(Beijing.CountryName);//实例对象名.变量名 System.out.println(Shanghai.CountryName); Shanghai.CountryName = "中国"; System.out.println(Shanghai.CountryName); System.out.println(City.CountryName); }
}
运行结果:
China
China
中国
中国
另外static关键字只能用于修饰成员变量,不能用于修饰局部变量,如下代码会编译报错:
class City{ static String CountryName; public void setCountryName(){ static String countryname = "China";//错误使用 }
}
报错:
java: 非法的表达式开始
IDE提示:Make 'countryname' not static
静态方法
同样的,静态方法有两种调用形式:
(1)类名.方法名
(2)实例对象名.方法名
代码示例:
package com.company;
class City{ static String CountryName = "China"; public static void getCountryName(){ System.out.println("country name is:" + CountryName); }
}
public class Main { public static void main(String[] args) { City Beijing = new City(); City Shanghai = new City(); City.getCountryName();//类名.方法名 Beijing.getCountryName();//实例对象名.方法名 Shanghai.getCountryName(); }
}
###关于静态方法、静态变量、非静态方法及非静态变量之间访问的关系:
1.静态方法只能访问静态变量,而不能直接访问非静态变量:
原因:非静态变量需要先创建对象才能访问,而静态方法在被调用时可能没有对象被创建,在这种情况下静态方法就不能访问非静态变量。
如下代码会报错:
class City{ static String CountryName = "China"; int PeopleNum = 0; public static void getCountryName(){ System.out.println(PeopleNum);//错误使用 }
}
2.如上所属,如果我们想要在静态方法中调用非静态变量,则只能在对象被创建后访问,即将对象作为静态方法的形参:
class City{ static String CountryName = "China"; int PeopleNum = 0; public static void getPeopleNum(City x){ x.PeopleNum = 900000;//在静态方法中调用非静态变量 System.out.println("PeopleNum is:" + x.PeopleNum); }
}
public class Main { public static void main(String[] args) { City Beijing = new City(); City.getPeopleNum(Beijing); }
}
运行结果:
PeopleNum is:900000
3.我们可以使用同样的原理,在静态方法中调用非静态方法:
class City{ static String CountryName = "China"; int PeopleNum = 0; int Yonger = 20000; int Older = 70000; public void getPeopleSum(){ PeopleNum = Yonger + Older; } public static void getPeopleNum(City x){ x.getPeopleSum();//在静态方法中调用非静态方法 System.out.println("PeopleNum is:" + x.PeopleNum); }
}
public class Main { public static void main(String[] args) { City Beijing = new City(); City.getPeopleNum(Beijing); }
}
运行结果:
PeopleNum is:90000
4.众所周知,静态方法调用静态变量、静态方法,非静态方法调用静态变量、静态方法、非静态变量、非静态方法,都是可行的,在此就不再用代码演示。
最后我们使用表格展示他们之间的调用关系:
静态方法 | 非静态方法 | |
---|---|---|
被调用者 | ||
静态变量 | √ | √ |
非静态变量 | 将对象作为静态方法的形参 ,在方法中通过“形参对象名.变量名.”访问 | √ |
静态方法 | √ | √ |
非静态方法 | 将对象作为静态方法的形参 ,在方法中通过“形参对象名.方法名.”调用 | √ |