第1章 - Java介绍

第1章 - Java介绍

作者:vwFisher

时间:2019-09-02

GitHub代码:https://github.com/vwFisher/JavaBasicGuide

目录



1 计算机语言概述

  1. 什么是软件

    • 软件: 一系列按照特定顺序组织的计算机数据和指令的集合就是软件
    • 常见的软件:1).系统软件: DOS, Windows,Linux等;2).应用软件: 扫雷,迅雷,QQ等
  2. 人机交互,软件的出现实现了人与计算机之间的更好的交互,一般的交互方式如下:

    • 图形化界面(Graphical User Interface GUI):这种方式简单直观,使用者易于接受,容易上手操作.
    • 命令行方式(Command Line Interface CLI):需要有一个控制台,输入特定的指令,让计算机完成一些操作,较为麻烦,需要记录在一些命令
  3. 什么是计算机语言

    • 语言: 是人与人之间用于沟通的一种方式
    • 计算机语言: 人与计算机交流的方式(那么需要学习计算机语,如C,C++,Java等)




2 Java语言概述

  1. SUN(Stanford University Network,斯坦福大学网络公司),1995年推出的一门高级编程语言
  2. 是一种面向Internet的编程语言
  3. 随着Java技术在Web方面的不断成熟,已经成为Web应用成功的首选开发语言
  4. 是简单易学,完全面向对象,安全可靠,与平台无关的编程语言

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步:

Java程序从源代码到运行.png

需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。

HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。

总结

  1. 编写的Java源码,编译后会生成 .class (字节码文)文件,这解决了2大问题:安全性 和 可移植性

  2. JVM就是负责将.class文件(字节码文件)翻译成特定平台下的机器码然后运行。JVM是一个 中间件(桥梁"),是实现跨平台的关键,Java代码首先被编译成字节码文件,再由JVM将字节码文件翻译成机器语言,从而达到在不同平台运行Java程序的目的(实现"一次编译,到处运行")

注意:

  1. 编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行. 不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。所以,运行Java程序必须有JVM的支持,因为编译的结果不是机器码,必须要经过JVM的再次翻译才能执行. 即使你将Java程序打包成可执行文件(例如.exe),仍然需要JVM的支持

  2. 跨平台的是Java程序,不是JVM. JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM.

2.2.2 JDK、JRE

JDK-structure.png
  1. JDK(Java Development Kit),它是功能齐全的Java SDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序

  2. 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 之前

JDK-directory-Introduction.png
  1. sample:包含了使用 JNLP 的示例应用程序,JNLP(Java Network Launching Protocol),用于在一个网络服务器中执行应用程序或applet,但不需要浏览器,也不需要下载和安装代码.

  2. jre:Java Runtime Environment,包含执行Java程序时将要用到的 Java 运行时环境工具. Java库中的类存储在jre\lib目录下. 它们并不会单个出现. 它们都被打包并存放在归档文件rt.jar中. JRE会在程序执行时确保提取所需的类.

2.2.4 Oracle JDK、OpenJDK

  1. Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
  2. OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是 OpenJDK 的一个实现,并不是完全开源的;
  3. Oracle JDK 比 OpenJDK 更稳定。OpenJDK 和 Oracle JDK 的代码几乎相同,但 Oracle JDK 有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择 Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用 OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到 Oracle JDK就可以解决问题;
  4. 在响应性和JVM性能方面,Oracle JDK 与 OpenJDK 相比提供了更好的性能;
  5. Oracle JDK 不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;
  6. Oracle JDK 根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。

2.2.5 Java和C++的区别?

都是面向对象的语言,都支持封装、继承和多态

  1. Java 不提供指针来直接访问内存,程序内存更加安全
  2. Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
  3. Java 有自动内存管理机制,不需要程序员手动释放无用内存

2.2.5 Java应用程序 与 Java小程序

Java应用程序:

  1. 有个主类,且主类包含 main() 方法。
  2. 主类不一定要求是 public 类。
  3. 主类是 Java 程序执行的入口点

Java小程序:

  1. 主类是一个继承自系统类 JApplet 或 Applet 的子类。
  2. 小程序的主类要求必须是 public 类
  3. 主要是嵌在浏览器页面上运行(调用init()或者run()来启动),嵌入浏览器这点跟 flash 的小游戏类似。

2.3 Javac.exe

命令行模式(非图形化界面)

Windows:Win+R -> 进入CMD -> 执行JDK安装位置下的/bin/javac.exe

  1. 输入help看命令行操作

  2. 基本操作:注意 有包名 和 没有包名 的区别

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

applet-import-html.png
在HTML中,通过<applet>标签将class文件引入,如
<applet code="MyFirstApplet.class" width=350 height=200></applet>
class文件的路径,如果没有写路径,需要放在同一个目录下.




3 Java语言环境变量

3.1 环境变量的配置

1.Windows

  1. 我的电脑 -> 属性 -> 系统设置 -> 环境变量
  2. 在系统变量中,新建一个JAVA_HOME,配置内容:D:\Program Files\Java\jdk1.8.0_45
  3. 寻找PATH变量:添加内容:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
  4. 寻找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!");
    }
}
  1. 将Java代码编写到扩展名为.java的文件中
  2. 通过javac命令对该java文件进行编译。javac HelloWord.java
  3. 通过java命令对生成的class文件进行运行。java HelloWorld.class

流程:.java文件 -- javac.exe(编译) -> .class文件 -- java.exe(运行) -> 结果

注意:

  1. 在Java语言中,主方法的写法是固定的,除主方法的形参"String[] args"可以修改为"String args[]"以外,不可以修改其他任何部分,否则Java程序都将无法运行
  2. 设置的classpath环境变量就是javac 生成class的位置
  3. 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比特字符定义的基本多语言集合中没有包括的字符

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 面向对象编程(OOP) Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点...
    大家请叫我小杰阅读 1,128评论 0 0
  • Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点: 代码开发模块化,更易...
    安安静静写代码阅读 1,095评论 0 8
  • [TOC] 1.1 软件开发介绍 软件开发 软件,即一系列按照特定顺序组织的计算机数据和指令的集合。有系统软件和应...
    我超暖的阅读 597评论 0 0
  • 面向对象编程(OOP) Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点...
    hutuxiaogui阅读 937评论 0 2
  • 电子书下载地址: http://wiki.jikexueyuan.com/project/java-intervi...
    极客学院Wiki阅读 6,007评论 12 224