Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7539
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-26 17:51
文章分类
文章存档

2015年(1)

2014年(6)

我的朋友
最近访客

分类: Java

2014-12-05 10:40:48

具体实例:
1)下面的例子中,静态变量staticVar,只在类第一次加载时被创建并初始化,以后无论创建多少类对象,该变量都不再
 加载,因此每次都在原有基础上增加1,而实例变量instanceVar,只有当创建类对象时才对其进行创建并在构造函数中
加1,每创建一个对象,就对应创建一个instanceVar实例变量。注意:在静态方法中访问instanceVar将报错。

2)UseStatic类中,类加载时初始化顺序为:静态变量-->静态代码块

  1. public class StaticTest {
  2.       //默认为0 ,可不指定初始值
  3.      static int staticVar; //静态变量,在类初始化时加载,只加载一次
  4.      int instanceVar; //实例变量
  5.  
  6.      public StaticTest() {
  7.           staticVar++;
  8.           instanceVar++;
  9.           System.out.println("staticVAr= "+staticVar+" instanceVar= "+instanceVar);
  10.            
  11.     }
  12.       
  13.      public void doSth(){
  14.          System.out.println("Do something...");
  15.      }
  16.       
  17.      public static void doSthStatic(){
  18. // System.out.println(instanceVar); //不能对非静态字段 instanceVar 进行静态引用
  19.          System.out.println("Do something static...");
  20.      }
  21.      
  22.     @Test
  23.     public void testStatic(){
  24.           //单元测试会首先创建一个类的对象,然后再调用该测试方法
  25.           new StaticTest();
  26.      }
  27.      
  28.     public static void main(String[] args){
  29.         // StaticTest staticTest;
  30.          System.out.println(staticVar); //此时还未创建对象,staticVar值未增加,仍为0
  31.          //每创建一个StaticTest对象,staticVar值增加1,instanceVAr值由0加1
  32.          StaticTest staticTest1=new StaticTest(); //
  33.          StaticTest staticTest2=new StaticTest();
  34.          StaticTest staticTest3=new StaticTest();
  35.          System.out.println("instanceVar(whole) is:"+staticTest3.instanceVar);
  36.          int instanceVar=200; //局部变量优先
  37.          System.out.println("instanceVar(local) is:"+instanceVar);
  38.          System.out.println("staticVar(whole) is:"+staticVar);
  39.          int staticVar=500; //局部变量优先
  40.          System.out.println("staticVar(local) is:"+staticVar);
  41.           
  42.      }
  43. } //end StaticTest
  44. /**
  45.  *
  46.  * @author patty
  47.  * @time 2014-12-4
  48.  * @todo 考查static变量/方法/代码块
  49.  * 类加载时加载顺序为:静态变量,静态代码块,然后才调用静态方法
  50.  */
  51. class UseStatic{
  52.     public static int a=3;
  53.     static int b;
  54.      
  55.     static void method(int c){
  56.         System.out.println("C: "+c);
  57.         System.out.println("A: "+a);
  58.         System.out.println("B: "+b);
  59.     }
  60.     //代码块
  61.     static{
  62.         System.out.println("Static block...");
  63.         System.out.println("a= "+a+" b= "+b);// 3 0
  64.         b=a*5;
  65.         System.out.println("a= "+a+" b= "+b);// 3 15
  66.     }
  67.      
  68.     public static void main(String[] args){
  69.         method(24);
  70.         System.out.println(StaticTest.staticVar); //0
  71.     }
  72. }//end UseStatic
  73.  
  74. class StaticDemo extends StaticTest{
  75.     static int sta;
  76.     int stb;
  77.     public StaticDemo() {
  78.         //super();
  79.         sta++;
  80.         stb++;
  81.         System.out.println("sta= "+sta+" stb= "+stb);
  82.     }
  83.     //此处不可将doSth声明为静态方法,即子类不能以static覆盖父类的非静态方法
  84.     public void doSth(){
  85.         super.doSth();
  86.         System.out.println("Sub do something");
  87.     }
  88.     //此处必须加上static修饰符,因为实例方法不能覆盖 StaticTest 中的静态方法
  89.     public static void doSthStatic(){
  90.         StaticTest.doSthStatic(); //静态方法不可用super关键字,用父类名直接访问
  91.         System.out.println("Sub do something static");
  92.     }
  93.      
  94.     public static void main(String[] args){
  95.         System.out.println("sta= "+sta);
  96.         new StaticDemo().doSth();
  97.         doSthStatic();
  98.     }
  99. }
  100.  
  101. ///:output:
  102. /* StaticTEst
  103.    * testStatic
  104.      staticVAr= 1 instanceVar= 1
  105.      staticVAr= 2 instanceVar= 1
  106.    * main
  107.        0
  108.      staticVAr= 1 instanceVar= 1
  109.      staticVAr= 2 instanceVar= 1
  110.      staticVAr= 3 instanceVar= 1
  111.      instanceVar(whole) is:1
  112.      instanceVar(local) is:200
  113.      staticVar(whole) is:3
  114.      staticVar(local) is:500
  115.       
  116.  *StaticDemo
  117.      sta= 0
  118.      staticVAr= 1 instanceVar= 1
  119.      sta= 1 stb= 1
  120.      Do something...
  121.      Sub do something
  122.      Do something static...
  123.      Sub do something static
  124.  */

通过上面的例子相信你应该对java中的static关键字有一些了解了,如果你还是不理解的话建议找一些看看,下面我们来总结一下。
java中static关键字可用于修饰:
1.属性:表示该属性变量在类被加载时即被创建并初始化,类加载过程只进行一次,因此静态变量也只被创建一次,即内存中只有唯一的一个。
2.方法:静态方法为类的公有方法,可直接用‘类名.方法名'访问,也就是说我们不需要创建一个类的对象,就可以直接访问这个类里面的方法。
  这就好比是我们一提到猫,不用去看具体的是哪只猫,就能想到两只眼睛四条腿,还有一个尾巴,这些都是属于猫共有的。
   静态方法不可访问本类中的非静态成员,子类不可。将父类的静态方法覆盖为非静态的,反之亦然。此外,静态方法中不能使用this关键字。
3.代码块:静态初始化代码块,在类被加载时执行一次,可用于类的初始化。比如我们想要在一个类在初始化的时候就要执行一些内容,
  这些内容可以放到静态代码块中。


如果看完上面的内容。



阅读(704) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~