我的全栈之路-Java基础之Java概述与开发环境搭建

我的全栈之路-Java基础之Java概述与开发环境搭建

1.1 信息技术发展趋势

目前信息技术主要经历了互联网、移动互联网以及以大数据、云计算、物联网、人工智能、区块链等为代表的新兴技术三个阶段。

  • 互联网
    互联网自从20世纪90年代逐渐兴起,主要是通过网络连接了世界各地的PC机,笔记本以及背后提供数据服务的大型服务器集群。
    其中绝大多数PC机都运行着Windows,macOS操作系统,而服务器主要是以类Unix(CentOS,Ubuntu)占据主要市场。
    依靠互联网成长起来的公司有Apple、Google、Amazon、Microsoft、Baidu、Alibaba、Tencent。

  • 移动互联网
    移动互联网主要从2010开始爆发式增长,主要是通过网络连接了世界各地的移动设备(最典型的就是手机),它们绝大多数都运行着Android,iOS操作系统。
    依靠移动互联网成长起来的公司有字节跳动、蚂蚁金服、小米、美团、滴滴。

  • 大数据、云计算
    随着用户的爆发式增长,以海量数据为基础的大数据、云计算技术在Google、Amazon、Apple、Baidu、Alibaba、Tencent等大型互联网公司有着广泛的商业应用场景。

  • 物联网
    物联网会以手机作为中枢,通过物联网连接所有的智能设备,包括智能家居、汽车、电视等嵌入式设备,目前国内的小米、华为等在智能家居、电视、汽车等领域广泛布局,2019年8月华为发布了鸿蒙系统。

  • 人工智能
    人工智能(AI)作为当前最火爆的技术,国内的Baidu、Tencent、Alibaba等互联网公司逐渐根据自身的核心业务开始布局,Alibaba最早将人工智能技术布局在电商和物流领域,而Baidu开发出了对话式人工智能操作系统Dueros和自动驾驶平台Apollo,Tencent则是在游戏领域应用人工智能。

  • 区块链
    区块链经历了数字货币、智能合约和超级账本三个阶段,区块链技术可以广泛使用在金融、供应链、物流、公共服务等领域,解决互联网的信任问题,目前蚂蚁金服、京东已经有大量的区块链应用落地。

1.2 浅谈计算机系统架构

1.2.1 计算机系统架构概述

计算机是一种用于高速计算的电子机器,可以进行数值运算、逻辑判断,还有存储记忆功能,且能够通过编写程序实现来自动、高速的处理数据。
计算机系统由硬件系统和软件系统组成,由软硬件共同协作完成人们日常生活和工作中的各种任务:

  • 微信聊天:微信监听键盘输入的数据,并放到内存,然后传给网卡,通过网络传递给另外一个网卡,再从网卡传递到内存,显示在显示器上。
  • QQ音乐:QQ音乐将音乐数据加载到内存上,然后写到声卡上。
  • 腾讯视频:应用程序将视频数据加载到内存,然后写到显卡上。
  • Office写文档:Office将内存中的数据写入到磁盘上。
  • Office读文档:Offcice将磁盘的数据加载到内存,然后显示在屏幕上。

1.2.2 计算机硬件系统

现在计算机是由运算器、控制器、存储器、输入设备和输出设备五大部分组成,它们各司其职,完成了数据的计算、存储、传输等常见任务。
冯诺依曼体系结构

  • CPU
    CPU也就是中央处理器,由运算器和控制器所组成,其作用是从内存中获取指令并执行后将结果返回给内存或写入磁盘和控制其他设备协同工作。

  • 内存
    内存是采用编址存储,其主要作用是作为程序的工作区,程序运行时会将指令和数据都加载到内存,内存中的数据断电后会丢失,用于临时存储小容量数据。

  • 硬盘
    硬盘是用于永久存储海量数据,按照读写性能不同分为机械硬盘和固态硬盘两大类。

  • IO设备
    IO设备用于数据的输入和输出,其中常见的输入设备包含鼠标、键盘,常见的输出设备包括声卡、显卡。
    网卡也是属于IO设备的一种,主要用于网络上的数据接收和发送。

在后期程序排查错误时除了要考虑程序本身的错误以外,还要考虑计算机硬件故障,例如内存不足,磁盘写满,网络不通等问题

每个计算机组件的IO性能也各不相同,CPU、内存、磁盘都遵循容量越大、IO性能越差的特点。
计算机IO性能汇总
在后期优化程序时需要考虑程序时间复杂度空间复杂度的问题。

1.2.3 计算机软件系统

软件的出现实现了人和计算机更好的交互,它是由开发人员采用某种编程语言(C/C++/Java等等)编写的一系列指令以及不同业务场景产生的数据组成。

通常将软件分为系统软件和应用软件

系统软件:驱动程序、操作系统、语言处理程序等都是属于系统软件。
驱动程序是硬件厂商使用编程语言(C/C++)编写的程序,在使用硬件(例如打印机、显卡等等)前必须安装对应的驱动程序。
操作系统是负责通过驱动程序管理硬件资源,同时给应用软件提供运行平台,目前主流的操作系统有Windows,Linux,macOS,Android,iOS。
语言处理程序是用于将编程语言编写的源程序编译或者解释成对应平台的机器语言。

应用软件:微信、支付宝、淘宝、Office都是属于应用软件,它们都是运行在操作系统之上的。

运行在不同操作系统之上的软件交互方式也不一样,Linux上的软件通常是使用字符界面的交互方式,运行在Windows,macOS上的软件通常是以鼠标、键盘操作的交互方式,运行在Android,iOS上的软件通常是以手势触控、语音等交互方式。

1.3 程序和指令

程序是为了完成某项任务(例如聊天、听音乐)而使用某种编程语言(例如C/C++)编写的一组指令序列。
而指令是计算机程序控制的最小单位,由操作码和操作数组成,操作码是计算机要执行什么操作,例如加减乘除操作,而操作数具体执行的对象,具体的数据以及数据的位置。
所有指令的集合称为指令系统,常见的PC机指令系统有Intel X86指令集,常见的手机指令系统有ARM,因此手机上的程序不加修改是不能直接在PC机上运行,因为不同的指令集是不兼容的。

那么计算机是如何处理程序的?
根据冯诺依曼计算机结构的原理,计算机的工作流程大致如下

  1. 当用户从计算机中打开程序时(鼠标点击桌面的快捷方式图标),程序开始执行。
  2. 操作系统将程序的内容和相关的数据传送到内存中。
  3. CPU根据程序内容从内存中读取指令。
  4. CPU分析、处理指令,并为下一条指令做准备
  5. 取下一条指令并分析、处理,如此重复操作,直到执行完程序中的全部指令,最后将计算的结果放到指令指定的存储器地址中。

以网易云音乐播放音乐为例子

  1. 用户双击网易云应用程序播放音乐
  2. 网易云应用程序的指令和数据加载到内存
  3. CPU从内存中读取并分析指令然后通过操作系统调用驱动程序
  4. 驱动程序调用声卡播放音乐

1.4 计算机编程语言发展史

任何事物都是从无到有,逐步发展壮大起来的,编程语言也是一样。

计算机程序设计语言经历了机器语言到汇编语言和高级程序设计语言三个阶段,其特点是使得程序员用编程语言开发、测试、部署应用程序越来越方便、高效。但是是以牺牲效率为代价,但是随着计算机硬件的发展,绝大多数应用场景的效率损失可以忽略不计。

  • 机器语言
    计算机发展的最早期,程序员编写程序采用二进制的指令(010010101)来实现的,而每种CPU都有各自不同的指令系统(Ultra SPARC/Intel X86/ARM),因此在不同的机器上使用不同的机器语言实现。其特点是性能特别高效,而面向机器编程也就意味着不能移植,需要手动处理底层硬件的差异性,而且二进制的指令难以理解和维护。
  • 汇编语言
    随着时代和计算机技术的发展,汇编语言和编译器的出现解决了机器语言需要记住非常多的二进制机器指令的难题,但是还是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,然后由编译器编译成机器指令,因为计算机终归揭底只能识别二进制的0001110100110机器指令,而且汇编语言是面向机器的,不同机器(SPARC/Intel X86/ARM)的汇编指令是不相同的。
  • 高级程序设计语言
    高级程序设计语言的高级之处体现在开发人员在编写程序时无需关心计算机底层硬件差异而只需要专注于业务模块实现即可。甚至是可以实现 一次编译,到处运行,这里以Java为例子:通过实现不同平台的JVM,编译生成的字节码文件可以在任意的JVM上运行。

高级语言主要分为面向过程和面向对象两种,其中典型的面向过程编程语言就是C,面向对象的编程语言有Java,C++等等。
高级语言通常都需要编译器或者是解释器将源码编译或者解释后执行。

1.5 程序的编译和解释

由于高级编程语言和计算机底层语言是互不相通的,计算机最底层只能识别01010这种二进制的机器指令,因此需要使用工具进行语言之间的转换。这个就是程序编译或者解释的由来。

为了理解程序编译和程序解释,这里引入两种语言,分别是高级计算机语言L1,以及低级计算机语言L0。

  • 程序编译
    开发人员使用高级编程语言L1编写的应用程序通过编译器生成成计算机底层能够识别的低级语言L0,L0就是计算机实际执行的语言,而编译器生成的计算机底层识别的二进制机器指令过程就是程序编译。常见的编译型语言有C/C++/Objective-C/Go

  • 程序解释
    首先使用L0语言实现另外一个程序,也就是解释器,然后将开发人员使用高级语言L1编写的应用程序作为输入,每一句L1编写的程序都会在L0中作为等价的转换然后执行,解释的过程就是由L0编写的解释器去解释L1程序。常见的解释型语言有PHP,Python,JavaScript。

而Java和C#属于编译+解释型语言,以Java为例子,Java程序在运行之前首先被编译成Java字节码,然后在JVM虚拟机上解释运行。

1.6 计算机语言应用场景

如果想知道目前主流的编程语言有哪些,可以访问tiobe 首页获取编程语言排行榜。

2019年9月编程语言排行榜Top20
2019年9月编程语言排行榜Top20
根据Tiobe排行榜得知,Java/C/Python分别排在前三名, 随后紧跟着C++,C#,JavaScript等等。
每种编程语言都有自己擅长的应用场景。

编程语言 应用场景
C 硬件驱动、操作系统、系统软件
C++ 系统软件、网络通讯、科学计算 、游戏
C# Windows应用,Web应用、游戏
Java 大型互联网应用(淘宝、天猫),Android,大数据
Go 高并发、区块链、微服务
Kotlin Android应用开发
Swift macOS,iPhone,iPad应用开发
Python 人工智能、机器学习、自动化运维、数据分析 、图形处理
JavaScript 浏览器端、服务端、PC桌面
Scala 大数据开发

那么如果你作为初学者,面对如此之多的编程语言,到底应该先从哪门语言上车呢?如果你想深入的学习其他语言和架构相关的知识之前建议熟练掌握C语言。因为C++/Java/C#等编程语言都模仿了C语言。无论哪种语言,都是实现目标的工具,而不是目标本身。

而不出意外的话,我的全栈之路系列会覆盖上述的十种编程语言,目的是实现全平台开发,带领大家一起学习,逐步成长为开发工程师。

1.7 Java概述

1.7.1 Java发展简史

Java之父 James Golsing
Java之父 James Golsing

Java发展简史实际上主体描述的是JDK(Java Development Kit)的发展历史。这里先罗列出JDK发布的几个重要时间是节点

  • 1996年,SUN公司对外发布了JDK1.0
  • 1998年,SUN公司发布了JDK1.2
  • 1999年,SUN公司将Java分成了J2SE,J2EE,J2ME
  • 2004年,SUN公司发布了JDK1.5,也被称为JDK5.0
  • 2005年,J2SE,J2EE,J2M E分别更名为JavaSE,JavaEE,JavaME
  • 2011年,Oracle公司发布了JDK1.7,也被称为JDK7.0
  • 2014年,Oracle公司发布了JDK8.0
  • 2017年,Oracle公司发布了JDK9.0
  • 2018年3月,Oracle公司发布了JDK10.0,版本号也被称为18.3
  • 2018年9月,Oracle公司发布了JDK11.0,版本号也被称为18.9
  • 2019年3月,Oracle公司发布了JDK12.0,版本号也被称为19.3

JDK5.0是JDK发展史上具有里程碑意义的版本,具有许多新特性,例如可变参数、自动拆装箱,泛型、注解等等,JDK1.5等同于JDK5.0。

JDK7.0是Oracle公司09年收购SUN公司之后发布的第一个版本,也就意味着以后下载JDK需要去Oracle官网下载。

JDK8.0是目前互联网公司使用的主流JDK版本,许多Java的开源框架(例如SpringBoot2.x,Spring Cloud)都是基于该版本开发,也是Oracle公司长期支持的JDK版本。

JDK10以后Oracle公司将JDK的发布周期改为半年发布一个大的版本,在企业项目开发时应该选择互联网大厂在使用,并且是官方长期维护的版本,而不是最新的版本。

  • 起源
    1991年,Sun公司的James Golsing领导的工程师小组想要开发一种用于像有线电视机顶盒这样的消费类电子产品的小型计算机语言,该产品的特点是由于不同的厂商选择不同的CPU和操作系统,因此要求该语言不能和特定的体系结构绑定在一起,也就是跨平台的。最初将这个语言命名为Oak,然后发现已经有一种语言叫这个名字,然后改为Java。

  • 流行
    20世纪90年代末,Java赶上了互联网发展的潮流,而互联网的特点刚好和消费类嵌入式电子产品类似(不同计算机产商选择不同的CPU和操作系统),得益于Java的跨平台特性,可以制作在支持Java的Web浏览器内的程序(Applet)而逐渐流行起来。

  • 生态
    由于Java开源,也得到了许多大厂(例如Oracle,IBM,阿里巴巴,谷歌,苹果)的支持,逐步发展成为具有开源、跨平台、高性能、支持多线程、分布式、安全可靠等诸多特性的开发平台和运行平台,而且自JDK1.4以后逐渐涌现出许多为了简化企业级开发的开源框架,例如后期会学习的Spring Framework,MyBatis,Netty,Dubbo等等都是使用Java实现,开发者可以通过阅读Java和框架的源码来提高自身的编程功力。

  • 开发平台
    经过20多年(1995年正式对外公开发布)的发展已经逐步建立起自己强大的生态体系,在大型互联网应用开发,移动端Android开发以及大数据开发占据了广阔的市场,最典型的就是国内互联网巨头-阿里巴巴在其电商、物流、金融、支付、大数据、云计算等业务场景中大量使用了Java及其相关技术栈(Spring Framework/Spring Boot/Spring Cloud,Hadoop,Spark,Flink/Android)。

  • 运行平台
    Java程序是运行在JVM之上的,这就是Java程序跨平台实现的本质原因,而且由于Java的开放性,有越来越多的语言是运行在JVM之上的,例如大数据处理语言Scala,Android开发的Kotlin以及Clojure,Groovy等等。

1.7.2 Java技术体系平台

Java自从1998年之后将Java分为三个版本,分别是JavaSE,JavaEE和JavaME,不同的版本有不同的应用场景。

JavaSE(Java Standard Edition):标准版Java,提供了完整的Java核心API,主要用于桌面应用开发,不过目前桌面开发基本都基于C++实现。

JavaEE(Java Enterprise Edition):企业式Java,主要用于企业级后台服务,分布式应用开发

JavaME(Java Micro Edition):嵌入式Java,主要用于开发嵌入式设备的产品,例如塞班手机游戏

由于目前Java主要的擅长领域是企业级后台服务开发、Android移动应用开发以及大数据应用开发,而Java语言是它们的基石语言,因此无论是从事企业级后台服务开发,还是Android以及大数据应用开发,都要先从JavaSE上手。

1.7.3 Java语言的特性

Java是基于C/C基础之上演变而来,但是不同于C/C,Java是纯粹的面向对象语言,舍弃了C语言中容易引起错误的指针,并引入了垃圾回收机制。
相对于C/C++而言,Java更加简单易用,开发效率更高,而且基于JVM实现了跨平台,也支持分布式应用开发、高并发等应用场景。

1.8 Java开发环境搭建

1.8.1 开发环境概述

俗话说,工欲善其事必先利其器,掌握一些日常开发中使用的工具、软件能够大大的提高工作效率,工具本身推出的目的也是为了解放生产力。而软件开发是大型团队之间协作,在企业日常开发中,软件的各个版本要跟团队保持一致,避免因为版本不一致导致各种不必要的问题。

Windows上安装的应用程序通常都是.exe或者.msi格式,通常只需要去软件官网下载后双击安装即可。安装时需要注意安装的路径不能包含中文和空格,有些应用软件安装时会连带安装其他不必要的软件(全家桶套装),因为Windows通常是安装在C盘中,如果你的C盘容量比较小,可以修改软件的安装路径。

macOS上的应用程序通常是.dmg格式,下载打开之后通常都是.kpg或者.app,如果是.kpg需要根据提示进行安装,如果是.app格式,直接拖放到"应用程序"文件夹即可。

Java开发环境主要是在Windows或者macOS上搭建,通常需要安装JDK,IntelliJ IDEA,Git,Maven+Navicat/DataGrip+SecureCRT 以及常用的其他工具,例如Chrome,Visual Studio Code,PowerDesigner,Postman,Jenkins,Gitlab等工具。

1.8.2 JDK概述

JDK(Java Development Kit)是Oracle公司推出的包含了开发和运行Java程序的工具集,原SUN公司在2010年被Oracle公司以74亿美金收购。

JDK架构图
JDK架构图

这里结合Java架构图理解JDK,JRE和JVM三者之间的关系。
JDK(Java Development Kit)包含了开发和运行Java程序所必备的环境,
JRE(Java Runtime Enviroment)包含了运行Java程序所必备的环境,由JVM和Java核心类库组成
JVM(Java Virtual Machine)负责解释执行JDK编译生成的字节码文件。

1.8.3 JDK 下载

想要开发程序就必须去官网下载和安装JDK,目前互联网企业中使用最广泛的JDK版本为JDK8,而目前(2019/07/15)最新的JDK版本为JDK12,其中Oracle官方长期支持的JDK版本为JDK8和JDK11,分别支持到2025年和2026年。而JDK9,10,12都不是官方长期支持的版本,后期的学习中会覆盖所有版本涉及到的新特性。而且JDK是向下兼容,这也就意味着JDK8的特性能在JDK11上运行。

在日常开发学习中可以选择最新的版本(例如JDK12)学习,而在企业开发中,JDK的版本和线上运行的JDK版本保持一致即可。

JDK的下载非常容易,在官网获取地址,然后点击同意Lincese,选择对应的系统版本下载即可,如下图所示
下载JDK

通常开发环境只要选择下载Windows或者macOS的版本即可。
而测试环境以及生产环境需要下载Linux版本,因为国内绝大多数的服务器系统都是Linux(Ubuntu Server和CentOS)

而Java之所以能跨平台的本质原因是Oracle公司针对不同的操作系统实现了不同的JDK,Java程序只需要和JDK交互即可,JDK屏蔽了底层操作系统的差异性从而实现跨平台。

1.8.4 macOSJDK安装JDK12

Oracle官方针对JDK提供了各个平台的安装向导,读者们可以根据自己的操作系统版本查找对应的文档进行安装,这里以JDK12的安装为例,介绍macOS下JDK12的安装过程。

首先下载JDK,Chrome下载软件的默认路径就是下载,如下图所示,然后双击JDK-12.0.1_osx-64_bin.dmg文件
JDK-12.0.1_osx-64_bin.dmg

会看到JDK 12.0.1.pkg文件
JDK 12.0.1.pkg

然后会正式进入JDK的安装过程,首先是介绍
macOSJDK安装JDK12
然后选择安装类型,默认是标准安装
macOSJDK安装JDK12
此过程会提示需要输入密码,等待片刻之后JDK就会安装成功
macOSJDK安装JDK12

最后会提示是否删除安装文件,我这里就不删除了。
macOSJDK安装JDK12
最后需要验证下JDK是否安装成功,打开终端软件iTerm,然后输入命令javac -version 和
java -version,看到如下命令输出即可。
macOSJDK安装JDK12

macOS下JDK安装完成之后不需要配置JAVA_HOME和PATH环境变量

1.8.5 macOS JDK配置

macOS版的JDK默认的安装路径是/Library/Java/JavaVirtualMatchines,如下图所示,分别安装了JDK8,JDK11和JDK12,最后安装的是JDK12,所以javac -version和java -version命令输出的都是JDK12的相关信息。
 macOS JDK配置

如果想要在终端中使用其他的JDK版本,则需要在/etc/profile文件中配置JAVA_HOME和PATH,JAVA_HOME顾名思义指的就是Java的家目录,其他Java编写的程序(例如Maven,Tomcat)会依赖这个变量,而PATH是系统路径,它的作用就是系统在执行命令时执行的路径,当我们执行命令时,系统会首先在当前路径下找命令对应的可执行程序,然后去PATH路径下找。

首先打开终端程序iTerm,然后输入命令sudo vim /etc/profile

使用vim修改profile文件
使用vim修改profile文件

此时vim编辑器处于阅读模式,需要输入i进入编辑模式,然后输入如下内容

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home
export PATH=$PATH:$JAVA_HOME/bin

添加加JAVA_HOME和PATH配置
添加加JAVA_HOME和PATH配置

最后按esc推出编辑模式,再按wq!保存文件并退出。
可以使用cat /etc/profile 命令查看编辑后的profile文件内容

liuguangleideMacBook-Pro:~ liuguanglei$ cat /etc/profile
# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home
export PATH=$PATH:$JAVA_HOME$/bin

此时的配置修改并没有生效,还需要使用source /etc/profile命令让修改的配置生效。

liuguangleideMacBook-Pro:~ liuguanglei$ source /etc/profile

然后再次使用javac -version和java -version命令,输出的运行结果显示JDK版本已经切换到JDK11.0.3

liuguangleideMacBook-Pro:~ liuguanglei$ javac -version
javac 11.0.3
liuguangleideMacBook-Pro:~ liuguanglei$ java -version
java version "11.0.3" 2019-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)

1.9 macOS+VisualStudio Code开发Java程序

1.9.1 macOS下安装 Visual Studio Code

首先去Visual Studio Code的官网下载并安装,官网提供了各个操作系统的版本下载。
官网

下载之后将VSCode-darwin-stable.zip包解压后将Visual Studio Code拖放到“应用程序”文件夹即可使用了。

下载VisualStudio Code,macOS默认的路径为"下载"
下载

解压VSCode-darwin-stable.zip
解压
拖放Visual Studio Code到应用程序文件夹
应用程序

安装完成以后便可以从LaunchPad启动Visual Studio Code
LaunchPad
Visual Studio Code启动界面
Visual Studio Code启动界面

1.9.2 Visual Studio Code开发Java

Java程序开发需要经过编写、编译、解释运行三个步骤。

  • 编写
    在编写源文件之前首先在/Users/liuguanglei/Documents/下创建code/java目录,用来存放Java程序的源文件。

然后启动Visual Studio Code
启动Visual Studio Code

然后打开/User/liuguanglei/Documents/code文件夹
code/java
选择code/java目录,即后期编写的代码都会存在该目录。

然后在code目录下创建源文件HelloWorld.java,Java程序的源文件都是.java结尾。
HelloWorld.java

public class HelloWorld{
    public static void main(String[]args){
        System.out.println("Hello World Java With macOS10.14.5 & Visual Studio Code");
    }
}

Java语言规范

  • 每个Java源文件可以包含多个class,但是只能有一个class使用public修饰,而且public修饰的类名必须和源文件名一致。针对包含多个class的源文件,javac编译源文件时生成对应数量的class文件,字节码的文件名和源文件中的class类名一致。

  • Java程序如果想独立运行,必须包含固定格式public static void main(String[]args){}的main方法

  • Java中的每条执行语句都需要包含在代码块{}或者是方法,并且以分号(;)结束

  • 控制台输出可以使用System.out.println(),然后传递字符串参数即可。

  • 每次改动Java源代码必须要重新编译后运行。

  • Java严格区分大小写,例如System和system是完全不同的含义。

  • 编译
    JDK提供了javac命令来编译Java源程序,javac编译生成面向JVM规范实现的字节码文件,和平台无关性。

macOS上可以使用自带的终端软件或者是iTerm来调用javac命令。
首先使用cd命令切换到源代码的目录,然后使用javac命令编译源文件HelloWorld.java,生成HelloWorld.class

Last login: Sat Aug 24 19:04:26 on ttys000
liuguangleideMacBook-Pro:~ liuguanglei$ cd Documents/code/java
liuguangleideMacBook-Pro:java liuguanglei$ javac HelloWorld.java
liuguangleideMacBook-Pro:java liuguanglei$ ls
HelloWorld.class	HelloWorld.java
  • 解释运行
    JDK提供了java命令来解释运行javac编译生成的字节码文件,使用java HelloWorld就可以解释执行字节码文件,需要注意的是使用java命令解释执行字节码文件时不需要指定后缀名
liuguangleideMacBook-Pro:java liuguanglei$ java HelloWorld
Hello World Java With macOS10.14.5 & Visual Studio Code

编译解释执行HelloWorld
编译解释执行HelloWorld

如果使用java命令解释运行时出现"找不到或者无法加载主类"意味着当前路径不存在执行的class文件。

1.9.3 Visual Studio Code 集成Java插件

Visual Studio Code 集成Java插件,能让Visual Studio Code开发Java更加高效便捷。

在启动Visual Studio Code之后,选择 Extensions(快捷键Command+Shift+x),然后搜索Java,选择Java Extends Pack,并点击Install。
Java Extension Pack

插件安装完成以后就不需要在终端上使用javac和java命令来编译和解释运行Java程序了,可以直接在Visual Studio Code中直接编译运行Java。

运行程序
运行程序

如果发现在Visual Studio Code运行Java程序(例如这里的HelloWorld)时不是安装JDK时指定JAVA_HOME的版本,macOS用户可以修改

/Users/liuguanglei/Library/Application Support/Code/User 路径下的setting.json文件,添加配置 "java.home":"/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home" 即可。
切换JDK版本

如果想要测试效果,可以借助JDK的API实现,应用程序SystemProperty.java如下所示

public class SystemProperty{
    public static void main(String[]args){
        //获取所有的Java内置属性
        System.getProperties().list(System.out);
        //输出Java的版本信息
        System.out.println("当前使用的Java版本信息是"+System.getProperty("java.version"));
    }
}

初学者建议使用Visual Studio Code+Java插件来学习Java,而项目开发时推荐使用IntelliJ IDEA开发项目

1.10 Java程序的运行机制

由于高级编程语言和计算机底层语言是互不相通的,计算机最底层只能识别01010这种二进制的机器指令,因此需要使用工具进行语言之间的转换。这个就是程序编译或者解释的由来。

为了理解程序编译和程序解释,这里引入两种语言,分别是高级计算机语言L1,以及低级计算机语言L0。

  • 程序编译
    开发人员使用高级编程语言L1编写的应用程序通过编译器生成成计算机底层能够识别的低级语言L0,L0就是计算机实际执行的语言,而编译器生成的计算机底层识别的二进制机器指令过程就是程序编译。常见的编译型语言有C/C++/Objective-C/Go

  • 程序解释
    首先使用L0语言实现另外一个程序,也就是解释器,然后将开发人员使用高级语言L1编写的应用程序作为输入,每一句L1编写的程序都会在L0中作为等价的转换然后执行,解释的过程就是由L0编写的解释器去解释L1程序。常见的解释型语言有PHP,Python,JavaScript。

Java源程序首先要经过C语言实现的javac编译器将源文件编译生成和平台无关的字节码文件(.class结尾的文件),如果源文件中有Java语法错误,则会导致无法编译通过
然后在运行时通过Java虚拟机内嵌的解释器将字节码转换为真正的机器码。

源程序是需要遵守Java语言规范,字节码文件是需要遵守JVM规范。
如果想要了解Java语言规范和JVM规范,可以拜读官方文档,其官网地址是https://docs.oracle.com/javase/specs/index.html

1.11 注释

1.11.1 注释概述

注释(Comment)是用于描述程序的文字信息,Java中的注释分为如下三种

  • 单行注释:注释一行内容,使用//表示,通常在方法内容使用
  • 多行注释 注释多行内容, 使用/**/表示,通常在方法内部使用,多行注释不能嵌套,否则会发生编译错误
  • 文档注释 用于生成Java API文档,使用/***/表示,通常在类上,属性上和方法上使用,可以使用javadoc -d 文档目录 源文件名生成API文档

在日常开发中应该多写注释,便于程序后期维护,而在程序调试的过程中,也可以通过注释部分代码来调试程序,注释的内容在javac编译时都会删除,不会影响程序的运行结果。

1.11.2 注释的使用

源程序HelloWorld.java中添加了三种注释。


/**
 * Java版本HelloWorld
 */
public class HelloWorld{
    /**
     * 程序的入口,所有代码从这里开始执行
     * @param args
     */
    public static void main(String[]args){
        //向终端输出Hello World With macOS10.14.5 & Visual Studio Code
        System.out.println("Hello World With macOS10.14.5 & Visual Studio Code");
        /*
         * 学习编程的方法
         * 1. 看视频
         * 2. 敲代码
         * 3.总结文章,发博客
         */
    }
}

添加注释后再次运行程序不会影响程序运行结果
注释版HelloWorld

1.11.3 文档注释

文档注释是使用JDK提供的javadoc工具生成基于网页的API文档,我们可以在终端上运行javadoc -d 路径 源文件.java 生成帮助文档。

liuguangleideMacBook-Pro:code liuguanglei$ javadoc -d /Users/liuguanglei/Documents/doc/ HelloWorld.java
正在加载源文件HelloWorld.java...
正在构造 Javadoc 信息...
标准 Doclet 版本 11.0.3
正在构建所有程序包和类的树...
正在生成/Users/liuguanglei/Documents/doc/HelloWorld.html...
HelloWorld.java:8: 警告: @param 没有说明
     * @param args
       ^
正在生成/Users/liuguanglei/Documents/doc/package-summary.html...
正在生成/Users/liuguanglei/Documents/doc/package-tree.html...
正在生成/Users/liuguanglei/Documents/doc/constant-values.html...
正在构建所有程序包和类的索引...
正在生成/Users/liuguanglei/Documents/doc/overview-tree.html...
正在生成/Users/liuguanglei/Documents/doc/index-all.html...
正在构建所有类的索引...
正在生成/Users/liuguanglei/Documents/doc/allclasses-index.html...
正在生成/Users/liuguanglei/Documents/doc/allpackages-index.html...
正在生成/Users/liuguanglei/Documents/doc/deprecated-list.html...
正在构建所有类的索引...
正在生成/Users/liuguanglei/Documents/doc/allclasses.html...
正在生成/Users/liuguanglei/Documents/doc/allclasses.html...
正在生成/Users/liuguanglei/Documents/doc/index.html...
正在生成/Users/liuguanglei/Documents/doc/help-doc.html...
1 个警告

然后使用Chrome打开/Users/liuguanglei/Documents/doc/目录下的index.html文件,便会看到如下的JDK API文档信息。
index.html

1.12 Java API文档使用

JDK中封装了大量开发中常用的API(Application Programming Interface),其文档也是使用javadoc工具实现的,JDK12的API文档地址是 https://docs.oracle.com/en/java/javase/12/docs/api/index.html

后期会学习JDK提供的日常开发中常用类,可以使用搜索框搜索指定的类(例如java.lang.String)来查看类提供的方法,成员变量等等信息。

search String
search String

macOS还可以通过安装应用程序Dash来实现离线查阅JDK帮助文档
Dash 是使用与Mac OS平台的软件编程文档管理工具,可以浏览API文档,以及管理代码片段工具。Dash自带了丰富的API文档,涉及各种主流的编程语言和框架。 Dash内置了丰富的API文档,让我们集中管理API文档,包括下载、搜索、查阅并支持集成到XCode、Alfred等软件中,非常的强大!

下载安装Dash后,启动Dash,然后点击Download Docsets
Download Docsets

在搜索框中搜JavaSE,然后选择对应的版本下载即可。
搜搜Java SE并安装

下载完成之后,即使没有网络,也可以在Dash中查阅JDK API文档
Dash中查看JDK文档

原文地址:https://www.cnblogs.com/ittimeline/p/11442440.html