安排讨论班讲类和对象的时候顺便提了一下static关键字,自己又去学了一下关于这个的东西,因为一直提到平常写方法尽量不要使用静态方法,对于原因也是一知半解,就好好思考了一下这个事儿。
我们都知道,Java虚拟机在执行代码的时候内存中有四个区域,分别是堆(stack)、栈(heap)、代码区(codesegment)和数据区(datasegment)。简单理解,堆是存放对象的,栈是存放变量的,包括基本数据类型和引用变量,代码区存代码,数据区存放的就是些静态的东西了,常量、静态方法等。
所有用static修饰的东西,不管是变量也好,常量也好,方法也好,都有一个共同的特性就是可以不用通过对象来访问,直接通过类名.来访问就可以,这样在一定程度上会给程序带来很大的便利。比如全局常量,比如工具类中的常用方法,使用static来修饰之后确实便利不少,但是即便如此,在所有Java程序中还是普通方法多,这也是有原因的
- static关键字修饰的东西会占用一定内存,如占用内存过多,将会造成溢出
- 如果所有的方法都设为静态方法,类就没有存在的必要了,不符合面向对象的编程思想
综上两点,在什么时候使用静态方法呢?我的理解是在项目中能够经常用到的方法,比如工具类中的方法,还有要在代码执行前先执行的东西可以放在静态代码块里,普通不常用的方法还是不建议使用static来修饰。
还有一点,有学弟发来一张图片问返回值类型的事情,如图
图中红线代码覆盖了method2();我当时给他解释了返回值类型的事情,然后看到了return this;还是想着谁调用返回谁呗,当时在忙,没有顾得上好好考虑,但是之后再看这段代码,有着很严重的问题啊,首先倒数第二行是直接调用了method2方法,其次是这个方法返回的对象是this,但是问题是这是一个静态方法,又类名直接调用这个方法,如果返回this对象那指向的又应该是谁呢?还有在静态方法中直接不通过对象调用非静态方法这还是我头一次听说,回到宿舍后在IDEA写了一下这段代码是报错的,那就不是我理解的问题了,是这个书上这段代码确实是有问题的,于是问了学弟这是哪本书,答复是《Java从入门到精通》第四版,我已经快从入门到放弃了,百度找这本书的电子书找了好久没找到,第二天直接去图书馆找到学弟看这本书,翻开这一页看到上面有两行字,具体记不清楚了,但是大概意思就是这几行代码在Eclipse里面是会报错的,废话吗这不是…我就说这么权威的书里面怎么会有这么低级的错误,所以自己对于static的理解还是没有什么问题的
- static方法中不能出现this关键字
- static方法中不能直接调用非静态方法
所以在项目中还是慎用static,只有在工具类中才考虑静态方法吧,之后如果有更深层次的理解了再仔细考虑这句话。