静态的方法是不用New Instance的,那么实际上可以说这个方法和具体的对象实例是没有关系,它不代表一个具体的对象的操作;而非静态的方法和实际的,具体的对象是相关的。

就好像“人”和“张三”的区别一样

要是实现“查找年龄大于30的人”,会在人的对象中实现一个静态方法
要是实现“查找一个人的年龄”,会在人的对象中实现一个非静态方法,在new对象的时候,要指明是哪一个人

还请各位指教

不错大家的思想基本上统一了。

1、对于和一个具体的对象实例有关的,要操作具体实例的参数的情况要用new。比如Integer.intValue(),处理的是一个整数实例,要取得Integer的实例的值。

2、对于和具体势力无关的,不需要取得实例数据的情况用static,比如Integer.parseInt(String str),是所有Integer公有的一个方法,它读取输入的参数而不需要到一个具体实例中去数值。

3、任何可以作成static的方法都可以作成new,但是最好作成static,比如jdk的api里能作成static的地方都作成static了。

前两条我认同。
但第三条,我有不同的看法。
很多类都没有实例变量,尤其是Web application中的一些Helper类,仅和request参数有关,通常的书中举的例子,并没有将它们都实现成static方法,而且看过的众多书中,尤其是老外的书中,静态方法的例子都是少之又少。
static方法的效率高,我也不怀疑,只是我也拿不出具体的例子向置疑的人证明,我很郁闷。
另一方便,天下没有免费的午餐,static方法效率高必然有其他的代价付出,比如一个方法我用到的时候很少,只是因为可以实现成static的,就static了。结果是为了几次的调用而让这个static方法在Stack中长期占着资源,这不也是浪费吗。如果实现成instance的,由于没有什么实例变量需要访问,new的时候花费也相对少的多,总体看了,我想可能是便宜了。

我的理解如下:

1、
》结果是为了几次的调用而让这个static方法在Stack中长期占着资源

不管是static还是new,都少不了把class装载的过程,不同的是,static装载后就直接用,而new则还需要在创建一个instance。我想如果同是装载,那么new的形式,class依然会常驻内存。

2、
》通常的书中举的例子,并没有将它们都实现成static方法,而且看过的众多书中,尤其是老外的书中,静态方法的例子都是少之又少。


通常书中的例子不但没有实现static,有好多例子连class的声明都没有,只是中间一个程序片断。例子只是说明当前章节讲解的内容,至于其他的都是怎么方便怎么来。如果看例子,我觉得java api是最好的例子。

一个被声明为static的方法可以被看作是class的方法而不是class instance的方法。但是一个static method并不意味着浪费资源,因为其内的变量不是static的。当此方法调用结束后,方法内的变量占用的资源将被释放。

我说过n次了,方法就是指令代码,试问指令代码能占多少资源呢?你写的指令能有几十MB吗?你如果连指令代码都不让常驻在stack中,还有什么东西值得放在stack中呢?不管是不是静态方法,只要被调用一次,就会被load进入stack,都一样要常驻在stack中,你想不让它常驻stack都做不到,这没有任何区别,唯一区别就是非静态方法可以访问heap中的对象实例而已。

线程执行指令的时候,自带一个线程上下文(context),用来保存局部变量,线程执行完毕,线程上下文就释放掉了。如果你学过计算机原理,懂一点指令系统,就好理解了:

指令有好多种,有无操作数的指令,有立即操作数指令(常量操作数),直接地址指令,间接地址指令,变址指令等等,除了前两种指令外,其它指令的某些操作数部分是动态的,不确定的,只有在指令执行的过程中,才能够计算出来。因此不同的线程虽然读入同样的指令,但是只是指令的操作码和部分操作数相同而已,还有相当多的操作数是不确定的,要在指令执行过程中,计算地址值(实际上就是赋局部变量值),因此不同的线程最终会运行出不同的指令来。指令存放在stack中只有一份,不管是不是静态方法,永远都只有一份(如果由不同的ClassLoader load class,可能会有多份),存在多份的只是线程的上下文而已,当线程执行完毕,线程上下文也不存在了(实际上stack pop了),又怎么会浪费stack资源呢?

考虑是否采用静态方法取决于你对类作用的设计,如果该方法和具体的数据(对象实例)绑定,就用非静态方法,如果该方法是一个通用方法,不和具体的数据绑定,就用静态方法。通俗的来说,静态方法是无状态的,而非静态方法是有状态的。(你可以参考无状态的EJB和有状态的EJB来理解,虽然打的比方并不合适)。

哦!非常感谢。
呵呵,俺就是半路出家的,我的专业是做化妆品,改行编程。
只是听过计科系的计算机组成原理和数据库系统概论。
后来就毕业了,没来得及听更多的计科系课程。
不过,话又说回来了,如果让俺再选一次专业,我就选择动物或者植物学,研究大自然。

robbin说的靠谱~~~~~~~

我也不是计算机专业科班出身啊,我学的专业是技术经济,但这不妨碍我自学计算机专业课程。说实话,有几门核心计算机专业课看起来好像没什么实用价值,其实却能够奠定良好的专业素养,缺了这些东西,是不可能成为真正的高手的。我觉得起码这些课程应该学习一下:
数据结构、数据库系统原理、计算机组成与结构,系统结构、编译原理、离散数学、汇编语言。如果搞硬件还得看看数字逻辑。特别是计算机组成与结构,计算机系统结构,让我大开眼界。有了这些基础,理解其它的都容易了。

如果上天让我重新选择的话,我会选择律师或者医生的职业。:)

to mellon
前两条我认同。
>static方法的效率高,我也不怀疑,只是我也拿不出具体的例子向置疑的>人证明,我很郁闷。
>另一方便,天下没有免费的午餐,static方法效率高必然有其他的代价付

我也碰到过象你这样的朋友,因为Java是一个中间件语言,所以学习Java的人一般会朝两个方向走,一个是以Java为底层,向设计模式、框架 模块方面学习研究,还有一种是从Java向再底层开始研究,最后经常绕在静态方法,单态类,多线程锁定,线程并发访问等非常底层技术的讨论中,当然讨论这些问题有助于理解Java,但是,这些问题不是一下子短期内能完全理解的,J2EE的Servlet技术和EJB技术都是为了避免我们考虑这些底层问题而设定的技术,所以我们在J2EE中使用类时,只要关心一下某些类是否是线程安全就可以。

关于性能提升方面,new一个对象的开销以及使用static的好处在对于整个部分的性能作用是非常小的,因为大家已经知道Java性能相比较差的原因不是解释器等原因,而是面向对象编程缘故,在现代硬件支持下,宁可要慢一点的OO编程方法,都不要速度快的面向过程编程,甚至汇编,这个原因应该知道。
new对象是OO的一个基本特征,不用担心,后面会有对象池等大批缓冲技术来支持它,在一个实用系统中,如Jive,都会实用缓存技术,包括EJB支持对象池、Servlet是线程池,这些都已经综合了new对象的性能开销。

总之一句话,学习java,要向OO高层次学习,学习设计模式、框架、研究重构(refactorying),不要在Java底层技术停留太多,如做一个数据库连接池等,这些都是在浪费时间精力。

我一直是这样想的,也一直是这样作的。
只是,高手嘛,自然要能够服人才行,别人问问题能给出直接了当的答案往往比说这个问题你不需要知道更具说服力,也更具亲和力。
假如我们一直走的都是朝天大路,诚然能最快的品尝到高手能摘取的东西,但是当面临那些走在荆棘小道上的朋友的问题时,束手无策好像也不好,至少我希望高手能像站在山颠一样,大路小路了然于胸,上上下下无所不通。
每个人走的路不同,有的人研究swing,有的人研究servlet,ejb,高屋建瓴的指导性回复往往需要以被认同,被尊敬为基础。否则,我看只有从提问者的思维出发在他的世界里找到答案,呵呵。

将来我想成为布道者,教会更多的人写程序。

近期自己在研究java编程思想,是第三版的

就是在第三版102页写道“static方法就是没有this的方法”这句话怎么理解呢

static不用创建对象的实例,当然也就没有this了

没有new,当然没有this.

this就是指当前类的一个实例(对象)