Java概述
什么是Java
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摈弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java的三大版本
Java SE
J2SE - Java 2 Platform Standard Edition - 标准版
Java SE以前称为J2SE,它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。JavaSE包含了支持Java Web服务开发的类,并为Java EE 和Java ME提供基础。
Java EE
J2EE - Java 2 Platform Enterprise Edition - 企业版
Java EE以前称为J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java应用程序。Java EE是在Java SE的基础上构建的,它提供Web服务、组件模型、管理和通信API,可以用来实现企业级的面向服务体系结构和Web2.0应用程序。
Java ME
J2ME - Java 2 Platform Micro Edition - 微型版
Java ME以前称为J2ME。JavaME为在移动设备和嵌入式设备上运行的应用程序提供一个健壮且灵活的环境。
JVM JDK JRE
JDK是Java语言的软件开发工具包(SDK)。在JDK的安装目录下有一个JRE目录,里面有两个文件夹bin和lib,在这里可以认为bin里面的就是JVM,lib里的是JVM工作所需要的类库,JVM和lib合起来就称为JRE。
JDK
Java Development Kit - Java开发工具包
JDK是Java的核心,包含如下内容:
- JRE(Java运行时环境)
- Java工具(javac/java/jdb等)
- Java基础类库(Java API)
JDK的安装目录核心文件如下:bin/include/jre/lib
- bin - 最主要的是编译器(javac.exe)
- include - java和JVM交互用的头文件
- lib - 类库
- jre - java运行时环境
JDK用于Java程序的开发
JRE
Java Runtime Environment - Java运行时环境
它包含JVM标准实现以及Java核心类库,它是运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)
JRE用于Java程序的运行
JVM
Java Virtual Machine - Java虚拟机
它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JVM是整个Java实现跨平台最核心的部分,它负责解释执行字节码文件,是可运行Java字节码的虚拟计算机。所有平台上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。
三者之间的联系
Java的语言特点
- 简单
- 面向对象
- 分布式
- 多线程
- 高性能
- 跨平台的
- 可移植的
- 安全的
- 健壮的
编译型/解释型语言
编译型语言
定义:在程序运行之前,通过编译器将源码程序编译成机器码,以后执行这个程序时,就不用再进行编译了。
优点:编译器一般会有预编译的过程对代码进行优化,编译型语言的程序执行效率高。
缺点:编译之后如果需要修改就需要整个模块重新编译,编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植会产生问题,需要根据运行的操作系统环境编译不同的可执行文件。
总结:执行速度快、效率高;依靠编译器、跨平台性差。
代表语言:C、C++、Pascal、Swift等。解释型语言
定义:解释型语言的源代码不是直接翻译成机器码,而是先翻译成中间代码,再由解释器对中间代码进行解释运行,在运行时才将源程序翻译成机器码,翻译一句然后执行一句,直到结束。
优点:平台兼容性强;灵活,修改代码时可以直接修改,快速部署,不同停机维护。
缺点:每次运行都要解释一遍,性能上不如编译型语言。
总结:执行速度慢、效率低;依靠解释器、跨平台性强。
代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby。混合型语言
定义:结合编译型和解释型两种类型出现的半编译半解释型语言。
代表语言:C# Java
为什么说Java是混合型语言?
- Java是编译型的,因为所有的Java代码都是要经过编译的,如果不经过编译就什么也没有。
- Java是解释型的,因为Java代码编译后不能直接运行,它是解释运行在JVM上的。
Java既是编译型的,也是解释型的,总的来说Java更接近解释型语言。
基础语法
Java标识符
定义:给包、类、方法、变量起名字的符号。
组成规则:标识符由字母、数字、下划线、美元符号$组成。
命名原则
- 包名:全部小写,多级包用.隔开
举例:com.lwx - 类、接口:单词的首字母大写
举例:Student,HelloWorld - 方法、变量:第一个单词的首字母小写,如果有第二个单词则从第二个单词开始每个单词的首字母大写
举例:age,maxAge,show(),getAge() - 常量:如果是一个单词,所有字母大写。如果是多个单词,则用下划线区分每个单词
举例:TIME,START_TIME,MAX_AGE - 项目名:全部小写,多个单词用横杆-分割
举例:demo,spring-boot
注意事项
- 不能以数字开头
- 不能是Java中的关键字或保留字(const,goto)
- Java标识符大小写敏感,长度无限制
- 标识符不能包含空格
Java访问修饰符
| 修饰符 | 当前类 | 同包 | 子类 | 其他包 | | —- | —- | —- | —- | —- | | private | √ | × | × | × | | default | √ | √ | × | × | | protected | √ | √ | √ | × | | public | √ | √ | √ | √ |
Java分隔符
定义:空格、逗号、分号以及行结束符都被称为分隔符,规定任意两个相邻标识符、数字、保留字或语句之间必须至少有一个分隔符,以便程序编译时能够识别。
符号 | 含义 |
---|---|
; | 分号 - 用来终止一个语句 |
{} | 花括号/大括号 - 用来包括自动初始化的数组值,也可以用来定义程序块、类、方法以及局部范围 |
[] | 方括号/中括号 - 用来声明数组的类型,也用来表示撤销对数组值的引用 |
, | 逗号 - 在变量申明中区分变量说明的各个变量。在for控制语句中将圆括号内的语句连接起来 |
. | 原点 - 用来将软件包的名字与子包或类分隔,也用来将引用变量与变量或方法隔离 |
() | 圆括号 - 在定义和调用方法时用来容纳参数表,在控制语句或强制类型转换组成的表达式中用来表示执行或计算的优先权 |
Java流程控制语句
顺序结构
分支结构
if…
if…else…
if…else if…else
switch(…) case… case… default…
switch语句注意事项
- swtich(表达式)中表达式的返回值必须是以下类型:byte short char int String Enum以及其包装类型
- case子句中的值必须是常量,并且所有case子句中的值应该是不同的
- default子句是可以任选的,如果没有匹配的case,就执行default
- break语句用来执行完一个case分支后跳出switch语句块,没有break语句会一直执行
循环结构☆☆☆
定义:循环语句就是在满足一定条件的情况下反复执行某一个操作,包括while循环语句、do…while循环语句和for循环语句。for循环
执行流程for(初始化语句;判断条件语句;控制条件语句){
循环体语句;
}
A. 执行初始化语句
B. 执行判断条件语句,看结果是true还是false,如果是false则循环结束,如果是true则继续执行
C. 执行循环体语句
D. 执行控制条件语句
E. 回到B继续foreach循环
执行流程和for循环相似,它是Java5后新增的for语句的特殊简化版本,并不能完全替代for语句。foreach(声明语句:表达式){
循环体语句
}
while循环
``` 基本格式: while(判断条件语句){ 循环体语句; }
扩展格式: 初始化语句; while(判断条件语句){ 循环体语句; 控制条件语句; }
执行流程:while循环语句的循环方式为利用一个条件来控制是否要继续反复执行这个语句
<a name="Xf2lz"></a>
#### do...while循环
基本格式: do{ 循环体语句; }while(判断条件语句);
扩展格式:
初始化语句;
do{
循环体语句;
控制条件语句;
}while(判断条件语句);
```
执行流程
A. 执行初始化语句
B. 执行循环体语句
C. 执行控制条件语句
D. 执行判断条件语句,看是true还是false,如果是true回到B继续,如果是false就结束。
循环之间的区别
- do…while循环至少会执行一次循环体,for循环和while循环只有在条件成立的时候才会去执行循环体。
- 控制条件语句的控制变量,在for循环结束后就不能再被访问了,而while循环结束后还可以继续使用。
跳转语句
- break
使用场景:选择结构switch语句中/循环语句中
作用:跳出单层循环 - continue
使用场景:循环语句中
作用:结束一次循环,继续下一次循环 - return
使用场景:循环语句中/方法中
作用:可以从一个方法返回,并把控制权交给调用它的语句。直接结束整个方法,从而结束循环。Java变量
定义:在程序执行的过程中,在某个范围内其值可以发生改变的量。成员变量
定义:类内、方法体外定义的变量称为成员变量类变量(静态变量)
定义:被static修饰的变量
特点
- 随着类的加载而加载
- 优先于所有对象存在
- 被所有对象所共享
-
实例变量(非静态变量)
定义:未被static修饰的变量
在创建实例时创建类的成员变量,并且当对象被销毁时销毁。未显示分配值的所有成员变量在声明期间自动分配一个初始值,成员变量的初始值取决于成员变量的类型。类变量和实例变量的区别
调用方式
静态变量可以通过类名直接调用,而实例变量只能通过对象名调用。- 存储位置
静态变量存储在方法区中,而实例变量存储在堆中。 - 生命周期
静态变量随着类的加载而存在,随着类的消失而消失,生命周期很长。而实例变量随着对象的创建而存在,随着对象的消失而消失。 与对象的相关性
静态变量是所有对象共享的数据,成员变量是每个对象所特有的数据。局部变量
局部变量是在方法、构造方法或者语句块中被声明的变量,在方法、构造方法或者语句块被执行的时候创建,执行完成后变量将会被销毁,访问修饰符不能用于局部变量,局部变量只能在声明它的方法、构造方法和语句块中可见。局部变量存储在栈中,没有默认值,被声明后必须经过初始化后才可以使用。
局部变量和成员变量的区别
作用域
成员变量:针对整个类有效
- 局部变量:只在某个范围内有效(一般指的就是方法,语句体内)
存储位置
- 成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
- 局部变量:在方法被调用或者语句被执行时存在,存储在栈内存中。当方法调用完或者语句结束后就自动释放。
生命周期
- 成员变量:随着对象的创建而存在,随着对象的消失而消失。
- 局部变量:当方法调用完或者语句结束后就自动释放。
初始值
- 成员变量:有默认初始值
-
数据类型
Java语言是强类型语言,对于每一种数据都定义了明确具体的数据类型,在内存中分配了不同大小的内存空间。
分类
基本数据类型
- 数值型
- 整数类型(byte,short,int,long)
- 浮点类型(float,double)
- 字符型(char)
- 布尔型(boolean)
- 数值型
- 引用数据类型
- String
- 类(class)
- 接口(interface)
- 数组
数据类型转换
数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它需要从一种数据类型转换成另一种数据类型。
隐式转换
在运算的过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。隐式转换的规则是从低级类型数据转换成高级类型数据。
转换规则
- 数值型数据的转换:byte->short->int->long->float->double
- 字符型转换为整型:char->int
转换条件
- 两种数据类型彼此兼容
- 目标类型的取值范围大于源数据类型