你的位置:首页 > Java教程

[Java教程]有关static静态修饰符的学习心得


初学java,面对着这个static修饰符,愣是琢磨了两天时间,还在今天琢磨透了,现在将悟到的东西记录下来:

  1、static修饰符表示静态修饰符,其所修饰的内容(变量、方法、代码块暂时学到这三种)统称为静态内容(静态变量、静态方法、静态代码块)
 
  2、静态内容是与类相关的内容。解释:静态变量在类加载时就会被分配内存空间,而且只会被分配一次,也就是说静态变量对类内部是共享的,大家都可以去调用访问它,只要在一个调用里改变了它的值,那么所有调用内部的值全部都会被改变。静态方法也是在类加载时就分配了入口地址,而且所有的方法都可以调用它(在不创建对象的前提下)。静态代码块会在类加载时执行一次,且仅仅执行一次。
 
  3、这里针对静态内容,介绍一下非静态内容,作为对比。非静态变量必须在创建对象之后,才会在内存中分配空间,此时才能被调用,非静态方法会在创建对象之后才能利用对象点取调用(即以“对象名.方法()”调用),非静态代码块则在每次创建对象时执行一次,而且是优先执行。这些非静态内容都是与对象相关的内容,都需要在拥有对象之后才能使用,这是与静态内容最基本的区别。
 
  4、现在说说具体的调用细则:所有的静态方法或变量可以被本类或异类中的静态或非静态方法以“类名.变量名”和“类名.方法名()”的格式调用,甚至在本类中调用时,可以省略掉“类名.”,而直接调用,而且坚守【一处改变,处处改变】的原则。
 
  5、所有的非静态变量或方法都可以被本类或异类中的静态或非静态方法以“先创建类的实例对象后,用‘对象名.变量名’和‘对象名。方法名()’”的格式调用,甚至在本类中的非静态方法中可以省略对象实例化过程而直接调用(警告:此处的直接调用与省略调用所调用的变量或方法是不同的,他们在内存中存放在不同的位置,新建对象的内容在对象区域,而直接调用的话是直接对类的属性本值进行操作)
 
  下面是试验代码,(可以直接复制到你的编辑器中试运行):(代码中部分注释为测试内容,可去掉注释查看是否正确)
 1 /** 2 * 不区分本类还是异类,在静态成员被调用必须以类名点取调用,非静态成员必须创建累的实例去调用 3 * 区别: 4 * 1、静态成员的调用: 5 *  在本类(静态与非静态方法)中调用可以省略类名点,直接调用(此处无论是哪里的调用只要改变了属性的值,那么所有的调用都会改变,因为他们都指向内存中的同一个地址) 6 * 2、非静态成员的调用: 7 *  在本类的非静态方法中调用可以省略实例对象的创建,直接调用(这样写不会报错,但是与创建对象再用对象命点用所指向的内容不同了,因为他们指向内存中的不同地址) 8 */ 9 package com.test;10 11 public class StaticTest{12   int a = 1;13   static int b = 2;14   //非静态方法15   void testa(){16     System.out.println("一类中的非静态方法");17     //试验同一类中非静态方法调用静态与非静态变量(方法的调用与变量一样)18 19     //调用本类静态变量(此处省略了类名点取)20     StaticTest.b = 12;21     System.out.println(b);//省略类名点取22 23     //调用本类非静态变量24     //此处可以以创建实例对象的方式调用a变量,但是这样的话这里的a就与直接调用a不同了,前者指的是新建对象的属性a,后者则是类的a属性25 //    StaticTest m = new StaticTest();26 //    m.a = 11;27 //    a = m.a;28     a = 11;29     System.out.println(a);30 31     //调用异类静态变量(此处直接调用会报错)32 //    b2 = 14;//报错33     Qita.b2 = 14;34     System.out.println(Qita.b2);35 36     //调用异类非静态变量(此处直接调用会报错)37 //    a2 = 13;//报错38     Qita x = new Qita();39     x.a2 = 13;40     System.out.println(x.a2);41   }42   static void testb(){43     System.out.println("一类中的静态方法");44     //试验同一类中非静态方法调用静态与非静态变量(方法的调用与变量一样)45 46     //调用本类静态变量47     StaticTest.b = 22;48     System.out.println(b);//此处省略类名点49 50     //调用本类非静态变量51     StaticTest y = new StaticTest();52     y.a = 21;53     System.out.println(y.a);54 55     //调用异类静态变量56     Qita.b2 = 24;57     System.out.println(Qita.b2);58 59     //调用异类非静态变量60     Qita x = new Qita();61     x.a2 = 23;62     System.out.println(x.a2);63   }64   public static void main(String[] args) {65   //静态方法调用本类中的非静态方法66   StaticTest z = new StaticTest();67   z.testa();68 69   //静态方法中调用本类中静态方法70   testb();71   }72 }73 class Qita{74   int a2 = 3;75   static int b2 = 4;76   void testa2(){77     System.out.println("二类中的非静态方法");78   }79   static void testb2(){80     System.out.println("二类中的静态方法");81   }82 }