JavaSE - 初始 Java
Java : 一个帝国的诞生
1、C 语言帝国的统治
现在是公元 1995 年, C 语言帝国已经统治了我们 20 多年, 实在是太久了。
1972 年, 随着 C 语言的诞生和 Unix 的问世, 帝国迅速建立统治, 从北美到欧洲, 从欧洲到亚洲, 无数程序员臣服在他的脚下。
帝国给我们提供了极好的福利:贴近硬件, 运行极快, 效率极高。
使用这些福利, 程序员们用 C 开发了很多系统级软件,操作系统, 编译器, 数据库,网络系统.....
但是帝国也给我们安上了两个沉重的枷锁: 指针和内存管理
虽然指针无比强大, 能直接操作内存, 但是帝国却没有给我们工具去做越界的检查, 导致很多新手程序员轻易犯错。
至于内存管理, 帝国更完全是放任的态度: 你自己分配的空间, 自己去释放 !
更要命的是这些问题在编译期发现不了, 在运行时才会突然暴露, 常常让我们手忙脚乱, 昏天黑地去调试。
我们的大量时间和宝贵的精力都被浪费在小心翼翼的处理指针和内存分配上。
每个程序员都被这两个东西搞的焦头烂额!
帝国宣称的可移植性骗了我们,他宣称我们在一个机器上写的程序, 只要在另外一个机器上编译就可以了, 实际上不是这样。 他要求我们尽量用标准的 C 函数库。其次,如果遇到了一些针对特定平台的调用, 需要对每个平台都得写一份 ! 有一点点小错误,都会导致编译失败。
1982 年,帝国又推出了一门新的语言 C++,添加了面向对象的功能,兼容 C,有静态类型检查, 性能也很好。
但是这门新的语言实在是太复杂了, 复杂到比我聪明的多的人都没有办法完全掌握这门语言,它的很多特性复杂的让人吃惊。
C++在图形领域和游戏上取得了一些成功, 但是我一直学不好它。
2、反抗
我决定反抗这个庞大的帝国, 我偷偷的带领着一帮志同道合的兄弟离开了,我们要新建一块清新自由的领地。
为了吸引更多的程序员加入我们, 我们要建立一个新的语言,这个语言应该有这样的特性:
语法有点像 C , 这样大家容易接受
没有 C 语言那样的指针
再也不要考虑内存管理了, 实在受不了了
真正的可移植性, 编写一次, 到处运行
面向对象
类型安全
还有,我们要提供一套高质量的类库, 随语言发行。
我想把这个语言命名为 C++-- ,即 C++减减, 因为我想在 C++的基础上改进,把它简化。
后来发现不行, 设计理念差别太大。
干脆重启炉灶。
我看到门口的一棵橡树, 就把这个语言叫做 Oak。
但是后来发布的时候, 发现 Oak 已经被别人用了, 我们讨论很久, 最终决定把这门新的语言叫做 Java。
为了实现跨平台, 我们在操作系统和应用程序之间增加了一个抽象层: Java 虚拟机
用 Java 写的程序都跑在虚拟机上, 除非个别情况, 都不用看到操作系统。
3、一鸣惊人
为了吸引更多的人加入我们的新领地, 我们决定搞一个演示, 向大家展示 Java 的能力。
出世未久的 Java 其实还远不完善。 搞点什么好呢?
我们把眼光盯上了刚刚兴起的互联网, 1995 年的网页简单而粗糙, 缺乏互动性。 于是我们在浏览器上弄了个小插件, 把 java 运行环境放了上去。
然后在上面开发了一个图形界面的程序(Applet), 让它看起来美轮美奂, 震撼人心。
每一个看到他的程序员都会发出「Wow」的惊叹 !为之倾倒。
Java 活了!
通过 Applet ,无数的程序员看到了 Java 这门语言,了解了这门语言特性以后, 很多无法忍受 C 帝国暴政的程序员, 很快加入了我们, 我们的领地开始迅速扩大。
连 C 语言帝国里的一些商业巨头也纷纷来和我们合作, 其中就包括 Oracle ,微软这样的巨头 , 微软的头领 Bill Gates 还说 :这是迄今为止设计的最好的语言!
但是 Bill Gates 非常的不地道, 买了我们的 Java 许可以后,虽然在自家的浏览器上也支持 Applet,但是他们却偷偷的试图修改 Java , 想把 Java 绑死在自家的操作系统上赚钱, Java 会变的不可移植。
这是我们难于忍受的, 我们和微软发起了一场旷日持久的游击战争, 逼着微软退出了 Java 领域, 开发了自己的.NET ,这是后话。
4、开拓疆土
从 1995 年到 1997 年,我们依靠 Java 不断的攻城略地, 开拓疆土,我们王国的子民不断增加, 达到了几十万之众, 已经是一个不可忽视的力量了。
但是大家发现, Java 除了 Applet,以及一些小程序之外, 似乎干不了别的事情。
C 帝国的人还不断的嘲笑我们慢, 像个玩具。
到了 1998 年, 经过密谋, 我们 Java 王国决定派出三只军队向外扩展:
Java 2 标准版(J2SE): 去占领桌面
Java 2 移动版(J2ME): 去占领手机
Java 2 企业版(J2EE): 去占领服务器
其中的两只大军很快败下阵来。
J2SE 的首领发现, 开发桌面应用的程序员根本接受不了 Java, 虽然我们有做的很优雅的 Swing 可以开发界面, 但是开发出的界面非常难看, 和原生的桌面差距很大。 尤其是为了运行程序还得安装一个虚拟机, 大家都受不了。
J2ME 也是, 一直不受待见, 当然更重要的原因是乔布斯还没有重新发明手机, 移动互联网还没有启动。
失之东隅,收之桑榆, J2EE 赶上了好时候, 互联网大发展, 大家忽然发现, Java 简直是为写服务器端程序所发明的!
强大, 健壮, 安全, 简单, 跨平台 !
在 J2EE 规范的指导下, 特别适合团队开发复杂的大型项目。
我们授权 BEA 公司第一个使用 J2EE 许可证, 推出了 Weblogic, 凭借其集群功能, 第一次展示了复杂应用的可扩展性和高可用性。
这个后来被称为中间件的东西把程序员从事务管理,安全管理,权限管理等方面解放出来, 让他们专注于业务开发。 这立刻捕获了大量程序员的心。
很快 Java 王国的子民就达到数百万之众。
榜样的力量是无穷的, 很快其他商业巨头也纷纷入场, 尤其是 IBM,在 Java 上疯狂投入,不仅开发了自己的应用服务器 Websphere, 还推出了 Eclipse 这个极具魅力的开源开发平台。
当然 IBM 利用 java 获得了非常可观的效益, 软件+硬件+服务 三驾马车滚滚向前, 把 IBM 推向了一个新的高峰。
5、帝国的诞生
大家也没有想到,除了商业巨头以外, 程序员们也会对 Java 王国 这么热爱, 他们基于 Java 开发了巨多的平台,系统,工具,例如:
构建工具: Ant,Maven,Jekins
应用服务器: Tomcat,Jetty,Jboss,Websphere,weblogic
Web 开发: Struts,Spring,Hibernate,myBatis
开发工具: Eclipse,Netbean,intellij idea,Jbuilder
。。。。等等等等。。。。
并且绝大部分都是开源的 !
微软眼睁睁的看着服务器端的市场被 Java 王国占据, 岂能善罢甘休? 他们赶紧推出.NET 来对抗, 但我们已经不在乎了, 因为他的系统是封闭的,所有的软件都是自家的:
开发工具是 Visual Studio,应用服务器是 IIS,数据库是 SQL Server,只要你用.NET,基本上就会绑定微软。
另外他们的系统只能运行在 Windows 服务器上, 这个服务器在高端市场的占有率实在是太低了。
2005 年底, 一个新的王国突然崛起, 他们号称开发效率比 java 快 5-10 倍, 由此吸引了大批程序员前往加盟。
这个新的王国叫做 Ruby on Rails,它结合了 PHP 体系的优点(快速开发)和 Java 体系的优点(程序规整), 特别适合快速的开发简单的 Web 网站。
虽然发展很快, 但没有对 Java 王国产生实质性的威胁, 使用 Ruby on Rails 搭建大型商业系统的还很少。
除了 Ruby on Rails ,还有 PHP, Python , 都适合快速开发不太复杂的 Web 系统。 但是关键的,复杂的商业系统开发还是 Java 王国的统治之下。 所以我们和他们相安无事。
2006 年, 一只叫 Hadoop 的军队让 Java 王国入侵了大数据领域, 由于使用 Java 语言, 绝大多数程序员在理解了 Map/Reduce ,分布式文件系统在 Hadoop 中的实现以后, 很快就能编写处理处理海量数据的程序, Java 王国的领地得到了极大的扩展。
2008 年, 一个名叫 Android 的系统横空出世, 并且随着移动互联网的爆发迅速普及, 运行在 Android 之上的正是 Java !
Java 王国在 Google 的支持下, 以一种意想不到的方式占领了手机端, 完成了当年 J2ME 壮志未酬的事业 !
到今年为止, 全世界估计有 1000 万程序员加入了 Java 王国,它领土之广泛, 实力之强大, 是其他语言无法比拟的。
Java 占据了大部分的服务器端开发,尤其是关键的复杂的系统, 绝大多数的手机端, 以及大部分的大数据领域。
一个伟大的帝国诞生了。
Java 的特性和优势
八大特性
1、跨平台/可移植性
这是 Java 的核心优势。Java 在设计时就很注重移植和跨平台性。比如:Java 的 int 永远都是 32 位。不像 C++可能是 16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。
2、安全性
Java 适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使 Java 可以很容易构建防病毒,防篡改的系统。
3、面向对象
面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于 C++为了照顾大量 C 语言使用者而兼容了 C,使得自身仅仅成为了带类的 C 语言,多少影响了其面向对象的彻底性!
Java 则是完全的面向对象语言。
4、简单性
Java 就是 C++语法的简化版,我们也可以将 Java 称之为「C++-」。跟我念「C 加加减」,指的就是将 C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。
同时,由于语法基于 C 语言,因此学习起来完全不费力。
5、高性能
Java 最初发展阶段,总是被人诟病「性能低」;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java 语言本身发展中通过虚拟机的优化提升了几十倍运行效率。
比如,通过 JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些「热点」字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使 Java 程序的执行效率大大提高,
某些代码甚至接待 C++的效率。因此,Java 低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多 C++应用转到 Java 开发,很多 C++程序员转型为 Java 程序员。
6、分布式
Java 是为 Internet 的分布式环境设计的,因为它能够处理 TCP/IP 协议。事实上,通过 URL 访问一个网络资源和访问本地文件是一样简单的。Java 还支持远程方法调用(RMI,Remote Method Invocation),
使程序能够通过网络调用方法。
7、多线程
多线程的使用可以带来更好的交互响应和实时行为。 Java 多线程的简单性是 Java 成为主流服务器端开发语言的主要原因之一。
8、健壮性
Java 是一种健壮的语言,吸收了 C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java 程序不可能造成计算机崩溃。即使 Java 程序也可能有错误。
如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。
核心优势

跨平台是 Java 语言的核心优势,赶上最初互联网的发展,并随着互联网的发展而发展,建立了强大的生态体系,目前已经覆盖 IT 各行业的「第一大语言」,是计算机界的「英语」。
虽然,目前也有很多跨平台的语言,但是已经失去先机,无法和 Java 强大的生态体系抗衡。Java 仍将在未来几十年成为编程语言的主流语言。
JAVA 虚拟机是 JAVA 实现跨平台的核心。事实上,基于 JAVA 虚拟机(JVM)的编程语言还有很多种:

基于 JAVA 生态建立的产品将会越来越多;基于 JAVA 虚拟机的编程语言也将会越来越多;生态系统的强大,是 JAVA 能长盛不衰的根本。
Java 三大版本
JAVA 最大的特点:
Java 的主要优势在于其做出的 WORA:即一次编写(Write Once)、随处运行(Run Anywhere)。简单来讲,这意味着开发团队能够利用 Java 编写一款应用程序,并将其编译为可执行形式,而后将其运行 在任何支持 Java 的平台之上。这显然能够极大提高编程工作的实际效率,这种优势来源于 Java Virtual Machine(JAVA 虚拟机的缩写),JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在 实际的计算机上仿真模拟各种计算机功能来实现的。JAVA 语言的一个非常重要的特点就是与平台的无关 性,而使用 Java 虚拟机是实现这一特点的关键。
JAVA 三大版本:
- JAVA SE:它是 JAVA 的标准版,是整个 JAVA 的基础和核心,这是我们主要学习的一个部分,也是 JAVAEE 和 JAVAME 技术的基础,主要用于开发桌面应用程序。学会后可以做一些简单的桌面应用 如:扫雷,连连看等。
- JAVA ME:它是 JAVA 的微缩版,主要应用于嵌入式开发,比如手机程序的开发。目前来说就业范围不是很广,在一些城市可能相对的不好找工作。
- JAVA EE:也叫 JAVA 的企业版,它提供了企业级应用开发的完整解决方案,比如开发网站,还有企业的一些应用系统,是 JAVA 技术应用最广泛的领域。主要还是偏向于 WEB 的开发,而 JAVA EE 的基础就是 JAVA SE,所以我们在学习 JAVA SE 的时候,基础一定要打好,因为这是最基本的,也是最核 心的。
JDK 和 JRE
JDK
Java 2 SDK (Development Kit)包含:JRE 的超集,包含编译器和调试器等用于程序开发的文件
JRE
Java Runtime Environment (JRE) 包含:Java 虚拟机、库函数、运行 Java 应用程序和 Applet 所必须文件
Java 运行环境的三项主要功能:
- 加载代码:由 class loader 完成;
- 校验代码:由 bytecode verifier 完成;
- 执行代码:由 runtime interpreter 完成。
区别和联系:
sdk(也就是 jdk)是 jre 的超集,是在 jre 的基础上增加了编译器及其他一些开发工具。
jre 就是 java 运行时环境,包括了 jvm 和其它一些 java 核心 api,任何一台电脑,只有安装了 jre 才可以行 java 程序.
如果只是要运行 JAVA 程序,之需要 JRE 就可以。 JRE 通常非常小,也包含了 JVM.
如果要开发 JAVA 程序,就需要安装 JDK。
初识 JVM
JVM(JAVA Virtual Machine)
JVM 是一种规范,可以使用软件来实现,也可以使用硬件来实现,就是一个虚拟的用于执 byte-codes 字节码的计算机。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。
JVM 负责将 java 字节码解释运行,边解释边运行,这样,速度就会受到一定的影响。JAVA 提供了另一种 解释运行的方法 JIT(just in time),可以一次解释完,再运行特定平台上的机器码,高级的 JIT 可以只能 分析热点代码,并将这些代码转成本地机器码,并将结果缓存起来,下次直接从内存中调用,这样就大 大提高了执行 JAVA 代码的效率。这样就实现了跨平台、可移植的功能。
JVM 是指在一台计算机上由软件或硬件模拟的计算机;它类似一个小巧而高效的 CPU。
byte-code 代码是与平台无关的是虚拟机的机器指令。
java 字节代码运行的两种方式:
interpreter(解释)
运行期解释字节码并执行
Just-in-time(即时编译)
由代码生成器将字节代码转换成本机的机器代码,然后可以以较高速度执行。

JAVA 的跨平台实现的核心是不同平台使用不同的虚拟机
不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别,实现了「一次编译,随处运行」。
JAVA 程序运行机制
说到 Java 的运行机制,不得不提一下什么是编译型语言,什么是解释型语言。
编译型语言
编译型语言是先将源代码编译成机器语言(机器可以读懂的语言),再由机器运行机器码,这样执行程序的效率比较高。像 C 和 C++就是典型的编译型语言。
解释型语言
其实解释型语言是相对编译型语言存在的,解释型语言是在运行的时候才进行编译,每次运行都需要编译,这样效率比较低。像 JavaScript,Python 就是典型的解释型语言
二者的区别
简单的举个例子:同样一本英文书,找人翻译成中文版的书然后拿给你看就是编译,找一个翻译员在你旁边给你解读书的含义就是解释。两者各有利弊,编译型语言执行效率高,翻译一次可以多次运行。解释性语言执行效率低,每次运行都需要重新翻译。但是解释型的跨平台性相对要好,比如解释给一个懂中文和解释给一个懂日文的人就叫做兼容性。
Java 的运行机制
Java 属于两者都有,既有编译过程,又是解释型语言
Java 语言虽然比较接近解释型语言的特征,但在执行之前已经预先进行一次预编译,生成的代码是介 于机器码和 Java 源代码之间的中介代码,运行的时候则由 JVM(Java 的虚拟机平台,可视为解释器)解 释执行。它既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以 执行起来比「纯解释型」程序要快许多。
总之,随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变得模糊。
提示
利用编译器(javac)将源程序编译成字节码 à 字节码文件名:源文件名.class
第二部:运行
利用虚拟机(解释器,java)解释执行 class 字节码文件。

Hello World
需要先配置好开发环境
参考链接:https://www.runoob.com/java/java-environment-setup.html
测试代码一定要写 HelloWorld!代表你向这个世界的呐喊,仪式感很重要,就像你生活 中和家人,朋友,妻子在节日中或者纪念日一定要做一些事情,这就是仪式感。
新建文件 Hello.java
编写我们的 HelloWorld 程序!
javapublic class Hello{ public static void main(String[] args){ System.out.println("Hello,World!"); } }保存文件,cmd 打开命令行,利用 javac 编译!
shelljavac Hello.java # 如果没有报错,查看文件夹下是否有新的一个文件 # Hello.class # 如果没有出现,恭喜!说明你遇到了你在学Java当中的第一个Bugjava 执行!
shelljava Hello # 成功输出Hello,World!
如果出现错误,检查字母大小写是否有错误,或者是否标点符号错误,文件名错误等等,一定要确保成功输出
编写 Java 程序时,应注意以下几点:
大小写敏感
Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
类名
对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
方法名
所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字 母大写。
源文件名
源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。
主方法入口
所有的 Java 程序由 public static void main(String []args) 方法开始执行。