第1章 - Java介绍
作者:vwFisher
时间:2019-09-02
GitHub代码:https://github.com/vwFisher/JavaBasicGuide
目录
1 计算机语言概述
-
什么是软件
- 软件: 一系列按照特定顺序组织的计算机数据和指令的集合就是软件
- 常见的软件:1).系统软件: DOS, Windows,Linux等;2).应用软件: 扫雷,迅雷,QQ等
-
人机交互,软件的出现实现了人与计算机之间的更好的交互,一般的交互方式如下:
- 图形化界面(Graphical User Interface GUI):这种方式简单直观,使用者易于接受,容易上手操作.
- 命令行方式(Command Line Interface CLI):需要有一个控制台,输入特定的指令,让计算机完成一些操作,较为麻烦,需要记录在一些命令
-
什么是计算机语言
- 语言: 是人与人之间用于沟通的一种方式
- 计算机语言: 人与计算机交流的方式(那么需要学习计算机语,如C,C++,Java等)
2 Java语言概述
- SUN(Stanford University Network,斯坦福大学网络公司),1995年推出的一门高级编程语言
- 是一种面向Internet的编程语言
- 随着Java技术在Web方面的不断成熟,已经成为Web应用成功的首选开发语言
- 是简单易学,完全面向对象,安全可靠,与平台无关的编程语言
2.1 Java语言的三种技术架构
1.J2EE(Java 2 Platform Enterprise Edition) 企业版
是为开发企业环境下的应用程序提供的一套解决方案,该技术体系中包含的技术如Servlet,Jsp等,主要针对于Web应用程序开发
2.J2SE(Java 2 Platform Standard Edition) 标准版
是为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可以完成桌面应用程序的开发(如Java版的扫雷)
3.J2ME(Java 2 Platform Micro Edition) 小型版
是为开发电子消费产品和嵌入式设备提供的解决方案,该技术体系主要应用于小型的消费类产品,如手机中的应用程序等
注: Java5.0版本后,更名为JAVAEE,JAVASE,JAVAME
2.2 JVM、JDK、JRE
2.2.1 JVM - Java的特点: 跨平台原理,安全性
Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
什么是字节码?采用字节码的好处是什么?
在 Java 中,JVM可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译便可在多种不同操作系统的计算机上运行。
Java 程序从源代码到运行一般有下面3步:
需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。
HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。
总结:
编写的Java源码,编译后会生成 .class (字节码文)文件,这解决了2大问题:安全性 和 可移植性
JVM就是负责将.class文件(字节码文件)翻译成特定平台下的机器码然后运行。JVM是一个 中间件(桥梁"),是实现跨平台的关键,Java代码首先被编译成字节码文件,再由JVM将字节码文件翻译成机器语言,从而达到在不同平台运行Java程序的目的(实现"一次编译,到处运行")
注意:
编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行. 不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。所以,运行Java程序必须有JVM的支持,因为编译的结果不是机器码,必须要经过JVM的再次翻译才能执行. 即使你将Java程序打包成可执行文件(例如.exe),仍然需要JVM的支持
跨平台的是Java程序,不是JVM. JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM.
2.2.2 JDK、JRE
JDK(Java Development Kit),它是功能齐全的Java SDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序
JRE(Java Runtime Envioment),它是运行已编译 Java 程序所需的所有内容的集合,包括 Java虚拟机(JVM),Java类库,java命令和其他的一些基础构件。但是,它不能用于创建新程序。
简单而言,使用JDK开发完成的Java程序,交给JRE去运行
如果你只是为了运行一下 Java 程序的话,那么你只需要安装 JRE 就可以了。如果你需要进行一些 Java 编程方面的工作,那么你就需要安装JDK了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何Java开发,仍然需要安装JDK。例如,如果要使用JSP部署Web应用程序,那么从技术上讲,您只是在应用程序服务器中运行Java程序。那你为什么需要JDK呢?因为应用程序服务器会将 JSP 转换为 Java servlet,并且需要使用 JDK 来编译 servlet。
2.2.3 JDK目录介绍
该图 适用于 JDK1.8 之前
sample:包含了使用 JNLP 的示例应用程序,JNLP(Java Network Launching Protocol),用于在一个网络服务器中执行应用程序或applet,但不需要浏览器,也不需要下载和安装代码.
jre:Java Runtime Environment,包含执行Java程序时将要用到的 Java 运行时环境工具. Java库中的类存储在jre\lib目录下. 它们并不会单个出现. 它们都被打包并存放在归档文件rt.jar中. JRE会在程序执行时确保提取所需的类.
2.2.4 Oracle JDK、OpenJDK
- Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
- OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是 OpenJDK 的一个实现,并不是完全开源的;
- Oracle JDK 比 OpenJDK 更稳定。OpenJDK 和 Oracle JDK 的代码几乎相同,但 Oracle JDK 有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择 Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用 OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到 Oracle JDK就可以解决问题;
- 在响应性和JVM性能方面,Oracle JDK 与 OpenJDK 相比提供了更好的性能;
- Oracle JDK 不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;
- Oracle JDK 根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。
2.2.5 Java和C++的区别?
都是面向对象的语言,都支持封装、继承和多态
- Java 不提供指针来直接访问内存,程序内存更加安全
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
- Java 有自动内存管理机制,不需要程序员手动释放无用内存
2.2.5 Java应用程序 与 Java小程序
Java应用程序:
- 有个主类,且主类包含 main() 方法。
- 主类不一定要求是 public 类。
- 主类是 Java 程序执行的入口点
Java小程序:
- 主类是一个继承自系统类 JApplet 或 Applet 的子类。
- 小程序的主类要求必须是 public 类
- 主要是嵌在浏览器页面上运行(调用init()或者run()来启动),嵌入浏览器这点跟 flash 的小游戏类似。
2.3 Javac.exe
命令行模式(非图形化界面)
Windows:Win+R -> 进入CMD -> 执行JDK安装位置下的/bin/javac.exe
输入help看命令行操作
基本操作:注意 有包名 和 没有包名 的区别
javac Hello.java
java Hello
javac com/demo/Hello.java
java com.demo.Hello
2.4 执行Applet
JDK中的Java编译器能编译应用程序和applet. 但applet的执行方式与应用程序不同. 必须在applet执行前将其嵌入到网页中.
因为本人无法再IE中打开Java applet,所以无法实地测试,同时applet使用率已经很少
所以编写的HTML内嵌Java applet可以通过在命令行输入appletviewer xxx.html
在HTML中,通过<applet>标签将class文件引入,如
<applet code="MyFirstApplet.class" width=350 height=200></applet>
class文件的路径,如果没有写路径,需要放在同一个目录下.
3 Java语言环境变量
3.1 环境变量的配置
1.Windows
- 我的电脑 -> 属性 -> 系统设置 -> 环境变量
- 在系统变量中,新建一个JAVA_HOME,配置内容:D:\Program Files\Java\jdk1.8.0_45
- 寻找PATH变量:添加内容:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
- 寻找CLASSPATH,没有就新增CLASSPATH变量,内容:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
注意: 配置\jdk\bin的环境变量,才可以在任何目录下使用javac.exe
2.Linux
vim /etc/profile
添加内容
#Java config
JAVA_HOME=/usr/local/app/jdk1.8.0_152
JRE_HOME=/usr/local/app/jdk1.8.0_152/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME CLASS_PATH PATH
使其生效
source /etc/profile
3.2 临时配置环境变量
进入cmd,使用set path来设置临时变量,而不会改变电脑本身环境变量
set path=*********
3.3 Java Tools
3.3.1 JAR
JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件. 为J2EE应用程序创建的JAR文件是EAR文件(企业JAR文件).
jar: 可以看到命令列表
jar -cf /projectPath/jarDemo.jar
4 Java程序开发体验
4.1 Hello World!
要学习Java程序,首先应该了解程序的基本结构,这样有利于进一步学习Java语言. 一个Java程序的基本结构大体分为包、main()方法、标识符、关键字、语句和注释等
HelloWorld的初体验
public class HelloWorld {
/** 定义一个主函数,为了保证程序的独立运行*/
public static void main(String[] args) {
/** 这是输出语句,用于将括号中的数据打印到控制台上,ln可以在数据的结尾处换行。*/
System.out.println("Hello World!");
}
}
- 将Java代码编写到扩展名为.java的文件中
- 通过javac命令对该java文件进行编译。javac HelloWord.java
- 通过java命令对生成的class文件进行运行。java HelloWorld.class
流程:.java文件 -- javac.exe(编译) -> .class文件 -- java.exe(运行) -> 结果
注意:
- 在Java语言中,主方法的写法是固定的,除主方法的形参"String[] args"可以修改为"String args[]"以外,不可以修改其他任何部分,否则Java程序都将无法运行
- 设置的classpath环境变量就是javac 生成class的位置
- Java编译器假设源代码在工作环境中使用默认的字符编码. 如果不是,就必须设定-encoding选项来告知编译器源代码所使用的字符编码. 例如: javac.exe -encoding Unicode HelloWorld.java
4.2 Java的类库
Java中的库是类的集合(通常提供相关的工具)可以在程序中使用. 下表是经常使用的标准包
包名 | 描述 |
---|---|
java.lang | 支持基本语言特征并处理数组和字符串的类. 该包在程序中自动加载,所以在程序中直接可用 |
java.io | 用于流输入和输出操作的类 |
java.nio.file | 用于文件输入和输出的类 |
java.util | 各种类型的实用程序类,包括在集合或数据项组中管理数据的类 |
javax.swing | 提供易用且灵活的组件来构建图形用户界面(Graphical User Interface,GUI),也称Swing组件 |
java.awt | 提供原始的GUI组件(JDK1.1)以及一些对Swing组件必要的基本支持 |
java.awt.geom | 这些类定义二维的几何形状 |
java.awt.event | 在窗口应用程序的实现中用来处理程序中的事件. 事件是指移动鼠标、单击鼠标左键或菜单选项等 |
import java和javax有什么区别?
在开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来使用。
随着时间的推移,javax 逐渐地扩展成为 Java API 的组成部分。但是将扩展从 javax 包移动到 java 包确实太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准API的一部分。
所以,实际上java和javax没有区别。这都是一个名字。
4.3 Java与Unicode
Unicode是一个标准字符集(用来支持对几乎所有语言的编码)。Unicode使用16比特(大部分国家的语言都用不同的8比特字符集定义,但是8比特只能有256种不同的编码,不足以表示那么多的字符)的编码来代表一个字符(所以每个字符占据两个宇节),而且16比特可以区别65535个非零字符编码. 有如此多可用的字符编码,足够为每种主要的字符集分配白身的编码集,包括Kanji这样的字符集,用于日语并且需要上万个字符编码. 而且事情还不止于此. Unicode支持三种编码方式,最多允许表示多达一百万个的额外字符.
Java源代码是Unicode字符. 注释、标识符以及字符和字符串都能使用Unicode集合中表示字母的任意字符. Java也支持使用Unicode来表示字符和字符串,所以框架支持一个程序中含有各种国际语言. 最熟悉的普通ASCII集合对应Unicode集合的前128个字母. 除了要注意每个字符通常占据两个字节之外,大部分情况下可以忽略对Unicode字符的处理,除非要从一开始就构建一个支持多语言的应用程序.
之所以说每个Unicode字符通常都占据两个字节,是因为Java支持Unicode4.0,因而允许使用32比特编码的超大字符集. 可能认为使用16比特能够表示的64K的字符集己经足够,但是其实不然. 仅仅东方语言,例如日语、朝鲜语以及中文就单独包含70000多个象形文字(一个象形文字只是一个图形符号,有时叫做表意文字). 超大字符集用来表示在由 16比特字符定义的基本多语言集合中没有包括的字符