
Java语言概述1. 计算机的硬件与软件1.1 计算机的组成硬件软件1.2 硬件CPUCentral Processing Unit中央处理器人靠大脑思考电脑靠CPU来运算、控制。硬盘Hard Disk Drive计算机最主要的存储设备容量大断电数据不丢失。正常分类机械硬盘HDD、固态硬盘SSD、混合硬盘SSHD固态硬盘在开机速度和程序加载速度远远高于机械硬盘缺点贵无法完全取代机械硬盘。内存Memory负责硬盘上的数据与CPU之间数据交换处理保存从硬盘读取的数据提供给CPU使用。保存CPU的一些临时执行结果以便CPU下次使用或保存到硬盘。硬盘数据无法直达CPU一定要先加载到内存CPU才能获取。断电后数据丢失输入设备键盘、鼠标等1.3 软件软件即一系列按照特定顺序组织的计算机数据和指令的集合。软件分类系统软件和应用软件程序 数据结构 算法系统软件操作系统应用软件2. 常用的DOS命令人机交互方式图形化界面Graphical User InterfaceGUI简单直观使用者易于接受容易上手操作。命令行方式Command Line InterfaceCLI需要在控制台输入特定的指令让计算机完成一些操作。需要记忆一些指令较为麻烦。DOSDisk Operating System磁盘操作系统是Microsoft公司在Windows之前推出的一个操作系统是单用户、单任务即只能执行一个任务的操作系统现在被Windows系统取代。进入DOS操作窗口按下 WindowsR打开运行窗口输入 cmd 回车进入到DOS的操作窗口。常用指令操作说明盘符名称:切换路径例如输入【d:】回车表示切换到D盘dir列出当前目录下的文件以及文件夹cd 目录进入指定单级目录cd 目录1\目录2\…进入指定多级目录cd …回退到上一级目录cd \ 或 cd /回退到盘符目录md 目录名创建指定的文件目录rd 目录名删除指定的文件目录文件目录内若有内容则无法删除del 文件名删除当前目录中指定的文件cls清屏exit退出命令提示符窗口← →移动光标↑ ↓调阅历史操作命令Delete 或 Backspace删除字符3. 计算机编程语言3.1 计算机语言语言人与人之间用于沟通的一种方式计算机编程语言人与计算机交流的方式。人们可以使用编程语言对计算机下达命令让计算机完成人们需要的功能。计算机语言C 、C、Java、Go、JavaScript、PythonScala等。语言 语法 逻辑3.2 计算机语言简史第一代机器语言1946年2月14日世界上第一台计算机ENIAC诞生使用的是最原始的穿孔卡片。这种卡片上使用的是用二进制代码表示的语言与人类语言差别极大这种语言就称为机器语言。例如一段典型的机器码1 0000,0000,000000010000 代表 LOAD A, 16 2 0000,0001,000000000001 代表 LOAD B, 1 3 0001,0001,000000010000 代表 STORE B, 16这种语言本质上是计算机能识别的唯一语言。第二代汇编语言使用英文缩写的助记符来表示基本的操作这些助记符构成了汇编语言的基础。例如LOAD、MOVE等使人更容易使用。因此汇编语言也称为符号语言。优点能编写高效率的程序缺点汇编语言是面向机器的不同计算机机型特点不同因此会有不同的汇编语言彼此之间不能通用。程序不易移植较难调试。比起机器语言汇编大大进步了是机器语言向更高级的语言进化的桥梁。目前仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。第三代高级语言高级语言发展于20世纪50年代中叶到70年代是一种接近于人们使用习惯的程序设计语言。高级语言允许程序员使用接近日常英语的指令来编写程序程序中的符号和算式也与日常用的数学式子差不多接近于自然语言和数学语言容易为人们掌握。例如高级语言独立于机器有一定的通用性。计算机不能直接识别和执行用高级语言编写的程序需要使用编译器或者解释器转换为机器语言才能被识别和执行。高级语言按照程序设计方法的不同分为面向过程的语言和面向对象的语言面向过程以函数/步骤为核心关注 “怎么做”。面向对象以类/对象为核心关注 “谁来做”具备封装、继承、多态三大特性。面向过程的语言C、Pascal、Fortran兼具面向过程与面向对象特性C纯面向对象语言C#、Python、JavaScript、Scala 等可跨平台的纯面向对象的语言JavaCPU只认识0和13.3 网传的编程语言鄙视链C诞生于1972年用于构建Unix操作系统。偏向计算机底层操作操作系统、网络、硬件驱动等优势几乎所有现代编程语言都脱胎于C劣势学习曲线很陡、不支持面向对象编程C诞生于1983年作为C语言的增强方案、升级版本。C是C语言的超集C语言的大部分知识也适用于C。用途Windows 或 MacOS UI、office全家桶、主流的浏览器、Oracle、MySQL、著名的游戏引擎等优势很多公司都用 C 开发核心架构如 Google、腾讯、阿里云等面向对象性。劣势体系极为庞大这是世界目前来说最复杂也是最难的编程语言。C#诞生于2000年一款强大而灵活的编程语言是多年来windows平台的一门主流编程语言。用途windows桌面应用开发、Windows Azure、游戏开发PHP诞生于1994年一款服务器端脚本语言。PHP语法和C类似有很多的模板和框架简单易懂。主要用于web端快速建站网络开发。劣势学习门槛太低Python诞生于1991年一种面向对象的语言虽然运行效率不高但是开发效率非常高。Python被称为胶水语言哪里都可以用。JavaScript诞生于1995年网景公司开发完成。JavaScript 是目前所有主流浏览器上唯一支持的脚本语言在前端开发中JavaScript占有不可替代的地位Java创建于1995年Java是一种面向对象、基于类的编程语言。Java可能是目前运用最广的项目语言代码稳定性超过 C 和 C生产力远超 C 和 C。有 JVM 在 Java 可以轻松地跨平台Java具有强大的开源开发工具大量的开源共享库。Java拥有世界上数量最多的程序员GoGo 语言现在很受关注是取代 C 和 C 的另一门有潜力的语言。C 语言太原始了C 太复杂了Java 太高级了所以 Go 语言就在这个夹缝中出现了。Go语言已成为云计算领域事实上的标准语言尤其是在 Docker / Kubernetes 等项目中。Go 语言语法特别简单有了 C 和 C 的基础学习 Go 的学习成本基本为零。Go社区从Java社区移植了各种优秀的框架或库总结程序设计语言有很多种每种语言都是为了实现某个特定的目的而发明的。没有“最好”的语言只有在特定场景下相对来说最适合的语言而已。掌握了一种编程语言会更容易上手其它的编程语言关键是学习如何使用程序设计方法来解决问题。4. Java语言概述4.1 Java发展阶段发行版本发行时间备注Java 1.01996.01.23Sun公司发布了Java的第一个开发工具包Java 1.11997.02.19JavaOne会议召开创当时全球同类会议规模之最。Java 1.21998.12.08Java拆分成J2SE标准版、J2EE企业版、J2ME小型版Java1.42004.02.06Java 5.02004.09.30①版本号从1.4直接更新至5.0②平台更名为JavaSE、JavaEE、JavaMEJava 6.02006.12.112009.04.20 Oracle宣布收购SUN公司Java 7.02011.07.02Java 8.02014.03.18此版本是继Java 5.0以来变化最大的版本是长期支持版本LTSJava 9.02017.09.22①此版本开始每半年更新一次。②Java 9.0开始不再支持windows 32位系统Java 11.02018.09.25JDK安装包取消独立JRE安装包是长期支持版本LTSJava17.02021.09长期支持版本LTSJava19.02022.09Java21.02023.09长期支持版本LTS虚拟线程正式落地当前主流新一代 LTS 版本Java25.02025.09长期支持版本LTS量子安全特性转正下一代长期支持版本4.2 Java技术体系平台Java SE (Java Standard Edition) 标准版支持面向桌面级应用如Windows下的应用程序的Java平台即定位个人计算机的应用开发。包括用户界面接口AWT及Swing网络功能与国际化、图像处理能力以及输入输出支持等。此版本以前称为J2SEJava EE (Java Enterprise Edition) 企业版为开发企业环境下的应用程序提供的一套解决方案即定位在服务器端的Web应用开发。JavaEE是JavaSE的扩展增加了用于服务器开发的类库。例如Servlet能够延伸服务器的功能通过请求-响应的模式来处理客户端的请求JSP是一种可以将Java程序代码内嵌在网页内的技术。版本以前称为J2EEJava ME (Java Micro Edition) 小型版支持Java程序运行在移动终端手机、机顶盒上的平台即定位在消费性电子产品的应用开发。JavaME是JavaSE的内伸精简了JavaSE 的核心类库同时也提供自己的扩展类。此版本以前称为J2ME注意Android开发不等同于Java ME的开发5. Java开发环境JDKJDK(Java Development Kit) 是Java程序开发工具包包含JRE和开发人员使用的工具。JREJRE(Java Runtime Environment) 是Java程序的运行时环境包含JVM和运行时所需要的核心类库。JDK JRE 开发工具集例如Javac编译工具等JRE JVM Java SE标准类库6. 开发体验HelloWorld6.1 开发步骤Java程序开发三步骤编写、编译、运行。将 Java 代码编写到扩展名为.java的源文件中通过javac.exe命令对该 java 文件进行编译生成.class字节码文件。通过java.exe命令对生成的.class文件进行运行6.2 编写新建文本文件完整的文件名修改为HelloWorld.java其中文件名为HelloWorld后缀名为.java。在文件中输入如下代码并且保存classHelloChina{publicstaticvoidmain(String[]args){System.out.println(HelloWorld!!);}}第一个HelloWorld源程序就编写完成了但是这个文件是程序员编写的JVM是看不懂的也就不能运行因此我们必须将编写好的Java源文件编译成JVM可以看懂的字节码文件即.class文件。6.3 编译在DOS命令行中进入文件所在目录使用javac命令进行编译。使用文件资源管理器打开所在目录然后在地址栏输入cmd回车即可进入DOS命令行。命令javac 源文件名.java// 例如javacHelloWorld.java编译成功后命令行没有任何提示。目录下会产生了一个新的文件HelloChina.class该文件就是编译后的文件是Java的可运行文件称为字节码文件有了字节码文件就可以运行程序了。6.4 运行在DOS命令行中在字节码文件目录下使用java命令进行运行。命令java 主类名字// 例如javaHelloChina// 错误演示javaHelloChina.class主类是指包含main方法的类main方法是Java程序的入口publicstaticvoidmain(String[]args){}6.5. HelloWorld案例常见错误拼写问题Java严格区分大小写大小写不同视为不同名称。Java代码中只能使用英文半角标点禁止中文符号否则编译报错。字符编码问题cmd命令行窗口的字符编码与.java源文件的字符编码不一致在编辑器中可以修改源文件的字符编码或将Java源文件另存为ANSI编码方式中文操作系统下即为GBK字符集。在使用javac命令时可以指定源文件的字符编码javac -encoding utf-8 Review01.java建议注意缩进一定要有缩进只要遇到{}就缩进缩进的快捷键是tab键必要的空格变量类型、变量、赋值符号、变量值之间填充相应空格会更美观6.6 HelloWorld小结Java程序的结构类{方法{语句;}}Java程序的格式每一级缩进一个Tab键{}的左半部分{在行尾右半部分}单独一行。Java程序的入口Java程序的入口是main方法publicstaticvoidmain(String[]args){}两种常见的输出语句换行输出语句输出内容完毕后进行换行。System.out.println(输出内容);直接输出语句输出内容完毕后不做任何处理。System.out.print(输出内容); 换行输出语句括号内可以为空什么都不写只做换行处理。 直接输出语句括号内不能为空否则编译报错。源文件名与类名如果类不是public那么源文件名可以和类名不一致。但是不便于代码维护如果类是public那么要求源文件名必须与类名一致。否则编译报错一个源文件中可以有多个类编译后会生成多个.class字节码文件。一个源文件只能有一个public的类建议不管是否是public都与源文件名保持一致而且一个源文件尽量只写一个类目的是为了好维护。7. 注释(comment)注释注释源文件中用于解释、说明程序的文字注释的作用提升程序的可阅读性调试程序的重要方法注释是一个程序员必须要具有的良好编程习惯。实际开发中程序员可以先将自己的想法通过注释整理出来再用代码去体现。程序员最讨厌两件事自己写代码被要求加注释接手别人的代码发现没有注释Java中的注释类型单行注释不会不会出现在字节码文件中 → 不会被java虚拟机JVM解释执行// 注释文字多行注释不会不会出现在字节码文件中 → 不会被java虚拟机JVM解释执行多行注释里面不允许有多行注释嵌套/* 注释文字1 注释文字2 …… */文档注释文档注释的内容可以被JDK提供的工具javadoc所解析生成一套以网页文件形式体现的该程序的说明文档。/** author java程序的作者 version 源文件的版本 */ // javadoc使用示例 javadoc -d mydoc -author -version HelloWorld.java-d mydoc生成的文档存入mydoc文件夹-author文档中显示作者信息-version文档中显示版本信息HelloWorld.java待处理的源代码文件【实践案例】// 单行注释/* 多行注释 *//** 文档注释演示 author songhk version 1.0 */publicclassHelloWorld{/** Java程序的入口 param args main方法的命令参数 */publicstaticvoidmain(String[]args){System.out.println(hello);}}8. Java API文档APIApplication Programming Interface应用程序编程接口是 Java 提供的基本编程接口。Java语言提供了大量的基础类因此Oracle也为这些基础类提供了相应的说明文档用于告诉开发者如何使用这些类以及这些类里包含的方法。大多数Java书籍中的类的介绍都要参照它来完成它是编程者经常查阅的资料。Java API文档即为JDK使用说明书、帮助文档。API文档https://docs.oracle.com/en/java/javase/17/docs/api/index.html9. Java核心机制JVM9.1 Java语言的优缺点Java从C语言和C语言继承了许多成份甚至可以将Java看成是类C语言发展和衍生的产物。优点跨平台性这是Java的核心优势。Java在最初设计时就很注重移植和跨平台性。通过Java语言编写的应用程序在不同的系统平台上都可以运行。在需要运行java应用程序的操作系统上先安装一个Java虚拟机JVM(Java Virtual Machine) 。由JVM来负责Java程序在该系统中的运行。面向对象性面向对象是一种程序设计技术非常适合大型软件的设计和开发。面向对象编程支持封装、继承、多态等特性让程序更好达到高内聚、低耦合的标准。健壮性吸收了C/C语言的优点但去掉了其影响程序健壮性的部分如指针、内存的申请与释放等提供了一个相对安全的内存管理和访问机制。安全性高Java适合于网络/分布式环境需要提供一个安全机制以防恶意代码的攻击。比如安全防范机制ClassLoader类加载器可以分配不同的命名空间以防替代本地的同名类、字节代码检查。简单性Java就是C语法的简化版我们也可以将Java称之为“C--”。高性能客观上高级语言运行效率总是低于低级语言的这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如通过JIT(JUST IN TIME)即时编译技术提高运行效率。Java低性能的短腿已经被完全解决了。业界发展上我们也看到很多C应用转到Java开发很多C程序员转型为Java程序员。缺点语法过于复杂、严谨对程序员的约束比较多与python、php等相比入门较难。一般适用于大型网站开发传统Java EE架构较重现代Spring Boot、云原生轻量化框架大幅降低开发成本但对于初创公司开发和维护人员的成本仍然比较高即薪资高选择用Java语言开发网站或应用系统的需要一定的经济实力。并非适用于所有领域Objective C、Swift在iOS设备上就有着无可取代的地位浏览器中的处理几乎完全由JavaScript掌控Windows程序通常都用C或C#编写Java在服务器端编程和跨平台客户端应用领域则很有优势9.2 JVM功能说明JVMJavaVirtualMachine Java虚拟机是一个虚拟的计算机是Java程序的运行环境。JVM具有指令集并使用不同的存储区域负责执行指令管理数据、内存、寄存器。功能1实现Java程序的跨平台性编写的Java代码都运行在JVM之上。正是因为有了JVM才使得Java程序具备了跨平台性。使用JVM前后对比功能2自动内存管理内存分配、内存回收Java程序在运行过程中涉及到运算的数据的分配、存储等都由JVM来完成。Java消除了程序员回收无用内存空间的职责提供了一种系统级线程跟踪存储空间的分配情况在内存空间达到相应阈值时检查并释放可被释放的存储器空间。GC的自动回收提高了内存空间的利用效率也提高了编程人员的效率很大程度上减少了因为没有释放空间而导致的内存泄漏。面试题Java程序还会出现内存溢出和内存泄漏问题吗 Yes!10. 章节案例案例1个人信息输出classExercise1{publicstaticvoidmain(String[]args){System.out.println(姓名康师傅);System.out.println();// 换行操作System.out.println(性别男);System.out.println(家庭住址北京程序员聚集地回龙观);}}案例2输出心形结合 换行符\n、制表符\t、空格 等在控制台打印出如下图所示的效果。classExercise2{publicstaticvoidmain(String[]args){System.out.print(\t*\t\t\t\t\t\t\t\t\t\t\t\t*\t\n);System.out.print(*\t\t*\t\t\t\tI love Java\t\t\t\t*\t\t*\n);System.out.print(\t*\t\t\t\t\t\t\t\t\t\t\t\t*\t\n);System.out.print(\t\t*\t\t\t\t\t\t\t\t\t\t*\t\t\n);System.out.print(\t\t\t*\t\t\t\t\t\t\t\t*\t\n);System.out.print(\t\t\t\t*\t\t\t\t\t\t*\t\n);System.out.print(\t\t\t\t\t*\t\t\t\t*\t\t\n);System.out.print(\t\t\t\t\t\t*\t\t*\t\t\n);System.out.print(\t\t\t\t\t\t\t*\n);}}