Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。Java包括J2SE(类库及核心特性)、J2EE(Web开发)、J2ME(手机编程,逐渐被取代),我们这部分就是主要探讨及核心机制。
首发于CSDN,于2021年1月21日二次更新和补充。
Java语言特性
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等,Java语言包含如下9个特性:
- Java是简单易学的
- Java是完全面向对象的(封装、继承、多态)
- 平台⽆关性,Java 虚拟机实现平台⽆关性、跨平台,可移植
- 安全性 (编写的都是中间语言,最后jvm解析)
- 健壮性(垃圾回收机制,异常处理机制)
- Java支持多线程
- Java是编译与解释并存类型的(比编译型的慢,但可跨平台)
- Java是高性能的(翻译class文件是即时的,用到才解析)
- ⽀持⽹络编程并且很⽅便( Java 语⾔诞⽣本身就是为简化⽹络编程设计的,因此 Java 语⾔不
仅⽀持⽹络编程⽽且很⽅便)
可以看的出为什么现在我国互联网大厂技术栈已经成了Java的天下了。
编译型和解释型语言
在了解Java的语言特性之前我们先来了解几个概念,什么是编译型语言、什么是解释型语言,什么又是先编译后解释语言:
- 编译型语言:编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C(C/C++)语言。
- 解释型语言:而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby(JavaScript、Perl、Python、Ruby、MATLAB),而其中Shell,JavaScript又是脚本语言,(脚本语言通常属于解释型语言,也叫动态语言,在运行时可以改变其结构的语言 脚本语言的程序是文本文件,并且是解释执行的)
- 先编译后解释语言,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种,用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。
总而言之,编译型语言会把源文件直接编译为机器码执行,然后直接运行,解释型语言会让解释器在代码运行时再逐行解释,先编译后解释语言例如Java,则是将源文件编译为字节码文件,然后通过不同的JVM在不同的操作系统上解释为不同的机器码再运行。
面向过程与面向对象
我们大一的时候一般都学过C语言,其实Java与C的区别可以理解为面向对象与面向过程的区别:
- ⾯向过程 :⾯向过程性能⽐⾯向对象⾼。 因为类调⽤时需要实例化,开销⽐较⼤,⽐较消耗资源,所以当性能是最重要的考量因素的时候,⽐如单⽚机、嵌⼊式开发、Linux/Unix 等⼀般采⽤⾯向过程开发。但是,⾯向过程没有⾯向对象易维护、易复⽤、易扩展。性能高,开销低,不易扩展、复用和维护
- ⾯向对象 :⾯向对象易维护、易复⽤、易扩展。 因为⾯向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,⾯向对象性能⽐⾯向过程低。性能低,开销高,易扩展、复用和维护
所以往往在不同的应用场景下我们选择不同的方式。
Java与C++的区别
我们大一的时候一般都学过C语言,后来也都学过C++,那么Java和这些语言的共性与区别是什么呢?
- Java 是纯面向对象语言(JAVA或C#都是),所有代码都必须在类中出现,不存在所谓的全局变量或全局函数,但是c++是半面向对象半面向过程,可以定义全局变量和全局函数,都是⾯向对象语言,但Java更纯
- Java 不提供指针来直接访问内存,程序内存更加安全,Java 不使用指针
- Java 的类是单继承的,C++ ⽀持多重继承;虽然 Java 的类不可以多继承,但是接⼝可以多继承。Java 单继承
- Java 有⾃动内存管理机制,对于内存的分配是动态的不需要程序员手动释放无用内存, Java 内存自动管理
- Java可以跨平台,而C++不可以,Java 跨平台
- Java 是先先编译后解释型语言,C++是编译型语言,java的执行速度慢于c++。Java执行速度慢于C++
就我而言还是非常喜欢Java的,没有了讨厌的指针、内存可以自动回收,单继承还不显的乱。
Java相关概念
文件后缀说明,文件有如下几种后缀
1 .class 编译后的Java文件 2 .java是未编译的程序 3 .jsp是页面程序 4 .xml配置程序 5 .jar是.calss的集合 6 .exe是可执行文件
Java编译运行时使用的相关命令如下
- javac 是编译命令,也就是
javac YourClassName.java
,然后生成一份后缀为.class的字节码文件。当用javac命令生成编译这个.java 文件的时候,则会针对每一个类生成一个.class文件; - 一个源程序文件中可以有多个类,如果没有public类,则源程序文件可以与任意类名相同,如果有public类则文件名必须与此类名相同,因为一个文件中只能有一个public类。如果文件中只有一个类,则文件名必须与类名相同
- 在Java中,环境变量可在编译source code时指定 , 在编译程序时,所能指定的环境变量包括classpath
- javac一次可同时编译数个Java源文件 用javac *.java. 即可编译当前目录下的所有java文件
- javac.exe能指定编译结果要置于哪个目录(directory)
运行命令是 java + Java 程序的名字但是不加后缀, 也就是不加 .class这个后缀。java YourClassName
可以使用java YourClassName
Java目录下的一些可执行文件使用说明
- javac.exe是编译.java文件 - java.exe是执行编译好的.class文件 - javadoc.exe是生成Java说明文档 - jdb.exe是Java调试器 - javaprof.exe是剖析工具
关于常用的System.out.println();
System是java.lang中的一个类,out是System内的一个成员变量,该变量是一个java.io.PrintStream
类的对象,println就是一个方法了。
Java运行环境
Java从源文件到最终运行需要经历几个阶段,.class>机器码 这⼀步 JVM 类加载器⾸先加载字节码⽂件,然后通过解释器逐⾏解释执⾏,这种⽅式的执⾏速度会相对⽐较慢
但是有些⽅法和代码块是经常需要被调⽤的(也就是所谓的热点代码),所以后⾯引进了 JIT 编译器,⽽ JIT 属于运⾏时编译。当 JIT 编译器完成第⼀次编译后,其会将字节码对应的机器码保存下来,下次可以直接使⽤。⽽我们知道,机器码的运⾏效率肯定是⾼于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语⾔
JVM、JDK与JRE
JVM、JDK与JRE三者之间的关系类似套娃,JRE包含JVM,JDK包含JRE:
- Java 虚拟机(JVM)是运⾏ Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),⽬的是使⽤相同的字节码,它们都会给出相同的结果。JVM能将相同的.class文件(字节码)—》不同系统的机器码
- JRE 是 Java 运⾏时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,Java 命令和其他的⼀些基础构件。但是,它不能⽤于创建新程序。JRE只能运行.class文件(字节码)—》机器码
- JDK 是 Java Development Kit,它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。JDK能运行.java文件—》.class文件(字节码)—》机器码
如果只是为了运⾏⼀下 Java 程序的话,那么只需要安装 JRE 就可以了。如果需要进⾏⼀些Java 编程⽅⾯的⼯作,那么就需要安装 JDK 了。但是绝对的。有时,即使不打算在计算机上进⾏任何 Java 开发,仍然需要安装 JDK。例如,如果要使⽤ JSP 部署 Web 应⽤程序,那么从技术上讲,您只是在应⽤程序服务器中运⾏ Java 程序。那你为什么需要 JDK 呢?因为应⽤程序服务器会将 JSP 转换为 Java servlet,并且需要使⽤ JDK 来编译 servlet。
Oracle JDK 和 OpenJDK
可能在看这个问题之前很多⼈和我⼀样并没有接触和使⽤过 OpenJDK 。那么 Oracle 和 OpenJDK 之间是否存在重⼤差异?
- Oracle JDK ⼤概每 6 个⽉发⼀次主要版本,⽽ OpenJDK 版本⼤概每三个⽉发布⼀次。
- OpenJDK 是⼀个参考模型并且是完全开源的,⽽ Oracle JDK 是 OpenJDK 的⼀个实现,并不是完全开源的。Oracle JDK 是 OpenJDK 的⼀个实现
- Oracle JDK ⽐ OpenJDK 更稳定。OpenJDK 和 Oracle JDK 的代码⼏乎相同,但 Oracle JDK 有更多的类和⼀些错误修复。因此,如果您想开发企业/商业软件,我建议您选择 Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些⼈提到在使⽤ OpenJDK 可能会遇到了许多应⽤程序崩溃的问题,但是,只需切换到 Oracle JDK 就可以解决问题 Oracle JDK ⽐ OpenJDK 更稳定
- 在响应性和 JVM 性能⽅⾯,Oracle JDK 与 OpenJDK 相⽐提供了更好的性能 Oracle JDK 与 OpenJDK 相⽐提供了更好的性能
- Oracle JDK 不会为即将发布的版本提供⻓期⽀持,⽤户每次都必须通过更新到最新版本获得⽀持来获取最新版本;
- Oracle JDK 根据⼆进制代码许可协议获得许可,⽽ OpenJDK 根据 GPL v2 许可获得许可。
其实依据上述的介绍我们知道,用Oracle JDK可能更加好一些。
Java程序分类、常用包和事件处理模型
Java中有很多常用的分类,以及一些常用包和事件的监听,这些总体上大家有个了解即可。
Java程序分类
Java有很多常用的分类,这些分类有如下三种
- Application,Java应用程序”是可以独立运行的Java程序。 由Java解释器控制执行。J2SE
- Applet ,Java小程序”不能独立运行(嵌入到Web页中)。 由Java兼容浏览器控制执行。 J2ME
- Serverlets ,Java技术对CGI 编程的解决方案。 是运行于Web server上的、作为来自于Webbrowser 或其他HTTP client端的请求和在server上的数据库及其他应用程序之间的中间层程序。J2EE
其中Serverlets的工作是:
- 读入用户发来的数据(通常在web页的form中,)
- 找出隐含在HTTP请求中的其他请求信息(如浏览器功能细节、请求端主机名等)
- 产生结果(调用其他程序、访问数据库、直接计算)
- 格式化结果(网页) 设置HTTP response参数(如告诉浏览器返回文档格式) 将文档返回给客户端。
我们这个系列主要讨论的为J2EE
Java常用包
Java有很多常用的包,这些包有各式各样的作用
- Java的
java.lang
:java的语言包,是一个核心包,系统自动将这个包引入到用户程序,该包中主要的类,object类,它是所有类的父类,其中定义的方法其它类都可以使用。数据类型包装类,数学类,字符串类,系统和运行时类,操作类,线程类,错误和异常处理类,过程类。System提供一个独立于具体计算机资源的编程界面,Runtime类可用于直接访问运行时资源。 - Java的
java.util
: java的实用包, 实用包提供了各种实用功能的类,主要包括日期类、数据结构类和随机数类等。 - Java的
java.awt
提供了绘图和图像类,主要用于编写GUI程序,包括按钮、标签等常用组件以及相应的事件类。 - Java的
java.io
: 包含提供多种输出输入功能的类 - Java的
java.net
:包含执行与网络有关的类,如URL,SCOKET,SEVERSOCKET - Java的
java.applet
: 包含java小应用程序的类
以上就是Java的常用包。
Java提供的事件处理模型
Java提供的事件处理模型是一种人机交互模型。它有三个基本要素:
- 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件
- 事件(Event):事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;
- 事件监听器(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件
当然事件处理模型比较通用。