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

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


相关文章
|
17小时前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
4 0
|
2天前
|
Java 数据处理 开发者
Java IO流专家级教程:深入理解InputStream/OutputStream和Reader/Writer的内部机制
【6月更文挑战第26天】Java IO流涉及字节流(InputStream/OutputStream)和字符流(Reader/Writer),用于高效处理数据输入输出。InputStream/OutputStream处理二进制数据,常使用缓冲提升性能;Reader/Writer处理文本,关注字符编码转换。两者都有阻塞IO操作,但Java NIO支持非阻塞。示例代码展示了如何使用FileInputStream/FileOutputStream和FileReader/FileWriter读写文件。理解这些流的内部机制有助于优化代码性能。
|
2天前
|
自然语言处理 Java
Java IO流进阶教程:掌握字节流和字符流的高级用法!
【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。
|
2天前
|
移动开发 前端开发 JavaScript
快速上手web前端开发(超详细教程)
快速上手web前端开发(超详细教程)
|
2天前
|
JavaScript 程序员 应用服务中间件
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(2)
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(2)
17 7
|
2天前
|
XML 存储 JavaScript
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(1)
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(1)
14 5
|
2天前
|
安全 Java 测试技术
开发Java RESTful Web服务的技巧
开发Java RESTful Web服务的技巧
|
3天前
|
Java
win下载安装不同java版本教程
win下载安装不同java版本教程
4 0
|
4天前
|
Java
Java的static关键字详解
Java的static关键字详解
|
4天前
|
XML Java 测试技术
《手把手教你》系列基础篇(八十二)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-上篇(详解教程)
【6月更文挑战第23天】TestNG 是一个用于自动化测试的 Java 框架,它自动生成测试报告,包括 HTML 和 XML 格式。报告可在 `test-output` 文件夹中找到。要创建测试用例,可创建一个实现了 `@Test` 注解的方法。通过 `testng.xml` 配置文件来组织和执行测试。默认报告包括测试结果、失败点和原因。用户还能实现 `ITestListener` 和 `IReporter` 接口来自定义报告和记录器。
22 2