简介
JDK、JRE、JVM三者间的关系
JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。
在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具。
JDK(Java Development Kit)
JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。
JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
a. SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
b. EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。
c. ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。
金字塔结构 JDK=JRE+JVM+其它 运行Java程序一般都要求用户的电脑安装JRE环境(Java Runtime Environment);没有jre,java程序无法运行;而没有java程序,jre就没有用武之地。
Java Runtime Environment(JRE)
是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。
与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。
JVM(java virtual machine)
就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
核心编程技术
1.Java开发入门
Java开发环境的安装与使用,包括JDK命令、EclipseIDE、Linux下Java程序的开发和部署等。
2.Java语法基础
基于JDK和Eclipse环境,进行Java核心功能开发,掌握Java面向对象的语法构成,包括类、抽象类、接口、最终类、静态类、匿名类、内部类、异常的编写。
3.Java核心API
基于JDK提供的类库,掌握三大核心功能:
a. Java核心编程:包括Java编程的两大核心功能——Java输入/输出流和多线程,以及常用的辅助类库——实体类、集合类、正则表达式、XML和属性文件。
b. Java图形编程:包括Sun的GUI库AWT(Java2D、JavaSound、JMF)和Swing,IBM和GUI库SWT和Jface;
c. Java网路编程:Applet组件编程,Socket编程,NIO非阻塞Socket编程、RMI和CORBA分布式开发。
4.Java高级特性
掌握JDK1.4、JDK5.0、JDK6.0中的Java高级特性,包括反射、泛型、注释,以及java高级特性——自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入等。
Java 运算符的优先级(从高到低)
| 优先级 | 描述 | 运算符 |
|---|---|---|
| 1 | 括号 | ()、[] |
| 2 | 正负号 | +、- |
| 3 | 自增自减,非 | ++、--、! |
| 4 | 乘除,取余 | *、/、% |
| 5 | 加减 | +、- |
| 6 | 移位运算 | <<、>>、>>>` |
| 7 | 大小关系 | >、>=、<、<= |
| 8 | 相等关系 | ==、!= |
| 9 | 按位与 | & |
| 10 | 按位异或 | ^ |
| 11 | 按位或 | |
| 12 | 逻辑与 | && |
| 13 | 逻辑或 | |
| 14 | 条件运算 | ?: |
| 15 | 赋值运算 | =、+=、-=、*=、/=、%= |
| 16 | 位赋值运算 | &=、|=、<<=、>>=、>>>= |
Java 后端不是很有必要去学
主要谈一下那些Java知识“已经过时”,没必要继续学习了。您也可以把本文看做上篇文章的补充。
我判断的依据主要有以下几点:
- 实际开发能否用到?
- 是否有助于加深对技术的理解?
- 对面试是否有用?
JSP
JSP在实际开发中,主要是作为MVC模型中的V(View)层出现的。当然,View层的渲染技术除了JSP,还有FreeMaker、Velocity等。
JSP作为页面模板,在后端通过MVC框架渲染成HMTL,然后再发送到客户端(例如浏览器)来呈现。这也就是我们常说的“前后端不分离”,“混合式”开发。
而当前,包括我所在的公司,以及大部分互联网公司。要么已经抛弃这种模式,要么正在抛弃的路上,而转向彻底的“前后端分离”。
在“前后端分离”模式下,后端只负责提供服务接口(例如REST),而前端(例如HTML5)通过接口发送/获取,呈现数据(例如JSON格式)。
这样,在后端,原来的MVC框架,某种意义上已经演变为MC框架。因此,与V(View)相关的一切模板技术都失去了学习的必要,其中当然也包括JSP。所以,后来的Java学习者,我的建议是:
“完全可以放弃对JSP的学习。”
Struts
在Java后端开发中,MVC模型还是主流。而Struts作为一个MVC框架,单从技术上来说,还是很优秀的。
但是,现在Spring实在是太强势了,越来越成为Java开发中的“一站式”工具包,其中的一个利器就是Spring MVC。
望名知意,Spring MVC也是一个MVC框架。而且因为它是Spring的亲儿子,自然和Spring契合的非常完美。
同时,在设计之初,Spring MVC就参照了其他MVC框架的优缺点(包括Struts),所以用起来非常爽。因此,在MVC框架领域,Spring MVC大有一统天下的趋势。
因此现在,很多公司,老的Struts项目还在维护。但新的项目开发,更多转向了Spring MVC。因此,如果你是Java新手,正在学习中,我的建议是:
“不要再学习Struts了,从Spring MVC开始吧!”
Hibernate
Hibernate作为老牌的OR映射框架,功能非常强大,涵盖面非常广。但这既是它的优点,同时也成为它的“负担”,是开发人员“不能承受之重”。
Hibernate的设计初衷,是为了最大程度的解放程序员,完全隔离数据库,实现彻底的OR映射。程序员甚至可以不写一行SQL语句,单通过配置就能实现对数据库的操作。
当然,为了实现这个目标,Hibernate也设计的非常复杂、非常精巧。就不可避免的带来以下副作用:
- 学习成本高
- 配置复杂
- 调优困难
前两点不难理解,单说“调优困难”。
因为Hibernate的设计目标是彻底的OR映射,彻底的隔离SQL语句。但必然会带来一定的性能损失。大部分情况下,应用如果对性能不敏感,Hibernate也没问题。但应用一旦对性能敏感,有SQL级别调优的需求,Hibernate的优点反而成为缺点。
虽然Hibernate也支持SQL级别的调优,但因为框架设计的过于复杂和精巧,这就需要开发人员对Hibernate理解的非常透彻,这就带来了更高的学习成本。
而现在最流行的MyBatis,作为一个“混合式”,轻量级OR映射框架,既继承了Hibernate的优点,同时也吸取了他的教训。在支持配置的同时,又能接触SQL,从而带来了更多灵活性(包括调试、优化)。
当前,在实际开发中,Hibernate使用的越来越少了。大家更偏爱MyBatis这种轻量级框架。所以,对后来学习者,我的建议是:
“不需要再学习Hibernate了,学MyBatis就够了。”
Servlet
当然,现在不会有任何公司,再用纯粹的Servlet来时实现整个Web应用,而是转向一些更高级的技术(例如各种MVC框架)。因此,会给人一种错觉:Servlet已经过时,后来者就不需要再学习了。
在这里,我可以非常负责任的说:这种观点是极端错误,极端不负责任的。
Servlet不仅要学,而且要学深,学透。
当前,Servlet虽然不再是一个主流web开发技术,但依然是Java Web开发技术的基础,是Java Web容器的基石,是行业标准。而现在流行的各种MVC框架(包括SpringMVC),在最底层,还是以 Servlet为基础的。
Web容器:
MVC <-> Servlet
Web容器 <-> 客户端
所以,如果你想要彻底掌握某个MVC框架,则必须彻底理解Servlet。
而且,Servlet作为一个基础设施。精通它,不仅有助于理解各种MVC框架。即使Servlet本身,也有很多实用价值。
如果你深刻理解了Servlet的生命周期,就可以在底层做很多事情。譬如在Request进来的时候,进行拦截,进行权限的判定。也可以在Response发出的时候,进行拦截,统一检查、统一附加。
所以,“Servlet不仅要学,而且要学深,学透。”
其他
目前在国内,Java更多是作为web后端技术出现的。因此在实际学习中,很多技术就不符合“国情”,学习的现实意义不大。下面我就简单列举下。
1.Applet
作为页面插件技术,不用多说,连flash都快被淘汰了,更无论从未流行的applet。
2.Swing
作为桌面UI框架。且不说本身设计的咋样。现实开发中,我接触的桌面应用,要么用C++(例如MFC),要么用C#(Winform、WPF)。所以,Swing就没有学习的必要了。
3.JDBC
作为较低层的数据库基础设施,JDBC被很多框架(例如MyBatis)支持。但在实际开发中,程序员即使不了解也无大碍。因此,虽然我不能建议你放弃JDBC学习,但如果你时间有限,完全可以把它的优先级排低一点。
4.XML
XML现在还在广泛应用。但作为一个web数据传输格式,正在逐渐被JSON替代。所以,对Java后端学习来说,XML简单了解即可。至于庞杂的XML操作API(例如XPath),完全不必学习。将来真要用到,再查也不迟。
资料
Java 基础如何快速打好?
Java 成神之路
Java 知识体系最强总结(2020版)
Java 架构师学习路线(BAT必备)
Java 架构师系列
Java 全栈知识体系
coursera-面向对象技术高级课程