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


相关文章
|
8天前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
|
29天前
|
网络安全 开发工具 数据安全/隐私保护
|
11天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
35 4
|
13天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
14天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
14天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
14天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
18天前
|
存储 Java
Java 中的静态(static)
【10月更文挑战第15天】静态是 Java 语言中一个非常重要的特性,它为我们提供了一种方便、高效的方式来管理和共享资源。然而,在使用过程中,我们需要谨慎考虑其优缺点,以确保代码的质量和可维护性。
|
23天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
61 2
|
30天前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
28 3