1.概述
1.1简介
Java是一种高级计算机语言,它是由SUN公司(现已被Oracle公司收购)于1995年5月推出的一种可以编写跨平台应用软件、完全面向对象的程序设计语言。 针对不同的开发市场,SUN公司将Java划分为三个技术平台,它们分别是JavaSE、JavaEE和JavaME。
JavaSE标准版:
是为开发普通桌面和商务应用程序提供的解决方案。JavaSE是三个平台中最核心的部分,JavaEE和JavaME都是从JavaSE的基础上发展而来的,JavaSE平台中包括了Java最核心的类库,如集合、IO、数据库连接以及网络编程等。
Java EE 企业版:
是为开发企业级应用程序提供的解决方案。Java EE可以被看作一个技术平台,该平台用于开发、装配以及部署企业级应用程序,主要包括Servlet、JSP、JavaBean、JDBC、EJB、Web Service等技术。
Java ME 小型版:是为开发电子消费产品和嵌入式设备提供的解决方案。JavaME主要用于小型数字电子设备上软件程序的开发。
1.2java特点
-简单性:Java语言是一种相对简单的编程语言,它通过提供最基本的方法完成指定的任务。程序设计者只需理解一些基本的概念,就可以用它编写出适用于各种情况的应用程序。Java语言使用引用代替指针,并提供了自动的垃圾回收机制,使程序员不必担忧内存管理。
-面向对象:java语言是一个纯粹的面向对象程序设计语言。
-安全性:java安全可靠,java没有指针,外界不能通过伪造指针指向存储器。Java编译器在编译程序时,不显示存储安排决策,程序员不能通过查看声明猜测出类的实际存储安排。Java程序中的存储是在运行时由Java解释程序决定。
-跨平台性:一个编译好的.class 文件可以在多个系统下运行,这种特性称为跨平台。
-支持多线程:多线程可以简单理解为程序中多个任务可以并发执行,多线程可以在很大程度上提高程序的执行效率。
-分布性
1.3关键发展史
1995年5月23日 ,在 Oak 更名为 Java 后,Java 在 Sun world 会议上正式诞生。
2006年11月 Sun 公司成立了 OpenJDK 开源社区组织,OpenJDK诞生。
2009年,甲骨文(Oracle)公司宣布收购 Sun(Stanford University Network Microsystems)公司。
2011年7月11日,Oracle 发布 Java SE 7 LTS 版本,代号 Dolphin(海豚)
2014年3月18日,Oracle 发布 Java SE 8 LTS 版本
从 Java 11 开始,Oracle JDK 构建 和 Oracle OpenJDK 构建 将基本相同
2021年9月14日,Oracle发布Java SE 17 LTS 版本
2023年9月19日,Oracle发布Java SE 21 LTS版本
1.4java虚拟机--JVM
JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器,包含在JDK中。对于不同的平台有不同的虚拟机。java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译到处运行”。
1.5JDK和JRE
1.5.1JDK
JDK的全称是JavaDevelopment Kit 是Java 开发工具包。JDK=JRE+java的开发工具(如java,javac,javadoc,javap 等)。JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独 安装JRE了。
1.5.2JRE
JRE全称是Java Runtime Environment 它是Java 运行环。JRE =JVM+Java 的核心类库。包括java虚拟机和java程序所需要的核心类库。如果想要运行一个开发好的Java程序, 计算机中只需要安装JRE即可。
1.5.3JDK、JRE 和 JVM的包含关系
(1)JDK=JRE+ 开发工具集(例如Javac,java编译工具等)
(2) JRE=JVM+JavaSE标准类库(java核心类库)
(3) 如果只想运行开发好的 .class文件 只需要JRE
2.标识符
Java语言中,对于变量,常量,函数,语句块来说,都是有名字的,这些名字,我们统统称之为Java标识符。标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。
标识符的命名规则
-
可以由字母,数字,_和$,这四种的任意多个组成,但是数字不能开头
-
大小写字母敏感,需要特别注意(严格区分大小写)
-
可以使用汉字,但是不建议使用
-
不能使用关键字,如int,for,if等
-
尽量做到见名知意,多个单词时需要符合驼峰命名法
驼峰命名法: 在遵循见名知意的前提下,有些时候一个标识符的命名可能比较长,由多个单词组成。
大驼峰: 组成一个标识符的每一个单词的首字母都是大写的。
小驼峰: 首单词除外,从第二个单词开始,每一个单词的首字母都是大写的
命名约定
1)类和接口名:每个单词的首字母都要大写,其他字符小写。
2)方法名:首字符小写,其余单词的首字母大写,尽量少用下划线。
3)常量名:全部大写字母,单词与单词之间用下划线分隔。
4)变量名:首字符小写,其余单词的首字母大写。不用下划线,少用美元符号。给变量命名是尽量做到见名知义。
扩展:
如果某一个标识符表示的数据,在程序运行的过程中是可以发生改变的,这样的数据称为变量。
如果某一个标识符表示的数据,在程序运行的过程中是不能发生改变的,这样的数据称为常量。
3.变量
3.1概念
变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量。
3.2变量的使用
变量在使用时需要先声明该变量的所属类型,声明变量要存储的数据类型
语法:数据类型名 变量名;
初始化:在存储空间第一次存储数据
语法:变量名 = 初始化值。
3.3类型匹配
例子:
int salary;
salary = 2000.65;//编译不通过,因为类型不匹配
double d = 12345.6;
int n = d%2;//编译不通过,d%2的结果为double类型
注意:对于不同数据类型的变量,在内存中占得空间大小也不相同。
3.4作用域
作用域:从声明处开始,一直到所在大括号的结束符号为止。在此作用域中,仅能声明一次;出了作用域,变量失效,需要重新声明才能使用,该区域的的数据可以在同一类型范围不断变化。
3.5变量的分类
按照声明时所在的位置分类:
-
成员变量:方法外部,类的内部定义的变量。
-
局部变量:方法内部定义的变量
注意:类外面不能有变量的声明
按照数据类型进行分类:
-
基本数据类型变量
-
引用数据类型变量
4.数据类型
除了byte,short,int,long,double,float,char,boolean这八大基本类型外都是引用数据类型。
基本数据类型图
boolean类型数据只允许取值true和false,true表示条件成立,false表示条件不成立。
boolean类型变量经常用于存储关系运算的结果,所谓关系运算就是比较两个变量的大小相等等关系。
字符串类型的名字是String,是最常用的的引用类型,赋值的特点是使用双引号引起来,双引号里可以有0个以上的任意多个字符。
5,数据类型转换
数据类型转换,其实就是定义一个新的指定类型的变量,然后将原来的变量的值给这个新的变量进行赋值。赋值完成后,新的变量和原来的变量值基本相同,并且类型也发生了改变,因此,这个过程就被称为数据类型转换。
5.1自动类型转换(隐式类型转换)
就是一个直接的赋值操作,不需要进行任何额外的操作。常见于取值范围小的数据类型转型为取值范围大的数据类型。例如: byte转型为int。
当多种类型的数据混合运算时,系统首先自动将所有数据转换成其中取值范围最大的那种数据类型,然后再进行计算,结果的类型就是取值范围最大的类型。
注意:byte,short,char之间不会相互转换,他们三者在计算时会转换为int类型进行计算。
5.2强制类型转换
在进行赋值的时候,需要额外的操作来辅助完成。常见于取值范围大的数据类型向取值范围小的数据类型转型。
需要注意强制转换有可能出现精度损失或溢出。
语法:小范围类型 变量 = (小范围类型) 大范围变量;
比如:
int m = 10;
byte n = (byte)m;//(强制转换) int的10转成了byte的10
6.运算符
6.1赋值运算符
顾名思义就是用来进行赋值运算的运算符可以给变量等进行赋值和初始化。
赋值符号:“=”
语法:变量名 = 表达式或值。
例:“int a = 8"、"double b = 2.3"
6.2算术运算符
符号 :" + “、” - “、” * “、” / “、” % “、” ++ “、” – "
具体如下图:
注意:
-除法运算,两个操作数是整型的,结果也会是整型的,舍弃掉小数部分;如果有一个数是浮点数,结果将自动转型为浮点型。
-取余运算,两个操作数是整型的,结果也会是整型的,如果有一个数是浮点数,结果将自动转型为浮点型。
-自增自减运算,a++ 相当于 a = a + 1, a++ 是先运用在计算,++a 先计算在运用。
6.3关系运算符
符号:"==","!=","<",">","<=",">="
具体如下图:
注意:
-"="是赋值运算,"== "是等于运算
-"> "、" < "、” >= "、" <= "只支持数值类型的比较,"== "、" != "支持所有数据类型的比较
-关系表达式的运算结果是布尔值
6.4逻辑运算符
符号:"&","|","^","!","&&","||"
具体如下图:
注意:
-操作数只能是布尔型,操作结果也是布尔型
-&和 && 的区别: && 左边是false时,不计算右边的表达式,左假即假; & 无论左边真假都会计算右边的表达式
6.5位运算符
具体如下图:
案例代码:
a = 0011 1100 ;
b = 0000 1101 ;
a & b = 0000 1100 ;
a | b = 0011 1101 ;
a ^ b = 0011 0001 ;
~a = 1100 0011 ;
a<<2 = 1111 0000 ;
a>>2 = 1111 ;
a>>>2 = 0000 1111 ;
6.6三目运算符
也叫三元运算符,或是条件运算符,是Java语言中唯一需要三个操作数的运算符
符号: 表达式1 ? 表达式2 : 表达式3
如果表达式1为true,则返回表达式2的值,如果表达式1为false,则返回表达式3的值
案例代码:
int m,n;
m = 5<10 ? 10 : 20; //先判断5<7,为真,则m = 10
n = 5>10 ? 10 : 20; //先判断5<7,为假,则n = 20
6.7操作符的优先级
具体如下图:
当多个运算符出现在一个表达式中,谁的优先级别高,就先执行谁。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果完全不一样。
括号级别最高,逗号级别最低,单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值。
7.流程控制
流程控制语句分为顺序结构,分支结构(if, switch),循环结构(for, while, do…while)。
7.1顺序结构
顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,
依次执行,程序中大多数代码都是按照下面流程图执行:
7.2分支结构:
if格式1
语法:
if(关系表达式){
代码;
}
执行流程:
-1.先计算关系表达式的值
-2.如果关系表达式的值为true就执行if内的代码
-3.如果关系表达式的值为false就不执行if内的代码
-4.继续执行后面的语句内容
如图:
案例代码:
public class IfDemo {
public static void main(String[] args) {
System.out.println("开始");
//定义两个变量
int a = 10;
int b = 20;
//需求:判断a和b的值是否相等,如果相等,就在控制台输出:a等于b
if(a == b) {
System.out.println("a等于b");
}
//需求:判断a和c的值是否相等,如果相等,就在控制台输出:a等于c
int c = 10;
if(a == c) {
System.out.println("a等于c");
}
System.out.println("结束");
}
}
if格式2
if(关系表达式){
语句体1;
}else{
语句体2;
}
执行流程:
-1.先计算关系表达式的值
-2.如果关系表达式的值为true就执行语句体1
-3.如果关系表达式的值为false就执行语句体2
-4.继续执行后面的语句内容
如图:
案例代码:
public class IfDemo02 {
public static void main(String[] args) {
System.out.println("开始");
//定义两个变量
int a = 10;
int b = 20;
b = 5;
//需求:判断a是否大于b,如果是,在控制台输出:a的值大于b,否则,在控制台输出:a的值不大于b
if(a > b) {
System.out.println("a的值大于b");
} else {
System.out.println("a的值不大于b");
}
System.out.println("结束");
}
if语句格式3
if(关系表达式1){
语句体1;
}else if{
语句体2;
}...
else{
语句体n+1;
}
执行流程:
①首先计算关系表达式1的值
②如果值为true就执行语句体1;如果值为false就计算关系表达式2的值
③如果值为true就执行语句体2;如果值为false就计算关系表达式3的值
④…
⑤如果没有任何关系表达式为true,就执行语句体n+1
如图:
7.3switch语句-分支结构
语法:
switch(表达式){
case1:
语句体1;
break;
...
default:
语句体n+1;
break;
}
执行流程:首先计算出表达式的值,然后和case后面紧跟着的值一一比较,如果有对应上的值,就执行相应的语句,在执行的过程中,遇到break就结束。
最后,如果所有的case都和表达式的值不匹配就会执行default部分,然后就结束。
注意:switch()内不可以用浮点数。可以不是有break关键字结束switch,但是会从匹配的case语句开始执行往后所有代码。
当分支条件是一个范围的时候建议使用if,分支条件是一个值的时候两个都可以。
8.循环结构
8.1for循环
语法:
for(循环起点;循环条件;循环步长){
循环体
}
循环起点:用于表示循环开启时的状态。
循环条件:判断循环可以反复执行的条件。
循环步长:控制循环条件,保证循环执行
循环体:表示循环反复执行的内容。
执行流程:
初始化循环起点,执行循环条件,如果结果是false循环结束,如果是true就执行循环体,然后执行循环步长,再继续执行判断看循环是否可以继续执行。
注意:
在for循环的小括号中,每一部分都可以省略。但是,分号不能省略。 1、循环起点可以定义在循环外面,循环开始之前。 2、循环步长可以写在循环体中,只需要保证每次循环,用来控制循环的变量发生改变了即可。 3、循环条件,如果不写,则默认为true。
8.2while循环
while (循环条件) {
循环体
}
执行流程:
1、先判断循环条件是否成立,如果成立,执行循环体,再判断条件是否成立。
2、如果循环条件不成立,循环结束。
案例代码:
int i = 1;
while (i <= 100) {
System.out.println(i);
i++;
}
8.3do-while循环
案例代码:
public class DoWhileDemo {
public static void main(String[] args) {
//需求:在控制台输出5次"HelloWorld"
//for循环实现
for(int i=1; i<=5; i++) {
System.out.println("HelloWorld");
}
System.out.println("--------");
//do...while循环实现
int j = 1;
do {
System.out.println("HelloWorld");
j++;
}while(j<=5);
}
}
注意:
1、先执行一次循环体,再判断条件是否成立
2、如果循环条件一开始就是不成立的状态, do-while⽐while多执行一次循环体
8.4三种循环的区别
-for循环和while循环先判断条件是否成立,然后再决定是否执行循环,其实就是先执行后判断的循环结构
-do·while循环是先执行一次循环,再判断循环条件是否成立,再看是否可以执行循环体
小贴士:死循环三种格式
-for(;;)
-while(true)
-do{}while(true)
就是使循环条件永远成立就会进入死循环
8.5break和continue
跳转出控制语句(break)
跳出循环,结束循环(最近的一个循环语句)
跳转到下次循环(continue)
跳过本次循环,进入下一次循环
注意:break只可以在循环和switch-case语句使用,continue只能在循环中使用
8.6循环的嵌套
就是在循环中继续执行循环
案例代码:
public static void main(String[] args) {
//外循环控制小时的范围,内循环控制分钟的范围
for (int hour = 0; hour < 24; hour++) {
for (int minute = 0; minute < 60; minute++) {
System.out.println(hour + "时" + minute + "分");
}
System.out.println("--------");
}
}
注意:整个内循环都是外循环的循环体吗,内部循环体没有执行完毕外循环不会继续向下执行,可以看作外循环执行一次,内循环执行一圈