转自:http://blog.csdn.net/haobo920/article/details/5921621java
java中static变量和方法的总结编程
java中一切皆是对象测试
一个类中对象的定义通常都是分一下的两步来进行的:
1/ A a; //定义了一个类A的引用
2/ a=new A("10","2563"); //真正地创建了对象a,也就是a指向了内存中一块连续的区域.net
也就是说一般咱们说的建立了一个类,只是指出了这个类的外观和行为,除非用new 建立那个类的一个对象,不然的话,实际上并未获得任何的东西。只有执行了new之后,才会正式生成数据存储空间,并可以使用相应的方法。
可是若是咱们要只想用一个存储区域来保存一个特定的数据——不管要建立多少个对象,甚至根本不建立对象。或者咱们须要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即便没有建立对象,也须要一个能调用的方法。为知足这两方面的要求,可以使用static(静态)关键字。对象
一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一块儿。因此尽管从未建立那个类的一个对象,仍能调用一个static方法,或访问一些static数据。而非静态的方法或者变量就必须知道它们操做的具体对象blog
下面是java编程思想中的例子和解释:内存
例如,下述代码能生成一个static数据成员,并对其初始化:it
class StaticTest {
Static int i = 47;
}class
如今,尽管咱们制做了两个StaticTest对象,但它们仍然只占据StaticTest.i的一个存储空间。这两个对象都共享一样的i。请考察下述代码:
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
此时,不管st1.i仍是st2.i都有一样的值47,由于它们引用的是一样的内存区域。
有两个办法可引用一个static变量。正如上面展现的那样,可经过一个对象命名它,如st2.i。亦可直接用它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用static变量,由于它强调了那个变量的"静态"本质)。
StaticTest.i++;
其中,++运算符会使变量增值。此时,不管st1.i仍是st2.i的值都是48。
相似的逻辑也适用于静态方法。既可象对其余任何方法那样经过一个对象引用静态方法,亦可用特殊的语法格式"类名.方法()"加以引用。静态方法的定义是相似的:
class StaticFun {
static void incr() { StaticTest.i++; }
}
从中可看出,StaticFun的方法incr()使静态数据i增值。经过对象,可用典型的方法调用incr():
StaticFun sf = new StaticFun();
sf.incr();
或者,因为incr()是一种静态方法,因此可经过它的类直接调用:
StaticFun.incr();
尽管是"静态"的,但只要应用于一个数据成员,就会明确改变数据的建立方式(一个类一个成员,以及每一个对象一个非静态成员)。若应用于一个方法,就没有那么戏剧化了。对方法来讲,static一项重要的用途就是帮助咱们在没必要建立对象的前提下调用那个方法。正如之后会看到的那样,这一点是相当重要的——特别是在定义程序运行入口方法main()的时候。
和其余任何方法同样,static方法也能建立本身类型的命名对象。因此常常把static方法做为一个"领头羊"使用,用它生成一系列本身类型的"实例"。test
测试例子:
package moonsoft.test.testDataStructure;
public class TestDriver
{
public TestDriver()
{
}
public static void main(String []args)
{
TestDriver td=new TestDriver();
String month=td.monthName(3);//经过对象调用static method,不建议使用
month=TestDriver.monthName(4);//标准的调用static method
String month1=td.monthName1(3);//经过对象调用非static method 若是须要访问非静态方法的话,能够这样使用
month1=TestDriver.monthName1(4); //此处会出错
/*不经过对象调用非static method:
month1=monthName1(4);// 会出错。。。。。
* Error(14,23): non-static method monthName1(int) cannot be referenced from a static context*/
System.out.println(month+a);//静态方法调用静态变量
System.out.println(month1+a);//静态方法调用静态变量
System.out.println(month+a1);
/*静态方法调用非静态变量
*Error(17,30): non-static variable a1 cannot be referenced from a static context*/
}
public static String monthName(int month)//static method
{
switch ( month)
{
case 1: return "Jan";
case 2: return "Feb";
case 3: return "Mar";
case 4: return "Apr";
case 5: return "May";
case 6: return "Jun";
default: return "others";
}
}
public String monthName1(int month)//not a static method
{
switch ( month)
{
case 1: return "Jan";
case 2: return "Feb";
case 3: return "Mar";
case 4: return "Apr";
case 5: return "May";
case 6: return "Jun";
default: return "others";
}
}
public static int add(int t)
{
int s=t;
s++;
return s;
}
public static double a;
public double a1;
}