初识Java
1.1 Java是什么?
Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。不仅如此,Java还是一个由一系
列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛
应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。
下面我们通过Java官方提供的数据来一起感受一下,Java到底有多“火”。

1.2 Java之父
图片摘自百度百科

1.3为什么选择Java
数据是最能让人信服的手段之一,Java语言在近20年的编程类语言排行榜上,稳居前三!!
要说编程类语言有多少,那可是多的数不清,下面给大家看一下今年最新的TIOBE 编程语言社区排行榜的前20。
在这个排行榜上可以看到位居第7位的JavaScript,那JavaScript和Java有什么关系呢?
他们俩的关系其实就相当于“雷锋和雷峰塔”的关系或者说“老婆和老婆饼”的关系(没有一点关系…),那就是没有一点关系!
最开始JavaScript叫liveScript,由于当时Java太火了,因此liveScript更名为JavaScript借势宣传一波,蹭蹭热度。
那么,Java究竟有什么特性能获得广大程序员的一致青睐呢?
简单性
Java语法是C++语法的一个“纯净版本”。这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重
载、虚基类等等。不仅如此,Java开发环境远远超出大多数其他编程语言的开发环境。
面向对象
什么是面向对象? 这里我们用木匠打一个比方,一个“面向对象”的木匠始终关注的是所制作的椅子,第二位才是所
使用的工具;而一个“非面向对象的”木匠首先考虑的是所使用的工具。
在Java的世界里,一切皆对象。
Java的面向对象特性与C++旗鼓相当,与C++的主要不同点在于多重继承。在Java中,取而代之的是更简单的接口
概念。而且与C++相比,Java提供了更丰富的运行时自省功能。
分布式(微服务)
比特科技Java有丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的 对象,其便捷程度就好像访问本地文件一样。
健壮性
Java与C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性(对于曾经花费几个小时来
检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性)。不仅如此,Java编译器能够检测许多
在其他语言中仅在运行时才能够检测出来的问题。
安全性
Java适用于网络/分布式环境。为了达到这个目标,在安全性方面投入了大量的精力。使用Java可以构建防病毒、防
篡改的系统
从一开始,Java就设计成能够防范常见的各种攻击:
运行时堆栈溢出。蠕虫和病毒常用的攻击手段。
破坏自己进程空间之外的内存。
未经授权读写文件 体系结构中立
编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java运行时系统,这些编译后的代
码就可以在许多处理器上运行。Java编译器通过生成与特定计算机体系结构无关的字节码指令来实现这一特性。精
心设计的字节码不仅可以很容易的在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。
可移植性
与C/C++不同,Java规范中没有“依赖具体实现的地方”。基本数据类型的大小以及有关运算都做了明确的说明。例
如,Java中的int永远是32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器提供商指定
的其他大小。在Java中,数据类型具有固定的大小,这消除了代码移植时令人头疼的主要问题。
解释型
Java解释器可以在任何移植了解释器的机器上执行Java字节码。由于链接是一个增量式且轻量级的过程。所以开发
过程也变得更加快捷,更加具有探索性。
高性能
尽管对解释后的字节码性能已经比较满意,但在有些场合下可能需要更加高效的性能。字节码可以(在运行时刻)
动态的翻译成对应运行这个应用的特定cpu的机器码。
多线程
Java在当时很超前。它是第一个支持并发程序设计的主流语言。多线程可以带来更好的交互响应和实时行为。并发
程序设计绝非易事,但是Java在这方面表现出色,可以很好的管理这个工作。
动态性
Java与C/C++相比更加具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客
户端没有任何影响。在Java中找出运行时类型信息十分简单(反射的特性,后续会学到)。
1.4 Java语言起源
Java 语言源于 1991 年 Sun 公司 James Gosling 领导的的 Oak 项目,1995 年 Sun 公司正式起名为 Java,并提
出“Write once, Run anywhere" 的口号,即“一次编译,到处运行”。
疑问:怎么个一次编译到处运行呢?怎么运行?往哪运行?
1.4.1一个java程序跑起来的流程是怎样的
解决上面这个疑问我们得先明白一个java程序跑起来的流程是怎样的,下面开始探讨!!
很久以前我们是没有编译器的,但有记事本,所以就在记事本写代码并进行编译运行。
右键—>新建—>文本文档—>起名为HelloWorld—>将后缀名.txt改为.java 此时它就是一个java文件了。
注意:如果你建的文本文档没有.txt怎么办?执行以下操作即可

作为一名合格的程序员,有必要将②③处打开(勾选即可)。
以前没有编译器的情况下,只能在记事本上手敲代码,下面用记事本写代码的方式输出“hello china!”

1.写完代码保存
2.找到文档位置,鼠标移动到文档处,点击shift+鼠标右键,会看到下面这样的图片,点击在此处打开Powershell窗口(S).
3.这时会出现一个Powershell框,上面显示文档所在路径,在Powershell框输入javac HelloWorld.java并回车(javac+空格+文件名+回车)

此时我们会发现,回车之后多出来一个.class文件。

点开文件是这样的,这是什么?不认识啊!!
 它实际上是一个二进制文件。
4.接着我们再在Powershell框输入java HelloWorld并回车,此时就得到了我们想要的结果。

javac、java属于JDK命令(Java Developement Kit:java开发者工具)
疑问: .java 和.class其实就是磁盘的文件,执行了java命令后,程序在哪里跑着的呢?
解决这一问题之前我们先来解决这一个问题:听过JDK,那你听过JRE和JVM吗?
JDK:Java Developement Kit(java开发者工具)
JRE:Java Runtime Environment(Java运行时环境)
JVM:Java Virtual Machine(Java虚拟机)
面试问题:JDK、JRE、JVM三者的关系如何?
JDK包含JRE,JRE包含JVM,也就是说,当你安装好JDK后,实际上JRE和JVM也已经安装好了。 
所以当输入java命令的时候,java程序运行到哪个地方呢?答案就是运行到了JVM里,也就会说,我们的程序最终跑起来的时候跑到了JVM里(将字节码放到虚拟机里面跑),跑完之后就有了结果。

那么现在知道了字节码跑到了JVM里,那么也就意味着如果我把这个字节码文件发给别人, 别人拿到字节码文件,直接在他的电脑上使用java命令就能跑起来了,而这,就是所谓的一次编译,到处运行。
运行结果:

至此,我们解决四个大问题:即记事本写的代码怎么跑的?在哪跑的?JDK、JRE、JVM三者的关系是怎样的?一次编译到处运行又是什么意思?
1.4.2使用cmd命令行运行java程序
当然,我们也可以不使用PowerShell框编译代码,也可以使用命令行cmd运行,将.class文件删掉,快捷键win+R,输入cmd
1.5 Java是最好的语言吗?
不是,没有哪个语言是世界上最好的语言,因为在每个领域中都有更合适的编程语言。
- C 语言无疑是现代计算机软件编程语言的王者,几乎所有的操作系统都是 C 语言写成的。C++ 是面向对象的 C 语
言,一直在不断的改进。
- JavaScript 是能运行在浏览器中的语言,丰富的前端界面离不开 Javascript 的功劳。近年来的 Node.js 又在后端占
有一席之地。
- Python 用于系统管理,并通过高性能预编译的库,提供 API 来进行科学计算,文本处理等,是 Linux 必选的解释
性语言。
- Ruby 强于 DSL(领域特定语言),程序员可以定义丰富的语义来充分表达自己的思想。Erlang 就是为分布式计算
设计的,能保证在大规模并发访问的情况下,保持强壮和稳定性。
- Go 语言内置了并发能力,可以编译成本地代码。当前新的网络相关项目,很大比例是由 Go 语言编写的,如
Docker、Kubernetes 等。
- 编写网页用 PHP,函数式编程有 Lisp/Scala,编写 iOS 程序有 Swift/Objective-C。
一句话概括,能留在排行榜之上的语言,都是好的语言,它们在其所在的领域能做到最好。
那么,Java 语言到底有什么优势可以占据排行榜第二的位置呢?
- 其一,语法比较简单,学过计算机编程的开发者都能快速上手。
- 其二,在若干了领域都有很强的竞争力,比如服务端编程,高性能网络程序,企业软件事务处理,分布式计算,
- Android 移动终端应用开发等等。
- 最重要的一点是符合工程学的需求,我们知道现代软件都是协同开发,那么代码可维护性,编译时检查,较为高效
的运行效率,跨平台能力,丰富的 IDE,测试,项目管理工具配合。都使得 Java 成为企业软件公司的首选,也得到 很多互联网公司的青睐。 - 没有短板,容易从市场上找到 Java 软件工程师,软件公司选择 Java 作为主要开发语言,再在特定的领域使用其他
语言协作编程,这样的组合选择,肯定是不会有大的问题。 所以综合而言,Java 语言全能方面是最好的。 我们来一起看看Java社区的概况: - Java 是一门开放的语言,其开源社区也是参与者众多。最有名的应当数 Apache 社区,目前已经拥有近 200 个顶
级项目,其中绝大多数是 Java 语言项目。在 Java 生态圈中,具有重要地位的如 Spring、Ant、Commons、 - Tomcat、Xerces、Maven、 Struts、Lucene、ActiveMQ、CXF、Camel、Hadoop 等等。很多技术时代,一大
批 Java 项目加入,如 Web 时代的 Velocity、Wicket;JavaEE 相关的 Tomee、OpenJPA、OpenWebBeans、 比特科技Myfaces;WebService 时代的 jUDDI、Axis、ServiceMix;Osgi 时期的 Flex、Karaf;大数据时代的 HBase、 Hive、ZooKeeper、Cassandra;云时代的 Mesos、CloudStack 等等。 - 涉及到软件开发的方方面面,可以说当今几乎所有的中型以上 Java 应用中,都会有 Apache 开源项目的身影。国
内最早参与 Apache 社区的以国外软件公司国内研发团队成员为主,如红帽、IONA、Intel、IBM 研发中心等。如 今国内互联网公司和软件公司也不断的参与,特别是开始主导一些 Apache 项目,如 Kylin 等。 - JBoss 开源社区,包含了 50 多个 Java 开源项目,其中有 Hibernate、Drools、jBPM 等业界知名开源项目,也有
Undertow、Byteman、Narayana 等名气不算大,但绝对是相应领域业界的顶级优秀项目。当前 JBoss 开源社区 主要以企业应用中间件软件为主,RedHat 是主要的技术贡献力量。 - Eclipse 开源社区,之前主要是包含 Eclipse IDE 的项目,后来也逐步进行多方面的扩展,比如 OSGi,服务器等,
目前一些知名 Java 项目,如 Jetty、Vertx 等都是 Eclipse 开源组织成员。此外 IOT 目前是 Eclispe 的一个重点方 向,在这里可以找到完整的 IOT Java 开发方案。 - Spring 开源社区,以 SpringFramework 为核心,包括 SpringBoot、SpringCloud、SpringSecurity、
- SpringXD 等开源项目,在国内有广泛的应用场景。
所以说,Java不仅仅是一门编程语言,它是一个综合的技术体系,是面向对象思想的规范。
1.6 初识Java的main方法
上面我们已经学会使用记事本和cmd写代码了,下面我们认识一下我们刚刚写的那几行代码表示什么意思以及在写java代码时需要注意的地方。

上面就是一个完整的Java程序的结构(有点乱了,尴尬),Java程序的结构由如下三个部分组成
1.源文件(扩展名为*.java):源文件带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个
类。类的内容必须包含在花括号里面。
2.类:类中带有一个或多个方法。方法必须在类的内部声明。
3.方法:在方法的花括号中编写方法应该执行的语句。
java的三种打印方式 
总结:类存在于源文件里面;方法存在于类中;语句存在于方法中。
最后
写java代码的时候要注意的点: ①文件名需要和类名一样 ②每次写完代码,都需要保存,重新编译再运行 ③双引号引起来的是字符串 ④方法和函数是同一个概念,在java中,函数被叫为方法。 ⑤C语言没有字符串类型,但Java有字符串类型,叫String ⑥注意java大括号的书写风格 ⑦代码自己的编码格式是UTF-8,但是java的编译平台(javac)的默认编码是GBK, 所以在命令行编译代码的时候可以输入javac -encoding utf-8 文件名,进行解码。
|