在前一篇中,使用static关键字,让程序的运行速度加快了20倍,好的,为了了解到底是什么原因,我们非常有必要简单地了解下static这个关键字。
Java毫无疑问是一门面向对象的语言,所谓的面向对象,猫哥认为就是所有的东西都看成是对象。比如一个来个经典的例子:Student stu=new Student();这个例子猫哥给拆开来讲讲,首先是Student stu;,其中stu是一个引用,它负责保存一个地址,这个没有问题。其次呢,stu是一个Student类型的引用,所以它指向的地址得保存一个Student类型的对象。再次呢,因为Java支持继承嘛,所以stu也可以指向一个Student类的子类的对象(反正都是爷俩,姓是一样的)。
好的,我们定义了一个Student类型的引用,然后给它赋值:stu=new Student();,赋值语句是先计算右边,然后右边计算结果给左边。右边new很厉害,它负责从堆中分配一块空间,好的,它看到空间是Student类型的,所以它就按Student类占用空间大小给划出一块堆来,然后呢new Student()这个语句运算结果是刚刚划出来空间的地址,赋值给stu这个引用,所以stu保存的就是这块空间的地址。
所以,在stu=new Student();之前,是不能调用stu的方法,比如stu.goToSchool();。这个没有意义,stu还没指向地址,它也不知道自己可以goToSchool()。所以会报空指针错误,意思就是stu引用是空的,没指向地址。
OK,事情发展到这里,好像已经很清晰了,所有的东西都是对象,多符合世界的规律。但是还有一个问题,就是先有鸡还是先有蛋的问题。是先有鸡生出了鸡蛋,还是先有鸡蛋孵出来了鸡呢,这个问题无解。OK,在Java里面也是一样的,在程序的开始,是先有的对象调用它的方法呢(但是对象必须在运行的方法语句里产生),还是先有方法产生对象呢(但是方法必须是属于对象的)。
所以说,没有完全的面对对象,一切编程都是有先后顺序的,所谓的先后顺寻我们就可以认为是面向过程。OK,Java设计者也认识到了这一点,所以引入了static关键字。
使用static关键字有两个主要用途:
1,修饰成员变量。
2,修饰成员函数。
当static修饰成员变量时,跟常规的成员变量有如下区别:
public class Student { int var;//成员变量,当Student类实例化对象时,每个对象都包含一个var属性 static int staticVar;//静态变量,所有Student类共享一个staticVar,可以使用类名访问,也可以使用对象名访问 }
OK,说白了,静态变量跟所属类基本没关系,它只是借助类或者类的对象来访问这个静态变量,属于挂靠关系,除此之外,就没关系了。
当static修饰成员方法时,那就是更单纯的挂靠关系了,所以直接就别提什么静态成员变量、静态成员方法了,它就不是类的成员,直接称呼为静态变量、静态方法反而更合适。
所以,实际上是这样运作的:
public class Student { int var;//成员变量,当Student类实例化对象时,每个对象都包含一个var属性 static int staticVar;//静态变量,所有Student类共享一个staticVar,可以使用类名访问,也可以使用对象名访问 public static void test(){//测试 staticVar=1;//这个是对的,test()是静态的,属于全局,可以访问到Student.staticVar,而且它俩都是挂靠Student,理论上属于同一部门,所以可以省略Student. var=1;//这个是错误的,var现在都没有实现呢,它属于谁?对象都没有哪里来的对象的成员。 Student stu=new Student(); stu.var=1;//这样写是对的,刚刚给stu分配了空间,所以stu具有var这个成员变量 stu.staticVar=2;//这样写也是对的,静态变量可以使用类名或者对象名访问,但是都是一个值。所以执行这一句后staticVar的值从1变为了2 } }
现在还要说明一个问题:
public class Student { int var;//成员变量,当Student类实例化对象时,每个对象都包含一个var属性 static int staticVar;//静态变量,所有Student类共享一个staticVar,可以使用类名访问,也可以使用对象名访问 public static void test(){//测试 } public static void main(String[] args){ } }
test()和main()其实是一个类型静态函数,但是main()是入口而test不是,为啥,Java语言规定,如此而已。
好了,扯了这么多,基本上猫哥想表达的,关于static的意思都说完了。现在回到上一篇,使用静态的方式,速度提高了20倍:
public static MysqlHandler hand=new MysqlHandler(); public static Connection con=hand.buildConnection();//建立连接 public static ResultSet rs;//可以使用多次
首先有一点,因为静态的变量hand 、con、rs一直存在,不用反复的new分配空间,所以节省了时间。另外不用每次Connection con=hand.buildConnection();//建立连接,节省了很多时间,猫哥个人感觉告诉自己,应该是第二个节省时间多,因为Java new操作,是Java语言自家的事情,而建立连接,每次都是要跟数据库去接触,自己家干事,总比跨部门协作简单快速吧,应该是这样的。
OK,那既然static的方式快速,那何不大家都用static。哈哈,但是static的变量全局共享这一个啊,你想想咱的网页是要很多人访问的,如果大家都用一个static,它得多忙,忙中出错了吧要。所以比较理想的方式是每次有人访问需要连接数据库获取数据,就new 一个connnection,这样不就安全了。但是每次都new太耗费时间和资源了吧,怎么在即安全又不那么浪费资源呢,且听下回分解。