疯狂Java笔记:第 1 章 Java简介与开发环境的搭建

第 1 章 Java 语言概述与开发环境

1.1 Java 语言的发展简史[了解]

Sun公司 决定在 C++ 基础上开发一种面向对象的新语言,为下一代智能家电编写一个通用控制系统,失败后决定创造一种全新的语言 Oak

1994年 互联网和浏览器出现,通过对 Oak 小规模改造,完成了第一个 Java 语言的网页浏览器:WebRunner。由于 Oak 商标已经被注册,更名为 Java

1995年 Sun 公司将 Java 开源[公开源代码]。互联网上出现许多 Java 小程序[Applet], Java 成为广为人知的编程语言

1996年 Sun 发布了 JDK 1.0。包含:

  • 运行环境[JRE]:核心API、集成API、用户界面API、发布技术、JVM
  • 开发环境[JDK]:编译 Java 程序的编译器[javac命令]

1997年 发布 JDK 1.1,增加了即时编译器[JIT],能够将常用指令保存到内存,下次调用无须重新编译,提升了JDK效率

Flash 的出现蚕食了 Java 在网页上的应用

1998 年 Sun 发布了历史上最重要的 JDK 1.2、JSP/Servlet、EJB 规范,将 Java 分成 J2EE、J2SE、J2ME

2002 年 Sun 发布了历史上最成熟的 JDK 1.4 。出现:

  • 大量基于 Java 的开源框架 Struts WebWork Hibernate Spring
  • 大量企业应用服务器 WebLogin WebSphere JBoss

2004 年 Sun 发布 JDK 1.5 ,更名 Java SE、Java EE、Java ME

增加了 泛型,增强for循环,可变数量形参,注释,自动拆箱/装箱

推出了 EJB3.0 规范/MVC 框架规范[JSF],用于快速构建复杂 JSP 界面

2006 年 发布 JDK 1.6

2009 年,Orcale 收购 Sun ,获得 Java、Solaris

2007 年,Google 推出 基于Linux 的 Android 手机操作系统,使用 Java 语言开发应用程序

2011 年,Orcale 发布 Java SE7 ,引进 二进制整数、支持字符串的switch语句、菱形语法、多异常捕捉、自动关闭资源的try语句

2014 年,Orcale 发布 Java SE8 ,引进 Lambda表达式

1.2 Java 的竞争对手及各自优势[了解]

Java 是最流行的面向对象编程语言,类似的有 C#、Ruby、Python

1.2.1 C# 简介及优势

Microsoft 推出 .NET 平台,并发布 C#语言,与 Java 有90%的重叠

  • 两者都改进了 C++ 艰深晦涩的语法和语义。摒弃了函数及其参数的const修饰,宏替换,全局变量,全局函数等华而不实的地方。
  • 继承方面都采用了单继承和多接口的实现方案。
  • 源代码组织方面,都提出了声明与实现于一体的逻辑封装。

C# 创建 Windows 服务,记录 Windows 事件日志,访问注册表时更方便,Visual Studio 开发平台开发效率极高

1.2.2 Ruby 简介和优势

日本人研发

简洁的解释型语言,纯粹的面向对象,弱类型[变量无须声明,没有类型],完全跨平台,可以在任何操作系统上解释执行

MVC 框架:Ruby On Rails,真正意义上的敏捷开发框架,提供大量代码生成器,提供一站式解决方案,Web 层的MVC 框架,持久层的ORM等

适合中小型应用。而Java适合大型企业级应用/服务器端/Android

1.2.3 Python 简介和优势

高级动态编程语言–基于 ABC 教学语言[专门为非程序员设计的优美强大的语言]

面向对象的解释型编程语言,也是一种功能强大的通用型语言。

具有简洁而清晰的语法特点,适合完成各种高层任务,可以在所有主流操作系统运行

设计哲学:对于一个特定问题,只要有一种最好的方法来解决就好了[甚至不是格式自由的语言,强制缩进]

1.3 Java 程序运行机制

1.3.1 高级语言的运行机制

  1. 编译型
    • 指使用专门编译器,将源代码翻译成特定平台[操作系统]的可被执行的机器码,并包装成该平台所能识别的可执行性程序的格式,该转换过程称为编译。
    • 编译型语言一次性编译成机器码,编译程序可以脱离开发环境运行,在特定平台独立运行运行,效率较高,但移植性差
    • 例如:C、C++、Object-C、Pascal
  2. 解释型
    • 指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言
    • 通常不会进行整体性的编译和链接处理,相当于将编译型语言的编译和解释过程同时完成
    • 解释型语言的程序每次执行都需要进行一次编译,运行效率通常较低,且不能脱离解释器独立运行。
    • 优势:跨平台容易,只需要提供特定平台的解释器即可,方便的实现源程序级的移植
    • 例如:Ruby、Python
  3. 伪编译型语言:Visual Basic[半编译型语言]。
  4. Java 是特殊的高级语言,兼具解释型语言和编译型语言的特征,Java程序需要先编译后解释

1.3.2 Java 程序的运行机制和 JVM

执行Java程序的步骤:

  1. Java源程序先编译成平台无关的字节码文件[.class文件][不可执行的]
  2. 用Java解释器[Java虚拟机:JVM]来解释.class文件成为特定平台的机器码并执行
  3. 执行Java程序的示意图:

JVM:负责解释执行字节码文件,向编译器提供相同的编程接口。编译器面向虚拟机编程,生成虚拟机能理解的代码,由虚拟机解释执行。

  • 编译器:编译Java程序生成平台无关的字节码,不面向任何平台,只面向JVM,不同平台有不同的JVM解释该字节码文件。

JVM 向上提供统一接口给编译器[源文件-.class文件],向下则面向不同平台提供不同实现

JVM 规范统一标准,实现平台无关性:指令集、寄存器、类文件的格式、栈、垃圾回收堆、存储区

JVM 是一个抽象的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存和寄存器

1.4 开发 Java 的准备

1.4.1 下载和安装 Java8 的 JDK

SDK: Software Development Kit,即 Java EE开发包,包含了JDK

JDK:Java SE Development Kit,即 Java标准版开发包,是 Sun 提供的一套用于开发Java应用程序的开发包,提供了编译、运行Java程序所需的各种工具和资源,包括 Java编译器、Java运行时环境[JRE]、常用 Java类库

JRE:Java Runtime Environment Java运行时环境,运行Java程序的必需条件[JVM,类加载器,字节码校验器,大量基础类库]

JVM:运行Java程序的核心虚拟机

SDK>JDK>JRE>JVM

JDK 文件目录

  • bin:存放 JDK 各种工具命令[javac,java等]
  • db:安装 JavaDB 的路径
  • include:一些平台特定的头文件
  • jre:运行 Java程序 必需的 JRE环境
  • lib:存放 JDK 工具命令的实际执行程序[处理.class文件]
    • 用于编译Java程序的javac.exe命令是用Java编写的,该类就是lib路径下tools.jar文件中sun\tools\javac路径下的Main类
  • JDK 的bin路径下的.exe命令实际上仅仅是包装了lib中的Java类。
  • javafx-src.zip:存放JavaFX所有核心类库的源代码。
  • src.zip:存放JavaFX所有核心类库的源代码。
  • README、LICENSE 等说明性文档

1.4.2 设置 PATH 环境变量

Windows 操作系统根据 Path 环境变量来查找命令。

Path 环境变量 的值是一系列路径,Windows 将在这些路径中依此查找命令。

安装JDK注意事项:
1. 避免将JDK安装在带文件名空格的路径[文件夹]
2. 配置环境变量:添加 [JDK安装目录\bin] 到 Path 环境变量即可,无须配置CLASSPATHJAVA_HOME环境变量
3. 传送门:JDK下载
4. 传送门:JDK环境搭建教程

1.5 第一个 Java程序

1.5.1 编辑 Java 源代码

新建一个文件,文件名同类名[即HelloWorld],文件后缀名为.java,内容如下:

public class HelloWorld{
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

1.5.2 编译 Java 程序

在命令行窗口中进入源程序所在路径,执行以下命令:

javac -d destdir srcFile
    destdir:指定编译生成的字节码文件的存放路径
    srcFile:Java源文件所在的位置[绝对路径、相对路径均可]

示例1:javac -d . HelloWorld.java [.代表当前路径]
示例2:javac HelloWorld.java [省略-d选项,则生成的.class文件放在当前路径]

1.5.3 运行 Java 程序

在命令窗口中进入源程序所在路径,执行以下命令:

java package.JavaClassName [java 包名.类名] 
示例:java HelloWorld [Java类不属于任何包时可以省略包名]

1.5.4 根据 CLASSPATH 环境变量定位类

JDK 1.4 之前

  • 当使用java命令运行JAVA程序时,JRE 不会自动在当前路径搜索Java类
  • 环境变量需要设置如下:
    1. JAVA_HOME:JDK安装路径
    2. CLASSPATH:.;%JAVA_HOME%\lib .用于告诉JRE需要在当前路径搜索Java类,且加载dt.jar和tools.jar文件中的Java类,
    3. Path:%JAVA_HOME%\bin

JDK 1.5 之后

  • JRE 会自动搜索当前路径下的类文件,且使用java编译和运行工具时,系统可以自动加载dt.jar和tools.jar文件中的Java类,无须设置 CLASSPATH
  • java -classpaht dir1;dir2;dir3…;dirN Java类 :临时强制指定 JRE 搜索Java类的路径[指定后JVM将不会在当前路径搜索,且环境变量CLASSPATH指定的路径也失效]

1.6 Java 程序的基本规则

1.6.1 Java 程序的组织形式

Java 是纯粹的面向对象的程序设计语言,Java程序必需以类形式存在,类是Java程序的最小程序单位,不允许可执行性语句、方法等独立存在。

// 这才是最简单的类--空类,编译通过[说明类定义是正确的],但不能运行[没有main方法]
class SimplClass{
    // 能被解释器解释执行的类必需包含 public static void main(String[] args) {}
    // JVM 从该方法开始解释执行,是程序的入口。
}

1.6.2 Java 源文件的命名规则

文件名后缀必需是 .java

源文件文件名必需与 该文件中 public修饰的类同名—-通常建议一个源文件只定义一个类,确保文件名与类名相同

1.6.3 初学者易犯错误

CLASSPATH 环境变量问题:若设置必需加.代表当前路径下搜索,通常无须设置。

大小写问题:Java 严格区分大小写,关键字全是小写的

安装路径包含空格的问题:Windows 系统许多路径包含空格,安装编程相关工具时应该避开这些路径,否则可能引发错误

1.7 垃圾回收机制[了解]

程序显式进行垃圾回收的缺点:

  • 程序忘记及时回收无用内存,导致内存泄露,降低系统性能
  • 程序错误的回收程序核心类库的内存,导致系统崩溃

Java 程序的内存分配和回收由 JRE 在后台自动进行。JRE 负责回收不再使用的内存,称为垃圾回收。

  • JRE 提供一个后台线程来进行检测和控制,一般在CPU空闲或内存不足时进行垃圾回收,程序员无法精准控制

Java 所有JVM实现都有一个由垃圾回收器管理的堆内存,堆内存是一个运行时数据区,用以保存类的实例[对象]。

垃圾回收是一种动态存储管理技术,自动释放不再被程序引用的对象,按照特定的垃圾回收算法实现内存资源的自动回收功能。

除了释放没用的对象,垃圾回收也可以清除内存记录碎片,将占用的堆内存移到堆的一端,分配给新的对象

优点:

  • 很好的提高编程效率。
  • 保护程序的完整性,是 JAVA 语言安全策略的重要部分。

缺点:

  • 垃圾回收的开销影响程序性能。JVM 必需跟踪程序中的有用对象,确定哪些是无用对象并最终释放,该过程需要花费处理器时间。
  • 垃圾回收算法的不完备性,不能保证100%收集到所有的废弃内存。

垃圾回收算法基本任务:发现无用对象,回收其所占空间,供程序再次使用

垃圾回收特点:

  • 目标是回收无用对象的内存空间[JVM 堆内存中的内存空间],只能回收内存资源,而非其他物理资源[数据库连接,磁盘IO]
  • 可以通过将对象的引用变量设置为null,暗示该对象可以回收
  • 垃圾回收发生的不可预知性。采用不同垃圾回收机制和算法。程序员仅可以通过gc()方法建议系统回收,仍无法精确控制
  • 垃圾回收精确性两方面:
    • 能精确标记活着的对象:完全回收废弃对象的前提,否则可能造成内存泄露
    • 能精确定位对象之间的引用关系:实现归并和复制等算法的必要条件,保证所有对象被可靠回收,所有对象能被重新分配,减少内存碎片的产生

垃圾回收实现方式:垃圾回收开始就停止程序的运行、垃圾回收运行时允许程序的线程运行、同一时间允许垃圾回收多线程运行

编写Java程序的原则:对于不再需要的对象,不要引用它们。

Java8 删除了永生代内存[用以存储一些需要常驻内存,不被垃圾回收的信息],改为使用本地内存来存储类的元数据信息,称之为 元空间。

你可能感兴趣的:(JavaSE教程)