Java Web简明教程–Java篇[10]–static和鸡蛋

点此查看 所有教程、项目、源码导航

在前一篇中,使用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太耗费时间和资源了吧,怎么在即安全又不那么浪费资源呢,且听下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员大阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值