✨你好啊,我是“ 罗师傅”,是一名程序猿哦。
🌍主页链接:楚门的世界 - 一个热爱学习和运动的程序猿
☀️博文主更方向为:分享自己的快乐 briup-jp3-ing
❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
💪很高兴与你相遇,一起加油!

前言

目标:Java基础编程,熟练Java开发语法和规则,养成良好编程习惯

概述

Java是什么?

  • Java是一门非常优秀的计算机编程语言 (Go也很优秀)
  • Java之父:詹姆斯·高斯林(James Gosling)

历史

世界语言排名

2023年7月21日:

Java关键时间

  • 1991年4月,由 James Gosling 博士领导的绿色计划Green 启动 项目目的是开发一种能够在各种消费性电子产品(如机顶盒、冰箱等)上 运行的程序架构 该项目最终的产品是 Oak(橡树) ,即Java语言的前身
  • 1995年5月23日Oak语言改名为Java,并且在SunWorld大会上正式发布 Java 1.0版本 Java语言第一次提出了Write Once,Run Anywhere的口号
  • 1996年1月23日,JDK 1.0发布,Java语言有了 第一个正式版本 的运行环境 JDK 1.0提供了一个纯解释执行的Java虚拟机实现(Sun Classic VM) JDK 1.0版本的代表技术包括:Java虚拟机、Applet、AWT等。
  • 1997年2月19日,Sun公司发布了JDK 1.1 Java技术的一些最基础的支撑点(如JDBC等)都是在JDK 1.1版本中发布的Java语法也有了一定的发展,如内部类和反射
  • 1999年4月8日,JDK 1.1在此期间一共发布了1.1.0~1.1.8九个版本 从1.1.4之后,每个JDK版本都有一个自己的名字(工程代号)例如:JDK 1.1.4 - Sparkler(宝石)、JDK 1.1.5 - Pumpkin(南瓜)
  • 1998年12月4日,JDK迎来了里程碑式的版本JDK1.2,代号Playground(竞技 场) Sun公司在这个版本中把Java技术体系拆分为3个方向
    • 面向桌面应用开发的J2SE(Java 2 Platform, Standard Edition)
    • 面向企业级开发的J2EE(Java 2 Platform, Enterprise Edition)
    • 面向手机移动终端开发的J2ME(Java 2 Platform, Micro Edition)
  • 1999年4月27日HotSpot虚拟机
    • 发布 HotSpot最初由一家名为”Longview Technologies”的小公司开发,因为HotSpot的优异表现,这家公司在1997年被Sun公司收购了
    • HotSpot虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机
  • 2004年9月30日, JDK1.5 发布,代号Tiger(老虎)
    • 从JDK 1.2以来,Java在语法层面上的变换一直很小,而JDK1.5在Java语法 易用性上做出了非常大的改进 例如,自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环 (foreach循环)等语法特性都是在JDK 1.5中加入的
  • 2006年12月11日,JDK 1.6发布,代号Mustang(野马)
  • 在这个版本中,Sun终结了从JDK 1.2开始已经有8年历史的J2EE、J2SE、 J2ME的命名方式 启用 Java SE 6、Java EE 6、Java ME 6 的命名方式。
  • 2006年11月13日,在JavaOne大会上,Sun公司宣布最终会将Java开源
  • 2009年2月19日,工程代号为Dolphin(海豚)的JDK 1.7完成了其第一个里 程碑版本
  • 2009年4月20日,Oracle公司宣布正式以74亿美元的价格收购Sun公司,Java 商标从此正式归Oracle所有

具体版本

平台

1998年12月4日,Sun公司在发布的JDK1.2中,将Java技术体系拆分为3个方向 (平台):

  • J2SE (Java 2 Platform, Standard Edition),面向桌面应用开发
  • J2ME (Java 2 Platform, Micro Edition),面向手机等移动终端开发
  • J2EE (Java 2 Platform, Enterprise Edition),面向企业级开发

Java具体应用

全球超过30亿台各样设备上的应用程序是用Java开发的,耳熟能详的有:

  • Adobe PDF 阅读器,Gui开发
  • Google、Facebook、Amazon、淘宝、百度、携程等Web网站
  • Tomcat、JBoss、WebLogic等Web服务器
  • 抖音、淘宝、微信等手机APP,使用Android开发组件Android SDK(基于 Java)
  • ERP(企业资源规划)CRM(客户资源管理)等企业级应用
  • 游戏后端,如英雄联盟、吃鸡

JDK

相关名词

  • SDK(software development kit),软件开发包,主要包含函数库或者工具等(安卓)
  • JDK(java develoment kit),Java程序开发工具包,面向Java程序的开发者
  • JRE(java runtime enviroment),Java程序运行环境,面向Java程序的使用者
  • API(application program interface),应用程序编程接口
  • API Documentation,API说明文档,描述API中的类、方法等使用的方式

开发人员需要安装JDK,内部自带一个JRE(程序员用JDK完成开发后,用 JRE测试运行)

实施人员(部署)可以安装独立的JRE,用于运行Java程序

JDK下载

Oracle:windows-jdk版本切换

API在线文档:Home: Java Platform, Standard Edition (Java SE) 8 Release 8 (oracle.com)

JDK8-API文档下载地址:Java Development Kit 8 Documentation (oracle.com)

JDK安装

Linux 安装jdk 两种方法

WindowsJDK安装

环境变量

需要配置三个环境变量:JAVA_HOME、PATH、CLASSPATH。其中PATH必须 配置,另外两个建议配置。

  • JAVA_HOME: 指定JDK安装路径
    • JAVA_HOME=E:\Java\jdk1.8.0_45
  • PATH:命令搜素路径,建议使用%JAVA_HOME%引用JAVA_HOME的变量值
    • PATH=%JAVA_HOME%\bin
  • CLASSPATH:指定将来要运行或加载的class文件的所在路径。暂时配置为当前路径(也可以不配置,因为默认值就是当前路径)
    • CLASSPATH=.

Linux中的环境配置

使用vi打开 ./bashrc 文件进行配置(用户级别的环境变量

1
vi ~/.bashrc

JDK结构

  • oracle官方文档中提供的JDK结构图:

JDK目录

这里以Windows中安装后的目录为例说明:

关于src.zip文件:

  • 我们将来在代码中,所调用的JavaSE-api中的代码,大多数的源码就存在这个压缩包中
  • 这里面都是java文件,这些java文件编译或生成了class文件,都存在一个jar中,%JAVA_HOME%\jre\lib\rt.jar
  • 我们的代码在运行时,JVM会先从这个rt.jar中加载一些我们需要使用的类,例如String.class、Object.class、System.class等

src.zip 和 rt.jar 的关系:

**sun公司程序员 –> 编写基础的代码 –> .java –> 压缩 –> src.zip –> 编 译 –> .class –> 归档 –> rt.jar

Java特点

Java语言是一种分布式的面向对象语言,具有面向对象、平台无关性、简单性、解释执行、多线程、安全性等很多特点,具体如下:

  • 更纯粹的面向对象编程,加速开发的过程
  • 一次编写,到处运行(Write Once, Run any Where)跨平台
  • 程序员写好Java程序,再将其编译成字节码文件,最后由JVM解释执行
  • 开源及强大的生态环境,社区活跃,第三方类库选择丰富
  • 简单性,学起来简单,用起来更方便(后仰
  • 强大的API,使得编程变得更加容易快捷,大大降低了程序的开发成本
  • 安全性,Java的存储分配模型可以有效防御恶意代码攻击
  • 支持多线程和多任务
  • 强类型、异常处理、垃圾回收机制等技术,保证了Java的健壮性

跨平台原理

Java属于高级编程语言,高级语言编码运行步骤有:

  • 编写:指程序员编写源代码,比如HelloWorld.java
  • 编译:指将源代码文件转化成机器认识的机器语言的过程源代码--->二进制
  • 运行:指通过编译或,让计算机执行编译后指令的过程

高级语言的编译方式分为三种:编译型、解释型、混合型

  • 编译型
    • 使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码 一次 性”翻译” 成可以被该平台硬件执行的 机器码 ,并包装成为该平台所能识别 的可执行程序的格式(生成新文件),这个转换过程就是”编译”
    • C、C++都属于编译型语言
  • 解释型
    • 使用专门的解释器,将源程序逐行解释成特定平台的机器码,并立即执行 (不会生成新文件)
    • 可以理解为,解释型语言相当于把编译型语言里面的编译和执行合并到了一 起,同时进行
    • 优点是跨平台,缺点是效率低
    • Python、Shell、Ruby都属于解释型语言
  • 混合型
    • Java语言是混合型(编译+解释)的代表
    • 首先它的源代码需要编译,生成与平台无关的字节码(.class)文件 javac
    • 字节码文件不能直接执行,需要交给操作系统下的Java虚拟机(JVM)解释 执行
    • Java为不同的操作系统提供了不同的JVM虚拟机

原理

使用Java语言编写一份源代码,不管在什么操作系统下编译,得到的都是相同的字节码文件,在不同的操作系统下使用不同的JVM解释执行这份字节码文件, 程序成功运行,将会有相同的运行效果。这就是跨平台的原理, Write Once, Run any Where !

like this!

常用命令

存放在 %JAVA_HOME%bin 下面:

  • javac 编译命令
    • 格式:javac [-d 目标目录路径] *.java
    • 作用:编译源文件获得字节码文件(存放到-d后目录下),如果不跟-d,则放到当前目录下
  • java 运行命令
    • 格式:java [-cp class文件存储目录] 类的全包名
    • 例如:java -cp bin/ com.lwsj.chap01.HelloWorld
    • 作用:从-cp后面的路径中查找到需要运行的class文件,然后运行
    • 注意:类的全包名是指包名.类名,不要加.class后缀 = 全限定名
  • javadoc
    • 生成API文档命令
  • javap
    • 反解析命令,可以解析出class字节码文件的内容
  • jar
    • 打包命令

package

  • package语句必须是程序的第一条可执行的代码
  • package语句在一个Java文件中最多只能有一个
  • 程序可以不用package,表示无包名
  • 包其实就是文件夹,一般是公司域名倒着写 www.baidu.com 包名为com.baidu.项目名,最后编译生成的class文件,就会放到com/baidu/项目名/目录下

JavaSE-API中常用的包有:

  • java.lang
    • 最常用的一个包,里面的类可以在我们的程序中直接使用,不需要import导入
  • java.io
    • 用户输入输出流的操作。也就是读数据/写数据
  • java.net
    • 用户网络编程。可实现计算机A和B之间建立网络连接进行信息传输
  • java.util
    • 工具类,可以帮我们在我们代码中完成一些辅助的功能,例如表示日期、使用集合存储数据、使用工具类操作数组等

扩展内容

JVM虚拟机

JVM是Java Virtual Machine(Java虚拟机)的缩写,它是一个虚构出来的计算机规范结构,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVM是Java中最核心的一个东西,它在计算机的内存中,虚拟并提供了Java代码可以再其中运行的基础环境。

JVM内存管理结构如下:

和我们程序中关系比较紧密的是堆区栈区还有方法区

JVM就是 java 程序 和 操作系统 之间的桥梁:

Java代码编译后,计算机并不能直接运行,必须需要经过JVM进行解释后再进行运行。

so,Java其实并不算是真正的编译语言

注意:JVM本质上是一个规范,每个公司都可以按照这个规范实现自己的JVM虚拟机

现在默认使用的虚拟机是Oracle公司提供的HotSpot

当使用Java命令来运行程序的使用,会先启动JVM,这个JVM在JDK中对应了一个ddl或so文件:

  • 如果是Windows系统下,这个文件在:%JAVA_HOME%\jre\bin\server\jvm.dll
  • 如果是Linux系统下,这个文件在:$JAVA_HOME$/jre/lib/amd64/server/libjvm.so

注意:Linux下面的so文件就类似于Windows中的dll文件

字节码验证

将编写好Java代码编译成class文件(字节码)后,需要被JVM加载到内存中才可以运行,JVM加载时是需要做字节码验证的。

Java代码编译及运行过程:

加载到内存的途径有很多,可以通过本地磁盘也可以通过网络(上图是通过 网络)加载。

​ 一个class文件被加载到JVM内存之后,首先要经过字节码验证,验证内容主要包含:

  • 检查当前class文件的版本和JVM的版本是否兼容
  • 检查当前代码是否会破坏系统的完整性
  • 检查当前代码是否有栈溢出的情况
  • 检查当前代码中的参数类型是否正确
  • 检查当前代码中的类型转换操作是否正确

验证通过后,再确定哪些代码是 解释执行 的,哪些代码是 JIT即时编译执行 的:

  • 解释执行
    • class文件内容需要交给JVM进行解释执行,简单理解就是JVM解释一行就执行一行代码。所以如果Java代码全是这样的运行方式的话,效率会稍低一些。
  • JIT(Just In Time)即时编译
    • 执行代码的另一种方式,JVM可以把Java中的 热点代码 直接编译成计算机可以运行的二进制指令,这样后续再调用这个热点代码的时候,就可以直接运行编译好的指令,大大提高运行效率。

垃圾回收器

Java语言中,编程人员不需要在代码中主动的对内存进行申请与释放 (C、C++语言中,程序员需要自己控制)

Java代码中,开辟要使用的内存空间,使用new关键字即可。

使用完后,对内存的释放,在JVM中,由垃圾回收器(Garbage Collection,GC)来完成。

不同类型的GC,在JVM中,会根据不同的算法,对不同的内存区域内标记为垃圾的空间,进行回收释放。在这个过程中,是不需要编程人员干预的,自动完成

JavaSE-API:

1
2
java.lang.System.gc();
java.lang.Runtime.gc();

注意,虽然可以主动通知,但是最后GC并不一定会立刻执行,因为这个垃 圾回收的过程什么时候执行,最终还是要根据GC的具体算法和当前内存的 使用情况来确定。

❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭!

百尺竿头立不难,一勤天下无难事。💪