1. Java概述
1.1. 什么是Java?
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了 C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易 用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
1.2. jdk1.5之后的三大版本
- Java SE(J2SE,Java 2 Platform Standard Edition,标准版) Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为Java EE和Java ME提供基础。
- Java EE(J2EE,Java 2 Platform Enterprise Edition,企业版) Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器 端Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、 管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应用程序。2018年2月,Eclipse 宣布正式将 JavaEE 更名 为 JakartaEE
- Java ME(J2ME,Java 2 Platform Micro Edition,微型版) Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视 机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可 以利用每个设备的本机功能。
1.3. JVM、JRE和JDK的关系
JVM
Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平 台有自己的虚拟机,因此Java语言可以实现跨平台。
JRE
Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核 心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数 据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
JDK
Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发 工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工 具:编译工具(javac.exe),打包工具(jar.exe)等
1.4. Java语言有哪些特点
Java 是一种强大的、跨平台的编程语言,具有许多特点,其中一些包括:
- 跨平台性:Java 程序可以在不同的操作系统上运行,只需在目标系统上安装 Java 虚拟机(JVM)即可。这使得 Java 具有很高的可移植性。
- 面向对象:Java 是一种面向对象的编程语言,支持面向对象的编程范式,如封装、继承和多态。这种特性使得程序更加模块化、可维护和可扩展。
- 简单性:Java 设计时考虑了简化语言复杂性的因素,具有清晰、简洁的语法,易于学习和使用。
- 安全性:Java 提供了多层次的安全机制,如类加载器、字节码校验器和安全管理器,以确保 Java 应用程序的安全性。
- 高性能:虽然 Java 是解释性语言,但通过即时编译器(Just-In-Time Compiler,JIT Compiler)和优化技术,Java 应用程序可以实现接近原生代码的性能。
- 多线程支持:Java 内置了对多线程编程的支持,提供了线程类、同步机制和并发库,使得开发多线程应用程序更加容易。
- 大型生态系统:Java 拥有庞大的生态系统,包括丰富的第三方库、框架和工具,可以帮助开发人员快速构建各种类型的应用程序。
- 动态性:Java 语言具有一定程度的动态性,支持反射和动态代理等机制,使得在运行时动态地加载、链接和执行代码成为可能。
- 自动内存管理:Java 提供了垃圾回收器(Garbage Collector),可以自动管理内存,减少了程序员手动释放内存的负担,提高了应用程序的健壮性和稳定性。
这些特点使得 Java 成为广泛应用于企业级应用、移动应用、大数据处理、嵌入式系统等领域的一种流行编程语言。
1.5. 什么是字节码?
字节码:
Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文 件),它不面向任何特定的处理器,只面向虚拟机。
采用字节码的好处:
Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效, 而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。
java中的编译器和解释器:
Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程 序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代 码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节 码(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。每 一种平台的解释器是不同的,但是实现的虚拟机是相同的。
Java源程序经过编译 器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运 行,这就是上面提到的Java的特点的编译与解释并存的解释。
1.6. Java和C++的区别
- 都是面向对象的语言,都支持封装、继承和多态
- Java不提供指针来直接访问内存,程序内存更加安全
- Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。
- Java有自动内存管理机制,不需要程序员手动释放无用内存
1.7. JDK 中常用的包有哪些
- java.lang:这个是系统的基础类;
- java.io:这里面是所有输入输出有关的类,比如文件操作等;
- java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
- java.net:这里面是与网络有关的类;
- java.util:这个是系统辅助类,特别是集合类;
- java.sql:这个是数据库操作的类。
2. 基础语法
2.1. 基本数据类型
Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。
2.2. 引用数据类型
2.2.1. 类(class)
类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性(成员变量)和行为(方法);
对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。
类与对象的关系: 类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类. 类描述了一组有相同特性(属性)和相同行为(方法)的对象。
2.2.2. 接口(interface)
一个完成某些特定功能的类(本质上为一个特殊抽象类),是一个功能的集合。在JDK1.8之前,里面全部是由全局常量和公共的抽象方法所组成。JDK1.8增加了默认方法、静态方法,JDK1.9增加了私有方法.
接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准(约束行为)的。
2.2.3. 数组([])
数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识. 数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中。 简单理解为存储数据的容器。
2.3. 运算符
对常量或者变量进行操作的符号。
2.4. 流程控制语句
程序中最经典的三种执行顺序:顺序结构,分支结构,循环结构
Java 提供了几种常用的流程控制语句,包括条件语句和循环语句。
条件语句
- if 语句:用于根据条件执行不同的代码块。
- switch 语句:根据表达式的值选择不同的分支执行代码块。
循环语句
- for 循环:用于重复执行一段代码,可以指定循环的初始值、条件和每次迭代的操作。
- foreach 循环:也称为增强型 for 循环,用于遍历数组或集合中的元素,简化了遍历的过程。
- while 循环:在满足条件的情况下重复执行一段代码,条件在循环体之前判断。
- do-while 循环:在满足条件的情况下重复执行一段代码,条件在循环体之后判断,至少会执行一次循环体。
跳转语句
- break 语句:用于终止循环或 switch 语句的执行,并跳出当前代码块。
- continue 语句:用于终止本次循环的执行,并继续下一次循环的迭代。
- return 语句:用于退出当前方法的执行,并返回到调用方法的地方。要跳出多重循环(即在内层循环中跳出外层循环),可以使用标签(label)和 break 语句的结合来实现。
if (a > 0) {
System.out.println(1);
}else if(a < 0){
System.out.println(-1);
}else{
System.out.println(0);
}
=========================================
switch (a) {
case 1:
System.out.println("支付宝");
break;
case 2:
System.out.println("微信");
break;
case 3:
System.out.println("银联");
break;
default:
System.out.println("给您升个舱");
break;
}
switch (a) {
case 1 -> System.out.println("支付宝");
case 2 -> System.out.println("微信");
case 3 -> System.out.println("银联");
default -> System.out.println("给您升个舱");
}
=========================================
//乘法口诀
for (int i = 1; i <= 9; i++) { //外循环控制行
for (int j = 1; j <= i; j++) { //内循环控制列
System.out.print(j + "*" + i + "=" + (i * j) + "\t");
}
System.out.println();
}
=========================================
double paperHeight = 0.1; //纸张厚度
double peakHeight = 8848860; //山峰高度
int count = 0;
while (paperHeight < peakHeight) {
paperHeight *= 2;
System.out.println("此时纸张厚度为 " + paperHeight);
count++;
}
System.out.println("折叠次数: " + count);
=========================================
int a = 10;
do {
System.out.println("1");
a--;
} while (a > 1);
=========================================
//死循环
while(true){
}
for (;;){
}
do {
}while (true);
案例
public class Demo6For {
/*
分析:
1. 定义变量count,用于保存“打印过”的数量,初始值为0
2. 在判定和打印水仙花数的过程中, 打印后让count变量+1,记录打印过的数量
*/
public static void main(String[] args){
// 1. 定义变量count,用于保存“打印过”的数量,初始值为0
int count = 0;
for(int i = 100; i <= 999; i++){
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 10 / 10 % 10;
if( (ge*ge*ge + shi*shi*shi + bai*bai*bai) == i){
// 2. 在判定和打印水仙花数的过程中, 打印后让count变量+1,记录打印过的数量
System.out.println(i);
count++;
}
}
}
}
2.5. 关键字
关键字是指被java语言赋予了特殊含义的单词。
2.6. 标识符
定义:
标识符是用户编程时使用的名字,用于给类、方法、变量等命名.
格式:
基本组成:由数字、字母、下划线(_)和美元符($)等组成
强制要求:不能以数字开头、不能用关键字做为名字、且是区分大小写的
特殊: _2b ,$2
● 小驼峰式命名:
适用于:变量名、方法名
规则一:标识符是一个单词的时候,首字母小写。
规则二:标识符由多个单词组成的时候,第一个单词首字母小写,其他单词首字母大写
比如:name、firstName。
● 大驼峰式命名:
适用于:类名
规则一:标识符是一个单词的时候,首字母大写
规则二:标识符由多个单词组成的时候,每个单词的首字母大写
比如:Student 、GoodStudent。
IDEA中安装插件Alibaba Java Coding Guidelines
2.7. Java注释
定义
用于解释说明程序的文字
分类
- 单行注释 格式:// 注释文字
- 多行注释 格式:/* 注释文字 */
- 文档注释 格式:/** 注释文字 */
作用
在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利 于程序的修改、调试和交流。注释的内容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果产生任何影响。
3. 面向对象
在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题。面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。
3.1. 面向对象三大特性
封装,继承,多态,抽象
3.2. 面向对象五大基本原则
- 单一职责原则SRP(Single Responsibility Principle)类的功能要单一,不能包罗万象,跟杂货铺似的。
- 开放封闭原则OCP(Open-Close Principle) 一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。
- 里式替换原则LSP(the Liskov Substitution Principle LSP)子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。哈哈~~
- 依赖倒置原则DIP(the Dependency Inversion Principle DIP)高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的抽象是中国人,而不是你是xx村的。
- 接口分离原则ISP(the Interface Segregation Principle ISP)设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。