static关键字
上一篇 / 下一篇 2013-12-30 22:11:53 / 个人分类:java
本章目标
了解static关键字的作用
掌握static属性、static方法的声明及使用
掌握static使用的限制
N&u.g_9q N`A:S6z0
在JAVA中可以使用static声明属性或方法,因为在之前所讲解的属性和方法都属于非static的,这样一来每个对象都占有各自的内容,如果现在希望一个属性被所有对象所共同拥有,则可以将其声明为static类型,声明static的属性或方法之后此属性或方法也称为类方法,可以由类名称直接调用
51Testing软件测试网4_-Q+b9Y4P6u.`
使用static声明属性
static可以声明全局属性,全局属性有哪些作用
class
Person{ String name ; //定义name属性,暂时不封装 int
age ; //定义age属性,暂时不封装 String
country = "A城" ; //定义城市属性,有默认值 public
Person(String name,int age){
this.name = name ;
this.age = age ; } public
void info(){ //得到信息
System.out.println("姓名:" +
this.name + ",年龄:" +
this.age + ",城市:" +
country) ; } } 51Testing软件测试网e-j~%v:r*RA public class StaticDemo01{ public
static void main(String args[]){
Person p1 = new Person("张三",30) ; //实例化对象
Person p2 = new Person("李四",31) ; //实例化对象
Person p3 = new Person("王五",32) ; //实例化对象
p1.info() ;
p2.info() ;
p3.info() ; } } ; |
输出结果:
姓名:张三,年龄:30,城市:A城 姓名:李四,年龄:31,城市:A城 姓名:王五,年龄:32,城市:A城 |
51Testing软件测试网e!d?A @ f VL
51Testing软件测试网Q@M4o T:r~
以上代码确实实现了一些基本的功能,但是如果此时城市的名称不叫“A”城,而改成了“B城”,如果现在已经产生了5000个对象,那么意味着,此时需要修改5000个对象中的country属性。所以,此时最好使用this关键字声明属性。
*Y;lbr)NsuZ/t0
使用static修改城市名称
class
Person{ String name ; //定义name属性,暂时不封装 int
age ; //定义age属性,暂时不封装 static
String country = "A城" ; //定义城市属性,有默认值 public
Person(String name,int age){
this.name = name ;
this.age = age ; } public
void info(){ //得到信息
System.out.println("姓名:" +
this.name + ",年龄:" +
this.age + ",城市:" +
country) ; } } +d9L I/]!u\0 public class StaticDemo02{ public
static void main(String args[]){
Person p1 = new Person("张三",30) ; //实例化对象
Person p2 = new Person("李四",31) ; //实例化对象
Person p3 = new Person("王五",32) ; //实例化对象
System.out.println("--------修改之前--------")
;
p1.info() ;
p2.info() ;
p3.info() ;
// p1.country = "B城" ;
//修改static属性 Person.country =
"B城" ;
System.out.println("--------修改之后--------")
;
p1.info() ;
p2.info() ;
p3.info() ; } } ; |
51Testing软件测试网F G%~|.G[R+W
输出结果:
--------修改之前-------- 姓名:张三,年龄:30,城市:A城 姓名:李四,年龄:31,城市:A城 姓名:王五,年龄:32,城市:A城 --------修改之后-------- 姓名:张三,年龄:30,城市:B城 姓名:李四,年龄:31,城市:B城 姓名:王五,年龄:32,城市:B城 |
每一个对象都拥有各自的堆栈空间,堆内存空间中保存每个对象的各自的属性,但是所有的static属性是保存在了全局数据区中,所有的对象指向全局数据区中的一个内容,所以当一个对象修改之后 所有对象的内容将全部变化。
一般在调用static属性的时候最好是使用类名称直接调用,采用“类名称.属性”的形式调用
eGxFZ` H0
声明static方法
内存区域 栈内存:保存对象的名称(保存,访问的堆内存的地址) 堆内存:保存每个对象的具体属性 全局数据区:保存static类型的属性 全局代码区:保存所有方法的定义 |
51Testing软件测试网Z o{3h[,\4H
51Testing软件测试网wC$J7P;`f7v~ X
class
Person{ private String name ; //定义name属性,暂时不封装
private int age ; //定义age属性,暂时不封装
private static String country = "A城" ; //定义城市属性,有默认值 public static void setCountry(String
c){ //此方法可以直接由类名称调用
country = c ; } public
static String getCountry(){
return country ; } public
Person(String name,int age){
this.name = name ;
this.age = age ; } public
void info(){ //得到信息
System.out.println("姓名:" +
this.name + ",年龄:" +
this.age + ",城市:" +
country) ; } } 51Testing软件测试网p1mq4a L public class StaticDemo04{ public
static void main(String args[]){
Person p1 = new Person("张三",30) ; //实例化对象
Person p2 = new Person("李四",31) ; //实例化对象
Person p3 = new Person("王五",32) ; //实例化对象
System.out.println("--------修改之前--------")
;
p1.info() ;
p2.info() ;
p3.info() ; //
p1.country = "B城" ;
//修改static属性 Person.setCountry("B城"); //调用静态方法修改static属性内容
System.out.println("--------修改之后--------")
;
p1.info() ;
p2.info() ;
p3.info() ; } } ; |
}7g[8m4{z+dq0
使用static方法,不能使用非static属性或方法
class
Person{ private static String country ="A城" ; //定义静态属性
private String name ="Hello" ; public
static void sFun(String c){
System.out.println("name = " + name) ; //错误,不能调用非static属性
fun() ;
//错误,不能调用非static方法 } public
void fun(){
System.out.println("World") ; } } |
输出结果:
StaticDemo05.java:5:错误:无法从静态上下文中引用非静态变量name
System.out.println("name = " + name) ; //错误,不能调用非static属性 ^ StaticDemo05.java:6:错误:无法从静态上下文中引用非静态方法fun()
fun() ;
//错误,不能调用非static方法 ^ 2个错误 51Testing软件测试网SCz-t\0r6j |
51Testing软件测试网 ks5I6fCX(Em"o`
static的其它应用
范例1,从前面的讲解可以知道static属性是所有对象共享的,那么就可以使用static属性统计一个娄到底产生了多少个实体化对象
class
Demo{ private static int count = 0 ; //所有对象共享此属性 public
Demo(){
count++ ; //只要有对象产生就应该自增
System.out.println("产生了" + count +
"个对象!") ; } } 51Testing软件测试网Bvs-v {M public class StaticDemo06{ public
static void main(String args[]){
new Demo() ; //增加新对象
new Demo() ; //增加新对象
new Demo() ; //增加新对象 } } |
输出结果:
产生了1个对象! 产生了2个对象! 产生了3个对象! |
2_9Ges5YFFU{0F0
范例2,可以使用static为对象进行自动的编钟操作,此操作与上面代码类似
class
Demo{ private String name ; private static int count = 0 ; //所有对象共享此属性 public
Demo(){
count ++ ;
this.name = "DEMO-" + count ; //自动进行编名操作 } public
Demo(String name){
this.name = name ; //可以通过构造赋值 } public
String getName(){
return this.name ; } } 9w;Ny"v8S0 public class StaticDemo07{ public
static void main(String args[]){
System.out.println(new Demo().getName()) ; //增加新对象
System.out.println(new Demo("luo").getName()) ; //增加新对象
System.out.println(new Demo().getName()) ;
System.out.println(new Demo("river").getName()) ;
System.out.println(new Demo().getName()) ; } } |
输出结果:
DEMO-1 luo DEMO-2 river DEMO-3 |
a;QD7Kh%DX$}0
x;I/WHV2V eKb0
51Testing软件测试网.]N,ehmgT
+_9bl;KXu5d0
本章总结
使用static声明属性与非static声明属性的区别
使用static声明的属性或方法可以直接由类名称调用
使用static方法的时候只能访问static声明的属性或方法,而非static声明的属性和方法是不能访问因为static可以在对象滑实例化时就直接调用,而其它的属性或方法必须在对象实例化之后才可以调用
了解static操作的两个范例
!f.E-EWZ [C?|C0
TAG:
北漂一族,80后,计算机专业,从事SIP相关软件测试3年,热爱生活,崇尚运动。 爱看WWE、公开课。爱钻“牛角尖”,这就是我:luorivr!!!!!
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | 5 | 6 | ||||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 |
我的存档
数据统计
- 访问量: 345854
- 日志数: 96
- 图片数: 1
- 建立时间: 2012-12-27
- 更新时间: 2014-05-03