自己常常遗忘的东西,基础太重要了啊 java static 理解

原创 2006年06月11日 19:17:00
找到一篇相关文章,写得很清楚,分享一下
对static 修饰符之静态变量和静态方法的理解- -


我们知道,只要是类,无论什么类(包括抽象类),里面只有方法和变量,而要使用这个类我们一般分两步走,如,一个员工类Employee



Employee s;//定义了一个Employee的引用
s=new Employee("Aaron",1980,3,1,1500);//这样才真正建立了一个对象s,也就是说s指向了内存中的一块连续的区域.


—这里注意什么是真正的对象,什么是引用—


如果我们要改变这块区域,需调用其中的方法,如
s.raiseSalary(25);//raiseSalary(double)为Employee 中的方法


这样,我们通过方法(类方法)改变了类中的变量(类数据或类变量).

所谓静态方法,就是通过类名来调用(当然通过类对象来调用一样是可以的,就像core java里说的一样,容易让人混淆!)的方法,
而静态变量它是一种共享变量(VB.net里面如此称呼,比较容易理解).,任何通过类名来调用,都可以改变其值.


关于静态方法(通过类产生的对象)调用静态方法,调用非静态方法(通过类名或都是对象调用)都是可以的,但是,静态方法可以调用静态变量而不可以调用非静态变量(Error(12,30): non-static variable a cannot be referenced from a static context)


以下是thinking in java 里面的关于static 的描述:


2.6.3 static关键字
通常,我们创建类时会指出那个类的对象的外观与行为。除非用new创建那个类的一个对象,否则实际上并未得到任何东西。(注意,这里其实就是说的引用和真正的对象创建问题)只有执行了new后,才会正式生成数据存储空间,并可使用相应的方法。
但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用static(静态)关键字。一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据。而在这之前,对于非static数据和方法,我们必须创建一个对象,并用那个对象访问数据或方法。这是由于非static数据和方法必须知道它们操作的具体对象。当然,在正式使用前,由于static方法不需要创建任何对象,所以它们不可简单地调用其他那些成员,同时不引用一个已命名的对象,从而直接访问非static成员或方法(因为非static成员和方法必须同一个特定的对象关联到一起)。
有些面向对象的语言使用了"类数据"和"类方法"这两个术语。它们意味着数据和方法只是为作为一个整体的类而存在的,并不是为那个类的任何特定对象。有时,您会在其他一些Java书刊里发现这样的称呼。
为了将数据成员或方法设为static,只需在定义前置和这个关键字即可。例如,下述代码能生成一个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方法作为一个"领头羊"使用,用它生成一系列自己类型的"实例"。


以下是我的测试程序:

<pre>

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:
* 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;

}</pre>
其实很简单,随遍写出一个程序测试一下就好了,头脑里一定要清楚地知道静态究竟是怎么回事

DirectX5.0最新游戏编程指南 DirectDraw篇 三、DirectDraw的要素(四)

5、调色板(Palette)    调色表面需要有调色板才能正确地显示出来。一个调色表面(既颜色索引标)是一些数字的简单集合,其中每个每个数字都表征了一个像素。数字的值是一个颜色表的索引,它告诉Dir...
  • holyfire
  • holyfire
  • 2001-04-14 12:59:00
  • 1435

java基础——static深入理解

java中static可以修饰成员变量、方法、类、代码块。 1. static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被sta...
  • liusong0605
  • liusong0605
  • 2015-10-31 23:03:19
  • 1348

学历太重要了!(经典啊)

首先,网上出现了这样一个帖子:   我是博士生,我深知学习的重要性.通过这么多年的学习,我已成功地使自已由一个农家子变成了处级干部,现在不但有专车接我上下班,而且还住着一百多平方的房子月收入达到了三千...
  • Borenbao
  • Borenbao
  • 2006-08-28 14:06:00
  • 1372

学历太重要了!(经典啊)

 首先,网上出现了这样一个帖子:  我是博士生,我深知学习的重要性.通过这么多年的学习,我已成功地使自已由一个农家子变成了处级干部,现在不但有专车接我上下班,而且还住着一百多平方的房子月收入达到了三千...
  • tanghuaan
  • tanghuaan
  • 2008-09-29 21:43:00
  • 578

我也早觉得有写一点东西的必要了

来大学也快两年了,做过的东西也不少,查过的资料也不少,逛过的论坛也不少,印象笔记中的文章都几百篇了。一直以为自己会找点时间去整理,才发现时间都不知去哪了,我觉得还是有必要留下点东西给自己或人类。而不是...
  • kangqingfei
  • kangqingfei
  • 2014-03-30 00:28:04
  • 699

泰坦尼克获救分析--根据寒小阳博客整理

第一次学习如何完成一个机器学习的整体工程,借鉴的是寒小阳关于kaggle上的一个新手初级赛题--泰坦尼克沉船事件。原文链接戳泰坦尼克沉船事件分析--logistic回归。文章中博主提到:『对数据的认识...
  • zhouhong0284
  • zhouhong0284
  • 2018-01-19 16:39:56
  • 121

Java容易遗忘的知识点列表(持续更新)

1. msql有没有跟oracle类似的sequence Oracle 中可以创建 Sequence,下面创建一个 Sequence CREATE SEQUENCE mysequence START ...
  • lsm135
  • lsm135
  • 2017-10-25 21:58:26
  • 285

为什么非常想要一样东西的时候却得不到,但慢慢就不想要了?

http://www.zhihu.com/question/24419624 为什么非常想要一样东西的时候却得不到,但慢慢就不想要了? 1.需求不占主导[1]; 2.平复认知失调[2]; ...
  • stableboy
  • stableboy
  • 2015-03-01 19:46:02
  • 997

Meta标签详解,太重要了

 您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站,人们首先想到的方法无外乎以下几种:    ● 在搜索引擎中登录自己的个人网站    ● 在知名网站...
  • musttieying
  • musttieying
  • 2006-06-01 14:26:00
  • 648

学习太重要了

 在这一年多的时间里更地抓警时间学习了,自己必定一个详细的计划!
  • lrj2005
  • lrj2005
  • 2005-03-25 16:32:00
  • 641
收藏助手
不良信息举报
您举报文章:自己常常遗忘的东西,基础太重要了啊 java static 理解
举报原因:
原因补充:

(最多只允许输入30个字)