就好像“人”和“张三”的区别一样
要是实现“查找年龄大于30的人”,会在人的对象中实现一个静态方法
要是实现“查找一个人的年龄”,会在人的对象中实现一个非静态方法,在new对象的时候,要指明是哪一个人
还请各位指教
就好像“人”和“张三”的区别一样
要是实现“查找年龄大于30的人”,会在人的对象中实现一个静态方法
要是实现“查找一个人的年龄”,会在人的对象中实现一个非静态方法,在new对象的时候,要指明是哪一个人
还请各位指教
1、对于和一个具体的对象实例有关的,要操作具体实例的参数的情况要用new。比如Integer.intValue(),处理的是一个整数实例,要取得Integer的实例的值。
2、对于和具体势力无关的,不需要取得实例数据的情况用static,比如Integer.parseInt(String str),是所有Integer公有的一个方法,它读取输入的参数而不需要到一个具体实例中去数值。
3、任何可以作成static的方法都可以作成new,但是最好作成static,比如jdk的api里能作成static的地方都作成static了。
1、
》结果是为了几次的调用而让这个static方法在Stack中长期占着资源
不管是static还是new,都少不了把class装载的过程,不同的是,static装载后就直接用,而new则还需要在创建一个instance。我想如果同是装载,那么new的形式,class依然会常驻内存。
2、
》通常的书中举的例子,并没有将它们都实现成static方法,而且看过的众多书中,尤其是老外的书中,静态方法的例子都是少之又少。
通常书中的例子不但没有实现static,有好多例子连class的声明都没有,只是中间一个程序片断。例子只是说明当前章节讲解的内容,至于其他的都是怎么方便怎么来。如果看例子,我觉得java api是最好的例子。
线程执行指令的时候,自带一个线程上下文(context),用来保存局部变量,线程执行完毕,线程上下文就释放掉了。如果你学过计算机原理,懂一点指令系统,就好理解了:
指令有好多种,有无操作数的指令,有立即操作数指令(常量操作数),直接地址指令,间接地址指令,变址指令等等,除了前两种指令外,其它指令的某些操作数部分是动态的,不确定的,只有在指令执行的过程中,才能够计算出来。因此不同的线程虽然读入同样的指令,但是只是指令的操作码和部分操作数相同而已,还有相当多的操作数是不确定的,要在指令执行过程中,计算地址值(实际上就是赋局部变量值),因此不同的线程最终会运行出不同的指令来。指令存放在stack中只有一份,不管是不是静态方法,永远都只有一份(如果由不同的ClassLoader load class,可能会有多份),存在多份的只是线程的上下文而已,当线程执行完毕,线程上下文也不存在了(实际上stack pop了),又怎么会浪费stack资源呢?
考虑是否采用静态方法取决于你对类作用的设计,如果该方法和具体的数据(对象实例)绑定,就用非静态方法,如果该方法是一个通用方法,不和具体的数据绑定,就用静态方法。通俗的来说,静态方法是无状态的,而非静态方法是有状态的。(你可以参考无状态的EJB和有状态的EJB来理解,虽然打的比方并不合适)。
如果上天让我重新选择的话,我会选择律师或者医生的职业。:)
我也碰到过象你这样的朋友,因为Java是一个中间件语言,所以学习Java的人一般会朝两个方向走,一个是以Java为底层,向设计模式、框架 模块方面学习研究,还有一种是从Java向再底层开始研究,最后经常绕在静态方法,单态类,多线程锁定,线程并发访问等非常底层技术的讨论中,当然讨论这些问题有助于理解Java,但是,这些问题不是一下子短期内能完全理解的,J2EE的Servlet技术和EJB技术都是为了避免我们考虑这些底层问题而设定的技术,所以我们在J2EE中使用类时,只要关心一下某些类是否是线程安全就可以。
关于性能提升方面,new一个对象的开销以及使用static的好处在对于整个部分的性能作用是非常小的,因为大家已经知道Java性能相比较差的原因不是解释器等原因,而是面向对象编程缘故,在现代硬件支持下,宁可要慢一点的OO编程方法,都不要速度快的面向过程编程,甚至汇编,这个原因应该知道。
new对象是OO的一个基本特征,不用担心,后面会有对象池等大批缓冲技术来支持它,在一个实用系统中,如Jive,都会实用缓存技术,包括EJB支持对象池、Servlet是线程池,这些都已经综合了new对象的性能开销。
总之一句话,学习java,要向OO高层次学习,学习设计模式、框架、研究重构(refactorying),不要在Java底层技术停留太多,如做一个数据库连接池等,这些都是在浪费时间精力。
将来我想成为布道者,教会更多的人写程序。
就是在第三版102页写道“static方法就是没有this的方法”这句话怎么理解呢