java中static变量和方法的总结
java中一切皆是对象
一个类中对象的定义一般都是分一下的两步来进行的:
1/ A a; //定义了一个类A的引用
2/ a=new A("10","2563"); //真正地建立了对象a,也就是a指向了内存中一块连续的区域
也就是说通常我们说的创建了一个类,只是指出了这个类的外观和行为,除非用new 创建那个类的一个对象,否则的话,实际上并未得到任何的东西。只有执行了new以后,才会正式生成数据存储空间,并可使用相应的方法。
但是如果我们要只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。或者我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用static(静态)关键字。
一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据。而非静态的方法或者变量就必须知道它们操作的具体对象
下面是java编程思想中的例子和解释:
例如,下述代码能生成一个static数据成员,并对其初始化:
class StaticTest {
Static int i = 47;
}
现在,尽管我们制作了两个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方法作为一个"领头羊"使用,用它生成一系列自己类型的"实例"。
测试例子:
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;
}