文章目录
一、概述
(一)Java语言概述
1、Java是SUN1995年推出的一门高级编程语言。
2、Java之父还是有必要知道的,学Java不知道Java之父,被问到会被笑话的,Java之父是詹姆斯·高斯林(James Gosling)。
3、Java应用领域:
- Java SE(Java Standard Edition)标准版:支持面向对象桌面级应用(比如:Windows下的应用程序)的Java平台,提供了完整的Java核心API,此版本以前称为J2SE;
- Java EE(Java Enterprise Edition)企业版:是为开发企业环境下的应用程序提供的一套解决方案。该技术体系中包含的技术如:Servlet、JSP等,主要针对Web应用开发。版本以前称为J2EE;
- Java ME(Java Micro Edition)小型版:支持Java程序运行在移动端(手机,Pad)上的平台,对Java API所有精简,并加入了针对移动端的支持,此版本以前称为:J2ME;
- Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
3、Java的发展历程
- 1996年,发布JDK1.0
- 2004年,发布里程碑版本:JDK1.5,为突破此版本的重要性更名为JDK5.0
- 2009年,Oracle公司收购SUN,交易价格74亿美元
- 2011年,发布JDK7.0
- 2014年,发布JDK8.0,是继JDK5.0之后,变化最大的版本。
- 随后发布了JDK9.0、JDK10.0、JDK11.0、JDK12.0、JDK13.0
4、Java语言特点
- 面向对象:两大基本概念(类和对象)与三大特性(封装,继承,多态)
- 健壮性:吸收了C/C++语言的优点,去掉了影响程序健壮性的部分(指针、内存的申请与释放等,Java是自动管理内存的)
- 跨平台性:一处编写,到处运行
原理图:
(二)Java运行机制与运行过程
1、Java虚拟机(Java Virtal Machine),也就是JVM
- JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器等。
- 对于不同的平台,有不同的虚拟机,只有某平台提供了对应的Java虚拟机,java程序才可以在此平台运行
- Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,导出运行”
2、垃圾收集机制(Garbge Collection),也就是GC
Java技术提供了垃圾收集器,用于自动检测每一块分配出去的内存空间,然后将无价值的内存块自动回收。
两种情况会回收内存:
- 为对象赋予了空值NULL后再没有调用过
- 为对象赋予了新值,即重新分配了内存空间
3、运行原理(不如叫运行步骤)
- 编写Java源文件,以.java作为后缀名
- 编译为字节码文件,使用java编译器将.java源文件编译成JVM能接受的指令集合,且以字节码.class的形式保存在文件中
- 解释执行字节码.class文件,JVM读取字节码,取出指令,并且将其解释为能够将计算机执行的语言
这是官方给的流程图:
网上很多博主给出的步骤并不是这么全,多多少少都会少一个步骤,就是从JVM到物理机的时候,会被解释成计算机能识别的指令进行执行。你看到我的这个图之后,以后就应该多注意了。
为了方便大家好理解,更形象的记忆,我单独画了个图:
解释:
**Java开发人员首先编写.java文件,因为.java文件对开发人员来说是可读性比较高的,通常称.java为源代码。首先将所有源代码编写以.java扩展名结尾的纯文本文件。
然后,由javac编译器编译为.class文件。它包含字节码java虚拟机的机器语言。
然后java启动器工具将使用Java虚拟机的实例运行最后编译的应用程序。
**
(三)Java环境搭建
1、什么是JDK,JRE
- JDK(Java Development Kit):Java开发工具包
JDK是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就不用另外单独安装JRE了。
例如常见的:编译工具(javac.exe),打包工具(jre.exe)等。 - JRE(Java Runtime Environment):Java运行环境
JRE包含Java虚拟机(JVM)和Java程序所需的核心类库等,如果想运行一个开发好的java程序,那么计算机中只需要安装JRE即可。
2、JDK、JRE、JVM的关系
JRE = JVM + Java SE标准类库
JDK = JRE + 开发工具集(例如:java.exe、javac.exe等工具)
总的来说:使用JDK的开发工具开发完java程序后,交给JRE去运行
3、环境变量
- JAVA_HOME: JDK的安装路径
- PATH: 使操作系统可以在任何路径下识别java命令
- CLASSPATH: Java加载类的路径
具体的配置方法大家可以自行去搜索一下,这里不再过多叙述。
4、运行步骤
以windows为例:配置好环境变量之后,打开cmd窗口,在cmd窗口中执行javac 源文件名.java
就会生成相应的字节码文件(.class),然后使用java 字节码文件(不能加后缀)
。
(四)HelloWord程序
1、利用记事本或者工具创建一个HelloWord.java文件
2、然后加入如下代码:
/**
* 这是文档注释
* @author zhenghui
* @version HelloWord 0.1
*/
public class HelloWord {
/*
这是多行注释
*/
public static void main(String[] args) {
//这是单行注释
//打印一个HelloWord
System.out.println("HelloWord");
}
}
3、运行
1、进入cmd
分享几个正确打开CMD的姿势,你知道几种?别人问你别再说不知道了,程序猿就要有程序猿的样子
2、编译
使用javac HelloWord.java
3、运行
C:\Users\Administrator\Desktop\JavaTest>java HelloWord
HelloWord
解析及规则:
1、Java应用程序的执行入口
main()方法: public static void main(String[] args) {...}
2、Java语言严格区分大小写
3、Java语法通常由一条条语句构成,每个语句以“;”结束
4、一个源文件(.java)中最多只能有一个public类。其它类的个数不限(内部类等),如果源文件包含一个public类,则文件名必须是这个public类的类名,不然编译会报错的。
5、注释:
- 单行注释:
//这是单行注释
- 多行注释:
/*这是多行注释*/
- 文档注释:是java特有的一种注释,注释内容可以被JDK提供的javadoc工具所机械成一套以网页文件的形式的说明文档。
例如:
/**
* 这是文档注释
* @author zhenghui
* @version HelloWord 0.1
*/
二、变量与运算符
(一)关键字与保留字
- 关键字的定义和特点
- 定义:被Java语言赋予了特殊含义,用做专门用途的字符串
- 特点:关键字所有字母都为小写
定义类型 | 关键字 |
---|---|
定义数据类型 | class、interface 、enum 、byte、 short、 int、 long 、float 、double、 char、 boolean、 void |
定义流程控制 | if、 else 、switch、 case 、default 、while 、do 、for、 break、 continue、return、 |
定义访问权限修饰符 | private、 protected、 public |
定义类,函数,变量修饰符 | abstract、 final 、static 、synchronized |
定义类与类之间关系 | extends 、implements |
定义建立实例及引用实例 | new 、this、 super、 instanceof |
异常处理 | try 、catch、 finally、 throw 、throws |
包 | package 、import |
其他修饰符 | native、 strictfp、 transient 、volatile 、assert |
注意:true、false、null不是关键字
- 保留字
现在Java版本中未使用,但是以后的版本可能会使用的关键字
goto、const
(二)标识符
1、标识符的定义
- Java对各种变量、方法以及类等命名时使用的字符序列称为标识符。
2、标识符命名规范
- 由字母、数字、下划线、和"$"中的任意字符串组合而成
- 数字不可以开头
- 需要具有一定的意义,且不能是java的关键字
- 严格区分大小写
3、名称命名规范
对于规范,就牵扯到一系列的问题,每个公司都有公司不同的企业文化,所以有些地方也会不同。下面这是常见的:
- 包名:多单词组成时所有字母都小写:
xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写:
XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:
xxxYyyZzz
- 常量名:所有字母都大写。多单词时每个单词用下划线连接:
XXX_YYY_ZZZ
(三)变量以及数据类型
1、变量
-
变量的概念
-内存中的一个内存区域
-该区域数据可以在同一类型范围不断变化
-变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值 -
注意事项
-在Java中的每个变量,必须先声明,后使用
-变量在作用域所定义的一对{}内,其变量只有在作用域内有效
-同一作用域内,不能定义重名的变量 -
声明变量
-语法:<数据类型> <变量名称>;
-示例:int i
; -
变量赋值
-语法:<变量名称> = <值>;
-示例:i = 6;
-
声明和赋值变量
-语法:<数据类型> <变量名称> = <值>;
-示例:int i = 6
; -
变量分类
2、数据类型
-
整数类型:默认为int,声明long需要加’l’或者’L’
-
浮点类型:默认为double类型,声明float型需要加’f’或’F’;float可以精确到7位有效数字,double精度是float的两倍。
-
字符类型:占2个字节。
-
布尔类型:只允许true和false,无null。不可以使用0或非0的整数替代false和true。
(四)运算符
大家可以参考:米粒教育的详解Java表达式与运算符很不错。
为了防止丢失,下面是摘取的比较重要的部分:
运算符用于连接表达式的操作数,并对操作数执行运算。例如,表达式num1+num2,其操作数是num1和num2,运算符是”+”。在java语言中,运算符可分为5种类型:算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符。
根据操作数的不同,运算符又分为单目运算符、双目运算符和三目运算符。单目运算符只有一个操作数,双目运算符有两个操作数,三目运算符则有三个操作数。位运算符涉及到二进制位的运算,在java 程序中运用不是很多,因此下面主要介绍算术运算符、赋值运算符、关系运算符和逻辑运算符。
(1)算术运算符
算术运算符用在算术表达式中,其作用和数学中的运算符相同,下表列出了Java语言支持的算术运算符。
算术运算符一般用于数值运算,可对操作数进行加减乘除、取余、自增和自减操作。
加减乘除、取余运算符比较容易理解。下面重点说说自增和自减运算符。
自增自减是单目运算符,只需要一个操作数参加运算。例如:a++、++a、a–、--a等。其中,a是操作数,++是自增运算符,–是自减运算符,自增和自减运算符即可以放在变量的前面,也可以放在变量的后面,例如++a、 a++。
自增(++):将变量的值加1,分前缀式(如++a)和后缀式(如a++)。前缀式是先加1再使用;后缀式是先使用再加1。
自减(–):将变量的值减1,分前缀式(如–a)和后缀式(如a–)。前缀式是先减1再使用;后缀式是先使用再减1。
(2)赋值运算符
赋值运算符是双目运算符,用在赋值表达式中。它的作用是将运算符右边操作数的值赋给运算符左边的变量。下表列出了Java语言支持的赋值运算符。
赋值运算符分为两类,一类是简单赋值,一类是复合赋值。简单赋值是直接把运算符右边操作数的值赋给运算符左边的变量,运算符有“=”;复合赋值运算符复合赋值是先执行运算符指定的运算,然后再将运算结果赋值给运算符左边的变量,复合赋值运算符有“+=、-=、*=、/=、%=”。
简单赋值运算符非常容易明白和理解。下面重点说说复合赋值运算符“+=”操作,其它复合赋值运算符操作原理同“+=”运算符操作原理相同,这里就不再一一讲述了。
复合赋值运算符“+=”操作执行过程如下:
-
将运算符右侧的操作数,与运算符左侧的操作数(变量值)执行相加操作;
-
相加的结果赋值给运算符左侧的变量。
例如下面语句:
int num = 10;
num+= 20;
声明的变量num初始值为10,然后执行num+= 20赋值操作,其操作过程是变量num先与数值20相加,相加的结果是30,然后再将30赋值给变量num,此时变量num的值为30。
(3)关系运算符
关系运算符也是双目运算符,用于关系表达式。关系运算符对两个操作数进行比较,并返回比较结果,比较结果的值为一个布尔值(true或false)。下表列出了Java语言支持的关系运算符,表中例子假设A和B不相等,并且其A小于B。
关系运算符用于比较两个操作数的大小,两个操作数共有六种比较方式。
第一种比较方式是判断两个操作数是否相等,用运算符“==”进行运算,如果两个操作数相等,比较结果返回true,否则返回false。
第二种比较方式是判断两个操作数是否不相等,用运算符“!=”进行运算,如果两个操作数不相等,比较结果返回true,否则返回false。
第三种比较方式是判断运算符左边的操作数是否大于运算符右边的操作数,用运算符“〉”进行运算,如果左边的操作数比右边的操作数大,比较结果返回true,否则返回false。
第四种比较方式是判断运算符左边的操作数是否小于运算符右边的操作数,用运算符“<”进行运算,如果左边的操作数比右边的操作数小,比较结果返回true,否则返回false。
第五和第六种比较方式是判断运算符左边的操作数是否大于等于或小于等于右边的操作数,用运算符“〉=和<=”进行运算,如果比较结果满足要求,则返回true,否则返回false。
(4)逻辑运算符
逻辑运算符连接两个关系表达式或布尔变量,用于解决多个关系表达式的组合判断问题,返回的运算结果为布尔值。例如,在数学中,表示一个数值的范围时,经常用不等式来表述,假设一个数值取值范围为0到100,设该数值为x,不等式0<x<100给出了x的取值范围。在java程序语言中,这个不等式只能分解为x<0和x>100两个关系表达式,然后用逻辑运算符进行连接。下表列出了Java语言支持的逻辑运算符,表中假设布尔变量A为真,变量B为假。
逻辑运算符“&&”是双目运算符,用于判断两个关系表达式或布尔变量是否都为真,只有两个表达式的返回结果都为真时,运算结果为真,否则运算结果为假。
逻辑运算符“||”是双目运算符,用于判断两个关系表达式或布尔变量是否有一个为真,如果有一个为真,返回结果为true,否则返回false。
逻辑运算符“!”是单目运算符,用于取反关系表达式返回的值。例如:对于关系表达式a>b,如果a> b为真,取反后为false,如果a> b为假,取反后为true。
(5)Java运算符的优先级
和数学中的运算符一样,Java运算符也存在优先级关系。在Java表达式中,优先级高的运算符先参与运算,优先级低的运算符后参与运算。下表给出了运算符的优先级,表中优先级栏,数字越小优先级越高,每个运算符用中文顿号分割。
三、流程控制
流程控制语句是用来控制程序中各个语句执行顺序的语句,可以把语句组合成一定的逻辑模块,让程序跟着人的思维走,最终编写成一个优秀的功能。
可以分为三种基本流程结构:
- 顺序结构
- 分支结构
- 循环结构
(一)顺序结构
Java程序中从上到下逐渐的执行,中间不适用任何判断和跳转。
例如:
public class HelloWord {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a+b="+(a+b));
}
}
(二)分支结构
1、if-else结构
- if(条件表达式){自行代码块;}
例如:判断年龄是否成年,并给出成年的提示
int age = 18;
if(age>=18){
System.out.println("已经成年")
}
- if(条件表达式){ 执行代码块1; }else{ 执行代码块2; }
例如:判断年龄是否成年,给出成年和未成年的提示
int age = 18;
if(age>=18){
System.out.println("已经成年")
}else{
System.out.println("未成年")
}
- if(条件表达式){ 执行代码块1; }else if(条件表达式){ 执行代码块2; }else{ 执行代码块3; }
例如:判断年龄是否成年,给出成年和未成年的提示,并提示不合法的年龄(负数)
int age = 18;
if(age>=18){
System.out.println("已经成年")
}else if(age<1){
System.out.println("成年为负数,不合法哦")
}else{
System.out.println("未成年")
}
2、switch-case结构
语法:
switch(表达式){
case 常量1:
语句1;
// break;
case 常量2:
语句2;
// break;
default:
语句;
// break;
}
- switch(表达式)中表达式的值 必须是下述几种类型之一:byte ,short ,char ,int ,枚举,String;
- case子句中的值必须是 常量,不能是变量名或不确定的表达式值;
- 同一个switch语句,所有case子句中的常量值互不相同;
- break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾;
- default子句是 可任选 的。同时,位置也是灵活的。当没有匹配的case时,执行default。
(三)循环结构
定义:在满足某些条件的情况下,反复去执行特定的代码。
循环语句四个组成部分:初始化部分
、循环条件部分
、循环体部分
、迭代部分
;
1、for循环
语法:
for(1初始化部分; 2循环条件部分; 4迭代部分){
3循环体部分;
}
- 循环条件部分为boolean类型的表达式,如果值为false时,退出循环;
- 初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔;
- 可以有多个变量更新,用逗号分隔
2、while循环
语法:
1初始化部分;
while(2循环条件部分){
3循环体部分;
4迭代部分;
}
- 注意不要忘记声明迭代部分。否则,循环将不能结束,变成死循环
- for循环和while循环可以相互转换
3、do-while循环
语法:
1初始化部分;
do{
3循环体部分;
4迭代部分;
}while(2循环条件部分);
- do-while循环至少执行一次循环
4、嵌套循环
将一个循环放在另一个循环体内,就形成了嵌套循环。
5、break、continue、return的使用
- break:终止某个语句的执行
- continue:跳过一次循环,继续下一次循环
- return:如果走到这个return语句的是,就不在执行剩下的代码了会直接返回数据,当然了直接return;也是可以的。