01-Java基础入门
✨你好啊,我是“ 罗师傅”,是一名程序猿哦。
🌍主页链接:楚门的世界 - 一个热爱学习和运动的程序猿
☀️博文主更方向为:分享自己的快乐 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安装
环境变量
需要配置三个环境变量: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的具体算法和当前内存的 使用情况来确定。
❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭!
百尺竿头立不难,一勤天下无难事。💪