【Java SE基础 一】基本概念和语言特性

简介: 【Java SE基础 一】基本概念和语言特性

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。Java包括J2SE(类库及核心特性)、J2EE(Web开发)、J2ME(手机编程,逐渐被取代),我们这部分就是主要探讨及核心机制。

首发于CSDN,于2021年1月21日二次更新和补充。

Java语言特性

Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等,Java语言包含如下9个特性:

  1. Java是简单易学的
  2. Java是完全面向对象的(封装、继承、多态)
  3. 平台⽆关性,Java 虚拟机实现平台⽆关性、跨平台,可移植
  4. 安全性 (编写的都是中间语言,最后jvm解析
  5. 健壮性(垃圾回收机制,异常处理机制
  6. Java支持多线程
  7. Java是编译与解释并存类型的(比编译型的慢,但可跨平台
  8. Java是高性能的(翻译class文件是即时的,用到才解析
  9. ⽀持⽹络编程并且很⽅便( 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和这些语言的共性与区别是什么呢?

  1. Java 是纯面向对象语言(JAVA或C#都是),所有代码都必须在类中出现,不存在所谓的全局变量或全局函数,但是c++是半面向对象半面向过程,可以定义全局变量和全局函数,都是⾯向对象语言,但Java更纯
  2. Java 不提供指针来直接访问内存,程序内存更加安全,Java 不使用指针
  3. Java 的类是单继承的,C++ ⽀持多重继承;虽然 Java 的类不可以多继承,但是接⼝可以多继承。Java 单继承
  4. Java 有⾃动内存管理机制,对于内存的分配是动态的不需要程序员手动释放无用内存Java 内存自动管理
  5. Java可以跨平台,而C++不可以,Java 跨平台
  6. 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有很多常用的分类,这些分类有如下三种

  1. Application,Java应用程序”是可以独立运行的Java程序。 由Java解释器控制执行。J2SE
  2. Applet ,Java小程序”不能独立运行(嵌入到Web页中)。 由Java兼容浏览器控制执行。 J2ME
  3. Serverlets ,Java技术对CGI 编程的解决方案。 是运行于Web server上的、作为来自于Webbrowser 或其他HTTP client端的请求和在server上的数据库及其他应用程序之间的中间层程序。J2EE

其中Serverlets的工作是:

  1. 读入用户发来的数据(通常在web页的form中,)
  2. 找出隐含在HTTP请求中的其他请求信息(如浏览器功能细节、请求端主机名等)
  3. 产生结果(调用其他程序、访问数据库、直接计算)
  4. 格式化结果(网页) 设置HTTP response参数(如告诉浏览器返回文档格式) 将文档返回给客户端。

我们这个系列主要讨论的为J2EE

Java常用包

Java有很多常用的包,这些包有各式各样的作用

  1. Java的java.lang:java的语言包,是一个核心包,系统自动将这个包引入到用户程序,该包中主要的类,object类,它是所有类的父类,其中定义的方法其它类都可以使用。数据类型包装类,数学类,字符串类,系统和运行时类,操作类,线程类,错误和异常处理类,过程类。System提供一个独立于具体计算机资源的编程界面,Runtime类可用于直接访问运行时资源。
  2. Java的 java.util: java的实用包, 实用包提供了各种实用功能的类,主要包括日期类、数据结构类和随机数类等。
  3. Java的java.awt提供了绘图和图像类,主要用于编写GUI程序,包括按钮、标签等常用组件以及相应的事件类。
  4. Java的 java.io: 包含提供多种输出输入功能的类
  5. Java的 java.net:包含执行与网络有关的类,如URL,SCOKET,SEVERSOCKET
  6. Java的java.applet: 包含java小应用程序的类

以上就是Java的常用包。

Java提供的事件处理模型

Java提供的事件处理模型是一种人机交互模型。它有三个基本要素:

  • 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件
  • 事件(Event):事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;
  • 事件监听器(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件

当然事件处理模型比较通用。

相关文章
|
1天前
|
Java API
Java 8新特性之Lambda表达式与Stream API实践指南
【5月更文挑战第15天】 随着Java语言的不断发展,Java 8作为一个重要的版本,引入了许多令人兴奋的新特性。其中,Lambda表达式和Stream API是Java 8最受关注的两个特性。本文将深入探讨Lambda表达式的基本概念、语法和使用场景,以及如何结合Stream API实现更加简洁、高效的代码编写。通过实例演示,帮助读者快速掌握这两个新特性,提高Java编程能力。
|
1天前
|
Java C++
PTA 小字辈(Java语言)
PTA 小字辈(Java语言)
8 1
|
1天前
|
Java
PTA帅到没朋友(Java语言)+测试点
PTA帅到没朋友(Java语言)+测试点
8 1
|
1天前
|
机器学习/深度学习 算法 Java
全排列(分治)(Java语言 +全排列模板)
全排列(分治)(Java语言 +全排列模板)
8 2
|
1天前
|
Java
阶乘末尾0的个数(Java语言+思路优化)
阶乘末尾0的个数(Java语言+思路优化)
7 1
|
1天前
|
Java C++
社交集群(pta) (并查集) Java语言
社交集群(pta) (并查集) Java语言
10 3
|
1天前
|
存储 Java
ZigZagging on a Tree二叉树蛇形层次遍历(Java语言)
ZigZagging on a Tree二叉树蛇形层次遍历(Java语言)
7 1
|
1天前
|
Java
Tree Traversals Again(Java语言)(先序和中序创建二叉树)(遍历树)
Tree Traversals Again(Java语言)(先序和中序创建二叉树)(遍历树)
11 4
|
1天前
|
Java
PTA 求前缀表达式的值 (Java语言,踩了全部坑)
PTA 求前缀表达式的值 (Java语言,踩了全部坑)
10 4
|
1天前
|
Java
Consecutive Factors 连续因素(Java语言)
Consecutive Factors 连续因素(Java语言)
8 2