static关键字

上一篇 / 下一篇  2013-12-30 22:11:53 / 个人分类:java

本章目标51Testing软件测试网3QEf,j"y@ B6~

 了解static关键字的作用

n'N2Y"y+S~0n!fD:A'F0

 掌握static属性、static方法的声明及使用

4FG!z jZ0

 掌握static使用的限制51Testing软件测试网YXz}5Jm%s|/V9nZU

 

N&u.g_9q N`A:S6z0

JAVA中可以使用static声明属性或方法,因为在之前所讲解的属性和方法都属于非static的,这样一来每个对象都占有各自的内容,如果现在希望一个属性被所有对象所共同拥有,则可以将其声明为static类型,声明static的属性或方法之后此属性或方法也称为类方法可以由类名称直接调用51Testing软件测试网5Ah}\#R T.s

 51Testing软件测试网4_-Q+b9Y4P6u.`

使用static声明属性

Z3GT8dwj!yMF4u0

static可以声明全局属性,全局属性有哪些作用51Testing软件测试网Fv;hS+V$X)e3M

class Person{51Testing软件测试网d4lY"g4B

    String name ; //定义name属性,暂时不封装51Testing软件测试网'K$Ny+r_ a

    int age ;     //定义age属性,暂时不封装51Testing软件测试网NPh k8O'|Sc:j

    String country = "A" ;  //定义城市属性,有默认值51Testing软件测试网7N"IM!\lh&V ]KP

   51Testing软件测试网5f)J#[&x3Uuc-TuG.d

    public Person(String name,int age){51Testing软件测试网a#V_3U K.C6q/x0|;o

        this.name = name ;

9{[([C&jw5wQM&M0

        this.age = age ;51Testing软件测试网t F^C |gV%r

    }

3ahB$^d2? PeAjP/P0

   

[dT&nB0

    public void info(){    //得到信息51Testing软件测试网{!ke6C0F G^

        System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;

bB,U n]_S9b0

    }

lAv{&Sze0

}51Testing软件测试网Wwv{!HB9~a9l

 51Testing软件测试网e-j~%v:r*RA

public class StaticDemo01{

a o)eP\[:}S1A(a0

    public static void main(String args[]){

/s`6RmsOw0

        Person p1 = new Person("张三",30) ; //实例化对象51Testing软件测试网&Ws9Gd;D

        Person p2 = new Person("李四",31) ; //实例化对象

9rS3q yFQ;LC9\[0

        Person p3 = new Person("王五",32) ; //实例化对象51Testing软件测试网2I$}$i?lq

       51Testing软件测试网s4El6QR2h

        p1.info() ;51Testing软件测试网m{D C/W&ws

        p2.info() ;51Testing软件测试网Hl7_YoiU

        p3.info() ;

9R6o$M%Me'?1A:[7?;l0

    }51Testing软件测试网C.H}{%R1w

} ;51Testing软件测试网ImlX)zr/l{;@

输出结果:

aL^3YXi)\t0

姓名:张三,年龄:30,城市:A

d G6f tA0

姓名:李四,年龄:31,城市:A

w"]%\I d?!}5O0

姓名:王五,年龄:32,城市:A51Testing软件测试网]C,ye~,DF3\

 51Testing软件测试网 e!d?A @ f VL

 51Testing软件测试网Q@ M4o T:r~

以上代码确实实现了一些基本的功能,但是如果此时城市的名称不叫A城,而改成了B,如果现在已经产生了5000个对象,那么意味着,此时需要修改5000个对象中的country属性。所以,此时最好使用this关键字声明属性。51Testing软件测试网C)~-L0x)B

 

*Y;l br)Ns uZ/t0

使用static修改城市名称51Testing软件测试网v%d-uF0B.m gf g

class Person{51Testing软件测试网nN;} n\.} z K

    String name ; //定义name属性,暂时不封装51Testing软件测试网8~2BZm!e3Lc W4g

    int age ;     //定义age属性,暂时不封装

!QfLyS"R/R!mzB A0

    static String country = "A" ;  //定义城市属性,有默认值

cP ^&Z\~"i0

   51Testing软件测试网3B'L1Z%^UK-t

    public Person(String name,int age){

.}|A^s"M0

        this.name = name ;51Testing软件测试网}5H1R.unZ({N,_+t:_

        this.age = age ;

'T Y&d uT0

    }51Testing软件测试网Yr5lwdG7DY

   51Testing软件测试网/p~S(s\C

    public void info(){    //得到信息

mEx `(v7[4{0

        System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;

:_c"S}|0

    }

HPw9CT C [)Rq5a o0

}51Testing软件测试网5\4DC-VY;|-ID

 

+d9L I/]!u\0

public class StaticDemo02{

.@].x\{c0

    public static void main(String args[]){51Testing软件测试网"R1Y?+r9BA#Bf

        Person p1 = new Person("张三",30) ; //实例化对象

^ Nc.o$C0R-{0

        Person p2 = new Person("李四",31) ; //实例化对象51Testing软件测试网lI v A4L#Z `;C

        Person p3 = new Person("王五",32) ; //实例化对象

)W2H#j)?/tD Hibv0

        System.out.println("--------修改之前--------") ;

'XAP.B q;~z~0

        p1.info() ;

6p^&jwJC0

        p2.info() ;

`L}9cU#A;\B.H0

        p3.info() ;51Testing软件测试网;w:c0|,f.`*zX/S

          // p1.country = "B"   ;    //修改static属性

4E,K2]#^.F5m0

      Person.country = "B" ;51Testing软件测试网!A0hs K;st L-@t:E

        System.out.println("--------修改之后--------") ;

tvY(G:he0

        p1.info() ;

lhlK e2`/~/k }0

        p2.info() ;51Testing软件测试网'a(M6I*d KeM+pN

        p3.info() ;

6ccmCD9}0

    }

|]"B;l]3l0Xy;j0

} ;

JF)op5{upq)H0

 51Testing软件测试网F G%~|.G[R+W

输出结果:

v$Oh#i j(a H#g}0

--------修改之前--------

-x!f9o2Q&\;`+Z T0

姓名:张三,年龄:30,城市:A51Testing软件测试网/bpd iz#D&h

姓名:李四,年龄:31,城市:A

y1e1C'mS5[X,|0

姓名:王五,年龄:32,城市:A51Testing软件测试网E3U(RJ_(w6M

--------修改之后--------

2f3Dw/jL0

姓名:张三,年龄:30,城市:B51Testing软件测试网;I(u[8A+b"}

姓名:李四,年龄:31,城市:B51Testing软件测试网RT&L,Qj1A,o

姓名:王五,年龄:32,城市:B

tk"{^.g l*f0

每一个对象都拥有各自的堆栈空间,堆内存空间中保存每个对象的各自的属性,但是所有的static属性是保存在了全局数据区中,所有的对象指向全局数据区中的一个内容,所以当一个对象修改之后 所有对象的内容将全部变化。51Testing软件测试网4`$MqC_z

一般在调用static属性的时候最好是使用类名称直接调用,采用类名称.属性的形式调用

~&]m)Z k?t!z A|0

 

eGxFZ` H0

声明static方法

b!}A/Sm8T8^9a0

内存区域

U)PW[#a"J[)V[1Wv0

 栈内存:保存对象的名称(保存,访问的堆内存的地址)51Testing软件测试网&SH@5{?fz6@

 堆内存:保存每个对象的具体属性51Testing软件测试网1PtQHez\4w

 全局数据区:保存static类型的属性

+BjG;\2?T,i0

 全局代码区:保存所有方法的定义51Testing软件测试网K?,QS\2Xc

 51Testing软件测试网Zo{3h[,\4H

 51Testing软件测试网w C$J7P;`f7v~X

class Person{51Testing软件测试网/AB#v.H.G |!F

    private String name ; //定义name属性,暂时不封装51Testing软件测试网 y2| |~ yZ p"I ~,W

    private int age ;     //定义age属性,暂时不封装

)T$D!a j S3l:Hg0

    private static String country = "A" ;  //定义城市属性,有默认值

)Q8Nq7[$n4V p9Q0

   51Testing软件测试网}cY2Dd:p+H

   public static void setCountry(String c){    //此方法可以直接由类名称调用51Testing软件测试网g nm Wz3E5NIIa4z!|

        country = c ; 51Testing软件测试网3SLcDr,VTo+`h H

    }

xO#f)]V@l0

   

ek A+RJt0

    public static String getCountry(){51Testing软件测试网$a}&YlM)a![

        return country ;    51Testing软件测试网~7UR1^mJ

    }

9B8O&Z#F3CW@\0

   51Testing软件测试网3Z[|}pd#uRq)l

    public Person(String name,int age){51Testing软件测试网 H$f/r9O~2T/V*J-X

        this.name = name ;51Testing软件测试网c)[.C9W B`

        this.age = age ;

"?lFwR$j0

    }

D}H7du0Je$Pz[0

   51Testing软件测试网fc!j!\zS._Qo

    public void info(){    //得到信息

2]4b8B@K:`+d0

        System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;51Testing软件测试网uy(cJ&hpe

    }

S8@??;F0

}51Testing软件测试网9M t iyX t%xA?

 51Testing软件测试网 p1mq4a L

public class StaticDemo04{

F~$|hV#l6]uXq`0

    public static void main(String args[]){51Testing软件测试网2v o!dL,u Za m

        Person p1 = new Person("张三",30) ; //实例化对象

?!|s9s8kt7S+K0

        Person p2 = new Person("李四",31) ; //实例化对象51Testing软件测试网,Y(u0U:F%J2\zk;k

        Person p3 = new Person("王五",32) ; //实例化对象51Testing软件测试网r[!sSg+S\

        System.out.println("--------修改之前--------") ;

+V*yY} N0

        p1.info() ;51Testing软件测试网]4mTO\n%c)b

        p2.info() ;

kkdE5}K M2f4a'R0

        p3.info() ;

Xqn4KMx&pv8c0

       // p1.country = "B"   ;    //修改static属性

^a1v}^I%_dv5vY0

      Person.setCountry("B");  //调用静态方法修改static属性内容51Testing软件测试网i4C M i%P*S{2F"C%D4Lj

        System.out.println("--------修改之后--------") ;

j&Dj^!Ckh'H0

        p1.info() ;

`U$E)LbWn$~c7^0

        p2.info() ;51Testing软件测试网QC#C.L-PC6S*t2]

        p3.info() ;

,f5l V4]Px.I$K!j0

    }

_#_M f6tU0

} ;

#N+ky,i@3y0

 

}7g[8m4{z+dq0

使用static方法,不能使用非static属性或方法51Testing软件测试网.u!T a-a?'OP \

class Person{51Testing软件测试网'e/E0W(g"L%SwpI

    private static String country ="A" ;    //定义静态属性

zn y UBt,x3B0

    private String name ="Hello" ;  51Testing软件测试网U#H u}HRS~&L

    public static void sFun(String c){51Testing软件测试网8l] ~!A_u fl IIOt

        System.out.println("name = " + name) ; //错误,不能调用非static属性51Testing软件测试网I ]4Y9@2D~

        fun() ;                                 //错误,不能调用非static方法

7C*r\;|mOZ0

    }51Testing软件测试网*l"H | y8|.y4\

   51Testing软件测试网2j'}yW(?;nr1g

    public void fun(){

N.GnA^H0

        System.out.println("World") ;

` U^*Qj dh/D0

    }

o"Mm%F+?7z#b'W0

}51Testing软件测试网_a9N"D-A7WQ x:k

输出结果:51Testing软件测试网'kGp%wy#FjE8Q^h

StaticDemo05.java:5:错误:无法从静态上下文中引用非静态变量name

,e e$Y#}2Kh|^}s0

        System.out.println("name = " + name) ;  //错误,不能调用非static属性51Testing软件测试网)z&f.e O7B0cM| h

                                       ^51Testing软件测试网0W&rk"w rC;b

StaticDemo05.java:6:错误:无法从静态上下文中引用非静态方法fun()

/Km%gzh!UE0

        fun() ;                                 //错误,不能调用非static方法

n$q1M8m6sM X@0

        ^51Testing软件测试网-\d@ {,m:h'mx$H%t9n](_

2个错误

Z:C2zFv_,@+bu0

 51Testing软件测试网SCz-t\0r6j

 51Testing软件测试网 ks5I6fCX(Em"o`

static的其它应用

x[8P9X#h.o2VI0

范例1,从前面的讲解可以知道static属性是所有对象共享的,那么就可以使用static属性统计一个娄到底产生了多少个实体化对象

AnXQG z0

class Demo{51Testing软件测试网.D z\tm&z(N

    private static int count = 0 ;    //所有对象共享此属性51Testing软件测试网(lt5U.`6h.|b

    public Demo(){

? c&{{ F]4V0

        count++ ;                     //只要有对象产生就应该自增

J.\6k/I$^S0

        System.out.println("产生了" + count + "个对象!") ;

u"R:}wjn6U UF0

    }   

6lm/Gq$@/B.@"fW0

}

\:E!jV,at;c{0

 51Testing软件测试网Bvs-v {M

public class StaticDemo06{

"ha@X/Z `-D0

    public static void main(String args[]){

xj+Mbn0

        new Demo() ;                 //增加新对象51Testing软件测试网7_7@,T/I+v0k T E7}5q ^

        new Demo() ;                 //增加新对象51Testing软件测试网F5q c/xD/D0[

        new Demo() ;                 //增加新对象51Testing软件测试网+t Y @K0yV,JbO?B

    }

$@C)E+u3u$fJ L0

}51Testing软件测试网4i"z sN4ZG1j5`N

输出结果:

qr8?)yyR0

产生了1个对象!

:k5iRO[_Ee0

产生了2个对象!

+}jI6b e oL0

产生了3个对象!51Testing软件测试网&n)`R/\#ze6q

 

2_9Ges5YFFU {0F0

范例2,可以使用static为对象进行自动的编钟操作,此操作与上面代码类似

'A;vk%@+B!s;] A\0

class Demo{51Testing软件测试网7cz@&[\v8x{

    private String name ;

bO]~k+R0

    private static int count = 0 ;    //所有对象共享此属性

9f IO xq0

    public Demo(){

-p? _y^ m+S/GW0

        count ++ ;

(y1Lm'ng p1v0

        this.name = "DEMO-" + count ;  //自动进行编名操作51Testing软件测试网;R-w }uw;_lhh M;}

    } 

{Q&Q-l&m2jfgZ0

    public Demo(String name){51Testing软件测试网6H F*@:k#Ez;y,YI

        this.name = name ;            //可以通过构造赋值

R6X8u ~"`0

    }

8`:l.g0^E&Y%B0

   51Testing软件测试网$n Y"q o-|OV~

    public String getName(){

5pf#Ky(dT0

        return this.name ;

2IoA,J^x g-v)t0

    }51Testing软件测试网H k|.Y7l@j

   51Testing软件测试网G L'Z8st|$Q HVb6u V

    51Testing软件测试网5Jfm7m~ E"}i#d

}

bF8f r6Y"A!qZ0

 

9w;Ny"v8S0

public class StaticDemo07{51Testing软件测试网 P;XTK/r

    public static void main(String args[]){51Testing软件测试网$~c|ij7X[y

        System.out.println(new Demo().getName()) ;                 //增加新对象

r/@x }/cVa0

        System.out.println(new Demo("luo").getName()) ;   //增加新对象51Testing软件测试网.okKp*`rRs9z

        System.out.println(new Demo().getName()) ; 51Testing软件测试网x(k D8VO%v

        System.out.println(new Demo("river").getName()) ; 51Testing软件测试网0D@D_+KY)VTH B(t}

        System.out.println(new Demo().getName()) ; 

0\[ L"| [i3~_#y0

    }

*` b9VH+yMr0

}51Testing软件测试网%eT V Db?9wR}

输出结果:51Testing软件测试网8S%N,_/SV y!`

DEMO-1

t.jc G H0

luo

(c DV R$s0

DEMO-251Testing软件测试网o,X+y)d1XE \u zga

river51Testing软件测试网^)Us MH.d

DEMO-3

pvR^7Bx Q$p0

 

a;QD7Kh%DX$}0

 

x;I/WHV2V eKb0

 51Testing软件测试网.]N,ehmgT

 

+_9bl;KXu5d0

本章总结

*[qJOWDc/|,]'i0

 使用static声明属性与非static声明属性的区别51Testing软件测试网L2z^*^| c+e-{;dF

 使用static声明的属性或方法可以直接由类名称调用

!j,a#`)t8l e0

 使用static方法的时候只能访问static声明的属性或方法,而非static声明的属性和方法是不能访问因为static可以在对象滑实例化时就直接调用,而其它的属性或方法必须在对象实例化之后才可以调用

2?b[*]t8L$zh0

 了解static操作的两个范例51Testing软件测试网b/jt2F!WY [/q5D/v

 

!f.E-EWZ [C?|C0

TAG:

 

评分:0

我来说两句

luoriver

luoriver

北漂一族,80后,计算机专业,从事SIP相关软件测试3年,热爱生活,崇尚运动。 爱看WWE、公开课。爱钻“牛角尖”,这就是我:luorivr!!!!!

日历

« 2024-04-27  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 345854
  • 日志数: 96
  • 图片数: 1
  • 建立时间: 2012-12-27
  • 更新时间: 2014-05-03

RSS订阅

Open Toolbar