java学习心得

本文由junpeng258贡献

doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 java 是一种面向对象语言,真正的面向对象,任何函数和变量都以类(class)封装起来 java 所有的源码以及编译后的文件都以类的形式存在 java 没有所谓的类外部定义,所有的函数(方法)以及变量(属性)都必须在类内部定义 java 完全屏蔽了指针,同时引入了垃圾回收机制,它完全屏蔽了内存管理 java 其实也无法保证程序不去调用空的指针,但是它会在最大程度上避免空指针的调用 虚拟机跨平台,这是 java 最大的特点 java 可以做到在 windows 上编译,然后在 unix 上运行 在这三个 J2*E 中 J2SE 是基础,就是 java 2 的标准版(java 2 standard edition) 也就是最基础的 java 语言部分,无论学什么 java 技术,J2SE 都是必须掌握的 要使用 J2SE 就必须安装 JDK(java development kit) JDK 包含有五个部分: 核心 API, 集成 API, 用户界面 API, 发布技术, java 虚拟机 有 (JVM) 运行环境最主要要说的就是 java 虚拟机(JVM) java 是跨平台的语言,那么如何做到跨平台呢?java 的设计者们提出了一个虚拟机的概念 在操作系统之上建立一个统一的平台,这个平台必须实现某些功能以支持程序的运行 如下图: | program | | JVM | | UNIX | Windows | Linux | Solaris |.. 程序员所写的每一个程序都先运行在虚拟机上 所有操作都必须经过虚拟机才能和操作系统交互 这样做不仅统一了所有操作系统,同时也保证了操作系统的安全 要死机的话,死的是虚拟机(JVM)而操作系统并不会受此影响 JDK(java development kit)的 API,用 JDK 来包括运行环境以及开发工具 那么什么是 API? 简单地说就是 Application Programming Interface,应用程序编程接口 在 java 里面,就是一些已经写好了的类打成的包 包就是类的集合,一个包包含零个或多个类,这些类是 java 的基础类,常用的类,可以简 单理解成 java 的工具集 JDK 的发布技术,讲白了就是编译器 将.java 文件转换成.class 文件的一种技术 这三部分组成了 JDK,有了 JDK,就可以开发出 J2SE 应用软件了 最原始的只要用一个记事本写几行代码就可以了 但一般来说我们会使用效果比较好的开发工具,也就是 IDE

在 J2SE 这一块,特别推荐 JCreator 这款 IDE java 企业级应用分为硬件篇和软件篇 重点在软件,硬件是外延,严格地说与 java 没有必然联系 硬件是软件的基础 硬件,简单地说就是我们实际生活中看得见摸得着的东西 也就是那些冰冷的机器,比如服务器,个人电脑还有网络交换机,路由器等等 简单划分为:服务器,工作站还有微机 服务器(server) 服务器涵盖了几乎所有的大型机以及大部分中型机甚至一些小型机 比如提供门户站点相关服务(sina) ,比如电子商务(ebay,阿里巴巴) 这些服务对机器都有一些特定的要求,尤其强调安全和稳定 工作站(workstation) 工作站其实是图形工作站的简称,说白了,就是某种功能极其强大的计算机 用于特定领域,比如工程设计,动画制作,科学研究等 个人电脑/微机(pc) 计算机网络的最末端 说完了分类,我们就来说说各个硬件供应商 首先是服务器还有工作站 这两类硬件供应商主要是以下三家:Sun,IBM 还有 HP(惠普) 然后是网络,也就是路由器和交换机:Cisco(思科)Brocade(博科)还有 McDATA 三足鼎立 内核(CPU) PC 内核:主要是 AMD 和 Intel, 所谓软件通俗地说就是一套计算机程序,实现了某些功能的计算机程序 在很早很早以前,一台计算机的软件是不分层次结构的,一台计算机只有一个系统,这个系 统既是操作系统又是应用软件,与硬件紧密绑定 后来经过许多年的发展, 人们把一些与硬件紧密相连的又经常用到必不可少的功能做到一套 程序中去,这一套程序就被人们称做操作系统 另外一些可有可无的,不同工作适应不同环境的功能封装到另外一套程序中去 而这一系列程序被人们称作应用软件 如下图: |应用软件:falshgat/IE/realplayer/winamp..|

|操作系统:UNIX/Windows/Linux/Solaris……

|

硬件分为服务器工作站与 pc,其实无论哪种硬件的软件,都有操作系统与应用软件 在现在企业级应用中,我们的应用软件一般分为三层:表示层,业务逻辑层,数据持久层 我们来说说三层中的代表软件 表示层 这一层一般在客户端 pc 机上,最常见的是 IE 浏览器,这就是表示层的软件 表示层是直接与使用者交互的软件 业务逻辑层 这一层一般在服务器端,所有业务逻辑处理都在这一层完成 最典型的是 appserver,比如 IBM 的 websphere,BEA 的 weblogic 还有 tomcat/jboss 等 这一层也是三层中的重点, 我们要说的大部分内容都是关于这一层的, 这一层就叫做中间层 数据持久层 这一层典型的就是数据库,一般也在服务器端 但该服务器一般与装业务逻辑层软件的服务器分开 这一层要做的就是保存数据,业务逻辑层软件一般不负责保留数据 或者说业务逻辑层只负责暂时储存数据,一关机,业务逻辑层数据全部 over 了 那么数据的持久化(也就是储存数据)就必须要在这一层完成 中间件是业务逻辑层的应用软件,是处理业务数据与客户端之间业务逻辑的一种应用软件 一种提供网络服务的服务器端应用软件 举个非常简单的例子,网上银行,某个人想用 IE 进入工行的账户,然后转帐,在这个例子 中,客户端表示层显然是 IE,数据持久层显然是银行的核心数据库 那么中间件是什么?中间件就是提供这种服务的系统 这三层的划分如下 |表示层 | 业务逻辑层 | 数据持久层 | | IE | 网上银行 | 数据库 |

下面重点介绍一下中间件,也就是业务逻辑层的软件结构 java 程序是跑在虚拟机之上的 也就是说操作系统先运行一个 java 虚拟机,然后再在虚拟机之上运行 java 程序 这样做的好处就是安全,一旦出现病毒或是其他什么东西,挂掉的是虚拟机,操作系统并不会受多大影响

我举出四组工程师:网络工程师,数据库工程师,操作系统工程师以及设计网上银行系统的业务工程师 每个项目都需要,我们是不是可以用一个产品来取代这三组的工程师呢? 我们的业务工程师只需要遵循这个产品所提供的接口,进行相应的开发就行了 人们提出了一种叫做 appserver 也就是应用服务器的东西 应用服务器是干什么的?按官方的说法,应用服务器是包括有多个容器的软件服务器

什么是组件?组件其实就是一个应用程序块,但是它们不是完整的应用程序,不能单独运行 就有如一辆汽车,车门是一个组件,车灯也是一个组件,但是光有车灯车门没有用,它们不能跑上公路 在 java 中这些组件就叫做 javabean 特别说明的是,由于任何一个 java 文件编译以后都是以类的形式存在,所以 javabean 肯定也是一个类

容器里装载的是什么呢?就是这些组件,而容器之外的程序需要和这些组件交互必须通过容器 举个例子,IE 发送了一个请求给容器,容器通过调用其中的一个组件进行相关处理之后,将结果反馈给 I E,这种与客户端软件交互的组件就叫做 servlet

但是组件有很多种,那么如何区分这些组件呢? 有多种管理办法,比如同是同样是 servlet,有些是通过 jsp 生成的,而有些是开发人员自己写的 通过 jsp 生成的 servlet 集中放在一个地方,而开发人员自己写的则需要在 xml 里面配置一些基本的参数 同时,不同组件有可能还需要继承一些特定的父类或者接口,这也是容器管理的需要

那么容器有很多种,按照他们装载的组件类型划分 比如有装 ejb 的 ejb 容器,有装 servlet 与 jsp 还有静态页面的 web 容器等等 //这种只含有 web 容器的应用服务器也被叫做 web 服务器 当表示层的应用软件通过网络向 appserver 发送一个请求的时候 appserver 自动找到相应容器中的组件,执行组件中的程序块,把得到结果返还给客户 而我们要做的事就是写组件也就是 javabean,然后放到 appserver 里面去就可以了

appserver 与其他相关软件的关系如下图: | 表示层 | 业务逻辑层 | 数据持久层 | | | | | | | client IE | | -> <| javabean | | | -> DB | | | | | |

appserver <-

|| | 虚拟机 |

||||

|

Windows

|

Linux/Saloris

|LinuxSaloris|

|||| 图上可以看出:虚拟机负责处理中间件与操作系统之间的交互,appserver 则负责组件的管理以及与其他两 层的业务交互

要说明的是上图中还包含有应用程序客户端容器(Application client container) ,管理应用程序客户端组件 的运行,应用程序客户端和它的容器运行在客户机,这种情况比较复杂一般说的是两个 server 之间的通讯 比如 jsp/servlet 容器在一个服务器上,而 ejb 容器在另外一个服务器上,这是分布式操作系统大面积应用的 基础

什么是中间件? appserver 就是所谓的中间件,但是中间件不仅有 appserver,还有其他的东西 换句话说,appserver 只是中间件的一种 而关于中间件有诸多规范以及遵循这些规范的模型,最流行的规范无非两种,一个是 j2ee 还有一个是.net

那么各大公司关于这两套规范各有什么产品以及周边呢?

j2ee: 黄金组合 操作系统:Solaris 应用服务器:Weblogic 数据库:Oracle 开发工具:JBuilider/IntelliJ IDEA

优点:性能一级棒,大企业大公司做系统的首选,世界五百强几乎都是这套组合 缺点:极贵

超级组合,也是最安全最酷的黄金组合,硬件采用 SUN 公司的机器 SUN 的服务器支持 Solaris 的效果自然不用说,Solaris 号称是世界上最安全的操作系统 Oracle 也是世界上最安全,性能最优的数据库,Weblogic 是当今性能最优的 appserver JBuilder 和 IDEA 各有所长,JBuilder 是 Borland 公司的招牌之一 ,是当今世界上最流行的 java IDE,用 d elphi 写的,IDEA 拥有插件功能,界面在所有 java IDE 中最为漂亮,用 java 写的 价格方面,Solaris 开源,但是 SUN 的服务器比较贵,Weblogic 最高是 34 万 oracle 标准版要 18.6 万,企业版要 49 万,JBuilder 要 2.7 万左右 IDEA 零售价大概是 500 美金,也就是 5000 多元

开源系列 应用服务器:JBoss 数据库:MySql 开发工具:Netbeans

优点:便宜,性能未必最佳,但是对付中小企业足够了

java 阵营最大的特色,免费,还有在开发工具这一栏 Eclipse 也是免费的 tomcat 仅有 web 容器而没有 ejb 容器,而 jboss 已经集成了 tomcat 下载了 jboss 之后,启动的同时也就启动了 tomcat,jboss 在 tomcat 基础之上多加了一个 ejb 容器 使得 jboss+tomcat 成为和 weblogic,websphere 之外又一个得到广泛应用的 appserver 现在大概是这样,中小型企业多用 jboss,如果应用小一点就用 tomcat 只有给那些大型企业做的项目,才会花钱去上一个 weblogic 或者 websphere 开发工具方面,netbeans 是 sun 公司极力推广的一种 IDE

IBM 套餐 操作系统:Linux 应用服务器:Websphere 数据库:DB2 开发工具:Eclipse/WebSphere Studio

优点:服务好,IBM 可以提供全套服务,也可以替客户承担风险 缺点:把机器数据全部交给 IBM,安全什么的都由不得你了

价格方面,Linux,DB2,Eclipse 都是开源产品,Websphere 目前零售价是 33.8 万人民币

.net: 微软阵营 操作系统:Window s 应用服务器:.net 应用服务器(IIS) 数据库:

SqlServer 开发工具:MS Visual Studio 优点:客户端的用户体验良好,和客户端诸多微软产品的兼容性强 缺点:离开了微软,寸步难行,和其他任何一家公司的产品都不兼容 在其传统领域,比如写一些桌面软件等客户端应用上,.net 还是第一选择 由于 J2EE 得到了绝大多数 IT 企业的支持以及 JAVA 跨平台的特性 我们可以自由地定制个性化的组合 windows+jboss+eclipse+oracle solaris+websphere+IDEA+mysql 还有就是遵循 j2ee 规范的所有的组件都可以在不同的应用服务器上互相移植 比如可以在测试的时候用 jboss,而在正式投产上线的时候使用 websphere,只需要在配置文 件中作相应改动即可 Java 之父 James Gosling JavaBean 是什么? 咖啡豆 用 java 语言编写的可重用的软件组件 将 javabean 放入杯子//容器 就可以冲泡//编译 成咖啡,供客人们品尝//运行 容器从某种意义上说其实就是一个可运行的 java 写的应用程序 犹如 c++/c 编译后生成的.exe 文件 不同的是 java 编译后的文件需要用命令行或者脚本启动执行 由于容器是由 java 写的,所以容器都能够跨平台 但是大部分容器都针对不同的操作系统提供了不同的版本 但可以肯定的一点是,相同容器间的移植组件不需要重新编译 Servlet web 容器组件 Servlet 就是 web 容器运行的 java 组件,Servlet 定义了一系列方法,如 init()和 destroy() , 供容器调用,调用的主要目的是为了管理 当一个 request 请求被 web 容器截获之后,容器分析该请求地址,然后通过一个配置文件中 的映射表 web.xml,调用相应的 Servlet 组件处理后将结果返还给客户端

Oak//橡树

JSP//Java Server Page

web 容器组件 JSP 将 java 代码嵌入 html 代码内部 然后存成.jsp 文件,再由计算机编译生成 Servlet 储存起来 所以 JSP 和 Servlet 对于 web 容器来说其实是一种东西, 虽然它们编写遵循的标准有所不同 极大地简化了代码同时增加了代码的可读性,生产维护成本下降

EJB//Enterprise JavaBean ejb 容器组件 普通的 JavaBean 似乎并不能满足企业级应用的需要 最典型的就是虚拟机提供的垃圾回收收集机制也就是 GC 不够完善,可以优化的余地极大 EJB 和其它组件一样,不过遵循了某些规范而已 但是这些规范更多的是为充分利用机器并提高性能为主要目的 ejb 容器每天在干的事:管理内存中活跃的对象

JDBC 和数据库的连接 AppServer 不知道什么时候组件需要用到数据库 同时也需要开发人员告诉 AppServer 他们使用的是什么数据库,ip 地址等等 JDBC 就是关于这一套东西的规范,包括数据库的产商应提供什么样的接口 AppServer 应用服务器应该如何去连接,开发人员应该如何去配置这些连接等等

framework

框架就是那么一个通过预先写好代码从而帮我们建立起一个软件结构的这么一个东西 框架与规范//主要指 J2ee 规范也就是官方标准的区别 从某种意义上说,J2ee 规范本身就是一个框架 无论是 web 容器也好,还是 ejb 容器也好,它们都开发了一部分通用的代码 并且帮助我们搭建起来了一个软件结构,我们要做的就是往里面填入组件,比如 ejb/servlet/jsp 等等 框架是建立在规范之上的一种东西 可以说是标准的延续,或者说是民间的尝试,总之是这么一个非官方的东西

Struts 表示层框架,名字来源于飞机的金属框架 最早表示层说的是客户端,后来随着时间的发展人们也把服务器端直接与客户端//比如 IE 打交道的那部分 也称为表示层//JSP+Servlet 那么表示层框架是干什么的呢? 把表示层组件分为 V-Viewer,也就是 JSP;M-Model 模型,一般来说是一个 JavaBean;C-Controller 控制器, 一般来说是一个 Servlet 所有人通过 JSP 和服务器打交道,发送请求,Viewer 把这个请求转发给 Controller,Controller 通过调用一

个 Model 来处理该请求,然后返回数据到 Viewer,从而达到数据与逻辑的剥离,增强代码可读性,降低维 护成本 对于这一层来说,在 JSP 的 html 代码中出现的 java 语句越少越好 因为 java 代码越少说明页面处理的业务逻辑越少,也越合理,这也是 Struts 最初的目的

Spring Spring 起源于 Rod Johnson 的《Expert One-on-One J2EE Design and Development》一书 Rod Johnson 认为,J2ee 里面的那一套//尤其是 ejb 太重了,对于单机的系统来说,没有必要使用那么复杂 的东西,于是就开始设计并引导 Spring 小组开发出这样一个构架 Spring 从诞生之日起就是针对 EJB 的,力争在不少应用上取代 EJB 现在包括 WebLogic 等主流应用服务器还有主流 IDE 都开始逐渐接受该框架,并提供相应支持 提到 Spring 就不能不说控制反转 Ioc//Inversion of Control 和依赖注射 DI//Dependency Injection 什么叫控制反转呢? 什么意思呢? 就好比一个皇帝和太监,有一天皇帝想幸某个美女,于是跟太监说,今夜我要宠幸美女,皇帝往往不会告 诉太监,今晚几点会回宫,会回哪张龙床,他只会告诉太监他要哪位美女,其它一切都交由太监去安排, 到了晚上皇帝回宫时,自然会有美女出现在皇帝的龙床上,这就是控制反转,而把美女送到皇帝的寝宫里 面去就是注射,太监就是是框架里面的注射控制器类 BeanFactory,负责找到美女并送到龙床上去,整个后 宫可以看成是 Spring 框架,美女就是 Spring 控制下的 JavaBean

而传统的模式就是一个饥渴男去找小姐出台,找领班,帮助给介绍一个云云,于是领班就开始给他张罗 , 介绍一个合适的给他,完事后,再把小姐还给领班,下次再来,这个过程中,领班就是查询上下文 Contex t,领班的一个职能就是给客户找到他们所要的小姐,这就是 lookup()方法,领班手中的小姐名录就是 JNDI //Java Naming and Directory Interface,小姐就是 EJB,饥渴男是客户端,青楼是 EJB 容器

看到区别了么?饥渴男去找小姐出台很麻烦,不仅得找,用完后还得把小姐给还回去;而皇帝爽翻了,什 么都不用管,交给太监去处理,控制权转移到太监手中去了,而不是皇帝,必要时候由太监给注射进去就 可以了 看到 Spring 的美妙了吧,Spring 还提供了与多个主流框架的支持,可以和其它开源框架集成

Hibernate 名字取材自 ORM 最早的一句玩笑话//ORM 就是 OR-Mapping, 说用了 ORM 之后, 程序员就可以去冬眠了, 而不需要操心那么多事,这里不得不说的是,该框架由于做得太好,以至于被 J2ee 招安,成为 EJB3.0 的 一部分,替代原有 EJB2.X 里面关于 Entity Bean 而成为 EJB ORM 的工具

这里解释一下 ORM//OR-Mapping 中文名对象关系映射 什么意思呢?传统的数据库都是关系型的, 一条条记录以表格的形式储存, 而表与表之间充 斥着是关系/关联,比如说一个人,名字 zhaoce,性别男,年龄 23 那么数据库中是这么储存

的 姓名 性别 年龄 zhaoce m 23 某女 f 22 而实际应用服务器中的实体都是以对象的形式存在,一个个对象 zhaoce 是以这种形式存在的 Human human=new Human(); human.setName("zhaoce") human.setSex("m"); human.setAge(23); 这样的,那么我们知道,传统的 JDBC 是通过一个二维字符串将数据取出,需要我们自己将 其包装成对象,在存入的时候,我们还需要将对象拆开,放入 sql 语句中//Insert into Huam n values('zhaoce','m',23),然后执行该 sql 语句,太麻烦,ORM 理念的提出改变了这一切,O RM 认为,这些东西应该由框架来做,而不是程序员,于是就出现了 Hibernate,JDO,Top Link 等等,甚至.net 里面也有 ADO.net Hibernate 逐渐成为主流并被官方接纳成为规范标准之一,替代掉原来 EJB2.X 的 ORM Enti tyBean TopLink 则是 Oracle 公司推出和 Oracle 数据库结合的一种 ORM 商业用软件,贵且复杂,不 过正在逐渐开放 而象表示层一样, 这一种专门面对数据层的代码也被称为数据持久层, 所以数据持久层这一 概念有时不仅仅指代数据库 关于 ORM,最高的境界应该是在 java 代码中不出现任何一句的 sql 语句 注意,

是不包括 sql 语句,Hibernate 的 hql 以及 ejb 的 ejb-ql 不算在内 至于出现不出现 hql/ejb-ql 等替代 ql,这要视具体情况而定,不过最好也是不出现 当然最后所说的过分理想的情况往往不现实,总之一句话 以 sql 为代表的 ql/*还有 hql,ejbql 等*/语句在代码中出现得越少越好 要指出的是框架不是应用程序, 只是一堆组件的有序复合, 应用时不能脱离于应用服务器单 独存在

设计模式 模式是什么?模式是经验的总结,潜规则的抽象 模式是编程高手之间交流的桥梁 两个编程高手通过统一命名的模式了解对方的思想 面向对象有常用的 21 种模式,需要掌握,主要分为创建,行为,结构三类 J2ee 有 J2ee 的模式,Sun 公司出了一本书叫《J2EE 核心模式》可以拿来看看 必需要指明的是,模式不是规范,只要你愿意,你就可以不遵循模式 模式之外还有反模式,学模式不可定势,不要学死,活学活用,无招胜有招才是最高境界 JavaDoc

文档工具,极其好用,可以根据注释自动生成 HTML 文档

Ant 创建者:James Duncan Davidson 组织管理工具,可以这么描述它 比如你想在编译之后自动再次生成 JavaDoc 那么你只需要编辑 Ant 脚本//对,就像 Windows 脚本那样,然后批处理就可以了,不过现在 Ant 已经广泛 集成到 IDE 中去,不需要自己手动编写 JUnit 测试工具,Unit 家族可不只有 JUnit,还有其它版本的

POJO //Plain Old Java Object 就是传统的 Java 对象,也就是一个 JavaBean,由虚拟机来掌握其生死 常用的两个管理构架/规范是 Spring 和 EJB 容器 由于这种东西缺乏管理,不象 Servlet 有专门的容器管理并继承了一定的类 而没有管理的对象在虚拟机中是很危险的,因为垃圾回收机制各个虚拟机不同,而且也不怎样,极有可能 长时间不回收,这样在企业级的应用中就有可能造成内存大量被占用从而死机,毫无疑问,这种机制需要 优化,这种优化就是通过 EJB 容器或者 Spring 构架来实现,这么做还有一个好处就是迫使程序员对每一个 类做封装,强迫他做管理,以达到防止内存泄露的目的,内存泄露最经常出现的错误就是引用未释放,引 用最典型体现在 new 这个关键字上,new 得越多引用得越多,随着时间地增长,有可能导致循环,不停 ne w,其中哪怕只要有一个 new 处理不当,虚拟机无法回收内存,那就极有可能完蛋,而且这种小 bug 越是 在大的项目越是难以找到,有可能因为一个人而影响整个项目组,所以不妨记住我的一条经验:好的系统 框架不应该在业务逻辑流程中出现 new 关键字

SOA 面向服务的构架,这个属于上上层建筑 面向什么就是对什么做封装,面向对象就是对对象做封装,面向服务类似,剩下的靠悟性

反射 1.4 新增功能,通过反射,程序可以解析出类本身的属性也就是变量 还有行为也就是方法,然后通过 invoke()方法调用该方法,甚至可以新增对象等,java 首创

容器 5.0 以后的版本在 J2SE 中都出现了容器 各位甚至可以自己尝试用标准库去使用容器

相关推荐