背景
JAVA是由Sun公司于1995年5月推出的java程序设计语言和java平台的总称。java平台由Java虚拟机(Java Virtual Machine)和java应用编程接口(API)构成
前身sun公司的oak软件。为家用电器的交互操作开发的
1995年oka更名为java,最初的推动力源于对独立于平台(体系结构中立)的需要,这语言能够嵌入各种家用设备的软件
在执行前生成一个中间代码,在任何机器安装特定的的解释器,就可以运行这个中间代码,伴随Internet 的发展而互相影响
java之父,詹姆斯•高斯林
发展史
1995年5月23日,Java语言诞生
1996年1月,第一个jdk-jdk1.0诞生
1999年6月,sun公司发布Java的3个版本:标准版(J2SE)主要用于开发和部署桌面
企业版(J2EE)主要针对企业应用的开发,例如,电商网站(常说的B\S价格)
微型版(J2EE)主要针对移动设备和嵌入式设备
1.4大幅提升
2004年9月30日,J2SE1.5发布,里程碑,更名为Java SE5.0。J2EE改名为java EE,J2ME改名成java ME
2009年被Oracle(甲骨文公司)收购
2011年7月,jdk1.7发布
2014年,Java8发布,提供了一种函数式的编程
2017年9月22日, Java SE 1.9正式发布
2018年先后发布了Java10/java11
跨平台原理
JDK即java的开发与运行环境除了包含完整的JRE之外,还包含供开发者使用的工具包,开发工具:编译工具(javac.exe)和运行工具(java.exe)
在需要运行java应用程序的操作系统上,安装与操作对应的java虚拟机(JVM java Virtual Machine)即可
JRE和JDK
JRE,即java运行环境,非开发者只需要安装JRE来运行程序,它包含java运行的所需要的类库+JVM(Java虚拟机)
JVM,Java虚拟机,当我们运行一个程序时,JVM负责将字节码转换为特定机器代码,JVM提供内存管理、垃圾回收和安全机制等,这独立于硬件和操作系统,正是java程序可以一次编写多处运行的原因)
运行机制
Java源文件——编译器——字节码
字节码——JVA——机器码
类装载器-一个能够制造出字节码的制造
类是对象的模子,描述对象信息
JVA运行在操作系统之上,与硬件没有直接的交互
扩展名为Java,Java的源文件,编译之前的纯文本文件,用来储存Java源代码。
扩展名为class,Java 的类文件,编译之后的二进制文件,存储的是字节码
Java程序员在开发Java程序时,只需要安装有JDK,就可以在程序中使用import关键字导入Java API 中指定的包并在自己的程序中使用这些包中定义的各种类和接口
java运行分为两部分,一个是编译,一个是运行
javac负责的是编译的部分,当执行javac时,会启动java的编译器程序,对指定扩展名.java的文件进行编译,编译后生成class的文件
java负责运行的部分,会启动jvm虚拟机,加载运行时所需要的库类,并对class进行执行,一个文件要被执行,必须要有一个被执行的起始点,这个起始点就是main()函数
jdk安装以及环境变量的设置与检测
在官网安装java11,下载位置和安装位置
安装位置放在一个简洁的学习盘
环境变量:我的电脑-属性-高级系统设置-环境变量
操作全在下框,新建名为JAVA_HOME
值为jdk安装目录,在bin文件的上一级目录
编辑PATH变量,将刚刚新建的JAVA_HOME变量加上bin目录设置到PATH
%JAVA_HOME%\bin;(要在最前后,加分号)
共有3种检测,一般在cmd输入java -version
java,javac
bin文件,该路径下存放了JDK的各种工具命令。java,javac就放在这个目录
conf 该路径下存放了JDK的相关配置
includ 该路径存放了一些平台特定的头文件
jmods该路径存放了jdk的各种模块
legal存放了jdk各模块的授权文档
lib该路径下存放了jdk工具的补充JAR包
其余文件为说明性文档
环境变量的意义
让java bin目录下的工具,可以在任意目录下运行,原理是将该工具所在目录告诉了系统,当使用该工具时,由系统帮我们去找指定的目录
JAVA_HOME
它指向jdk的安装目录,引用%JAVA_HOME%即可,避免每次引用都输入很长的路径串,方便第三方软件引用约定好的JAVA_HOME变量,保证程序正常运行
设置Path环境变量之后就可以在任何目录下执行javac/java等工具命令了。 系统默认先去当前路径下找要执行的程序,如果没有,再去path中设置的路径下找
如果指定了classpath,那么会在指定的目录下查找要运行的类文件(JDK1.5后不需要配置)
开发java程序的步骤
编写程序,编译程序,运行程序
新建文本文档文件,修改名称为HelloWorld.java
写完代码打开命令提示符窗口,进入代码所在的目录,输入指令编译和执行
编译javac 文件名.java
运行java 文件名
bug(甲壳虫)
常用DOS命令
盘符切换 d:
dir 查看当前文件路径下的内容
cd 进入单级目录
cd.. 回退到上一级目录
cd 目录1\目录2\... 进入多级目录
cd\ 回到盘符目录
cls 清屏
exit 退出命令提示符窗口
dir /s 刷屏
单行注释 //
多行注释 /* 注释信息 */
文档注释 /** 注释信息 */
java程序解析
例子
java对大小写要求严格,如果大小写拼写错误就会出现程序错误
class 定义一个类
class前是各种修饰符(可选的)后面紧跟类名
访问修饰符:public作为一种公有的访问修饰符,它的使用面非常广,在创建项目的时候可以发现,public访问修饰符在任意的位置都可以访问
private作为一种私有的访问修饰符,它的使用面最窄,除了在本类可以进行访问之外都不能进行对于私有变量的修改或者私有成员方法的使用。但相对应的是,该种访问修饰符的适用范围越窄,它的安全性越高。本类
protected作为一种受保护的的访问修饰符,它的使用面在public和protected之间,使用的方法故名思意,它在项目中的使用的时候除了在一个project下的同一个package以外的类和父类下的子类中都不能进行跨包访问。在当前类、同包子类/非子类、跨包子类调用;跨包非子类不允许
默认 不同于想好需求再动手,默认形态下的访问修饰符就给了很大空间,默认类型的访问符只在当前的package下可以进行访问。允许在当前类、同包子类/非子类调用;跨包子类/非子类不允许调用
public是JAVA关键字,称为访问修饰符,用于控制程序的其他部分对这段代码的访问级别
FirstSample是自己取的名字,是一个类的名称
(类的取名规则:类名是以大写字母开头的名词(不能以特殊符号作为类名的开头,其余位置也不行,但下划线和美元符号是可以的),后面可以跟字母和数字的任意组合,长度没有限制。如果名字由多个单词组成,每个单词的第一个字母都应该大写;被称为大驼峰法-即帕斯卡命名法)。中文也可以作为类名,但是有弊端
同时不能以Java关键词和保留字作为类名,否则会编译错误
类的取名规则注意一点,{}也是类或者方法的一部分,这是不可省略或者缺失的{表示类或者方法开始,}表示类或者方法结束
public static void main(String[] args)
{
语句....
}
这是java中main的固定写法,还有一种写法 public static void main(String args[]),同时args的名称可以改变外,其它所有均不变
每个java应用程序都必须有且仅有一个main方法。main方法是特殊的,它的类型必须是public static void,包括main名字,还有括号内的参数String[] args
根据java语言规范,main方法必须声明为public(在javaSE1.4版本以后)因为java程序在运行时首先会创建一个JVM实例,程序运行需要调用main方法,JVM从外部调用main方法就需要访问权限修饰符必须给出外部访问的权限,所以只能用public
static的定义是为了JVM在调用main方法时不用实例化对象,只需要在初始时加载main方法所在类,然后直接通过类名.main来调用main方法
void表示main方法没有返回值,没有返回值是因为java不需要main方法操作系统返回退出信息。如果main方法正常退出,那么java应用程序的退出代码为0,表示成功的运行了程序
main的名称不能变是为了JVM能够识别程序运行的起点,main方法可以被重载,重载的main方法不会被执行。main方法作为程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程,非守护线程和守护线程,main方法属于非守护线程,守护线程通常由JVM自己使用,Java程序也可以表明自己的线程是守护线程。当程序中所有的非守护线程终止时,JVM退出。也可以用Runtime类或者System.exit()来退出
String[] args,是main方法中可以改变的地方。args是arguments的缩写,只是一个变量默认名,习惯性写作它,但是也可以改变的,只要符合命名规则可以任意写。作为一个字符数组,作用是程序传入的一个参数组,为了使用者在命令行状态下与程序交互提供的一种手段
System.out.println("hei,hei");
这是一句打印语句,向标准输出设备输入语句“hei,hei”结束
在java中,每个句子必须使用分号;结束
System是java.long里面的一个类
而out就是System里面的一个静态数据成员,而且这个成员是java.io.PrintStream类的引用。如下图,被关键字static修饰的成员可以直接通过"类名.成员名"来引用,而无需创建类的实例。所以System.out是调用了System类的静态数据成员out。
println()就是java.io.PrintStream类里的一个方法,它的作用是向控制台输出信息。因为System.out是java.io.PrintStream类的实例的引用,所以可以通过 System.out.println(); 来调用此方法
关键字package(包)
把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用;
同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,包可以避免名字冲突,当同时调用两个不同包中相同类名的类时,加上包名加以区别;
限定访问权限,拥有包访问权限的类才能访问某个包中的类;
Java使用package式为了防止命名冲突,进行访问控制,提供搜索和定位类、接口、枚举和注释等
在项目开发中包的命名首先要注意全部小写
最好符合一定的规范,便于不同类型项目的区分,因此分别列举个人、团队、公司三类如下:
个人项目 :
“个人的”英文单词共有有“individual、personal、private、one-man”,进一步对以上 4 个单词词意的分析,并在保证了唯一性,使用每个单词的前4 个字母作为前缀,正好和“com”也做了区分。如下:
indi :
个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright 主要属于发起者。
包名为“indi.发起者名.项目名.模块名.……”。
pers :
个人项目,指个人发起,独自完成,可分享的项目,copyright 主要属于个人。
包名为“pers.个人名.项目名.模块名.……”。
priv :
私人项目,指个人发起,独自完成,非公开的私人使用的项目,copyright 属于个人。
包名为“priv.个人名.项目名.模块名.……”。
onem :
与“indi”相同,推荐使用“indi”。
团队项目:
team :
团队项目,指由团队发起,并由该团队开发的项目,copyright 属于该团队所有。
包名为“team.团队名.项目名.模块名.……”。
公司项目:
com :
公司项目,copyright 由项目发起的公司所有。
包名为“com.公司名.项目名.模块名.……”。
Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,在很多情况下,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类(在java.lang包下)
API 是用于构建应用程序软件的一组子程序定义,协议和工具。一般来说,这是一套明确定义的各种软件组件之间的通信方法
关键字是被Java语言赋予了特定含义的单词
关键字的字母全部小写
常用的代码编辑器针对关键字有特殊颜色标记
常量在程序中不可变
字符串常量,用双引号括起来的内容
整数常量,不带小数的数字
小数常量,带小数的数字
字符常量,用单引号括起来的内容
布尔常量,布尔值,表示真假,true,false
空常量,一个特殊的值,空值,null(不能直接输出)
变量:在程序运行过程中,其值可发生改变的量
变量名,数据类型,变量值
自定义,可修改
在同main变量名字不能重复,变量未赋值,不能使用
long类型的变量定义的时候,为了防止整数过大,后面要加L
float类型的变量定义的时候,为了防止类型不兼容,后面要加F
1B(字节)=8bit
1kb=1024B
1M=1024KB
1GB=1024MB
1TB=1024GB
java基本数据类型
java是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不同的
四个整数类型:byte(1个字节,8位)、short(2个字节,16位)、int(4个字节,32位)、long(8个字节,64位)
二个浮点数类型:float(4个字节,32位)、double(8个字节,64位)
一个字符类型:char(2个字节,16位)
一个布尔类型:boolean(1个字节,8位)
数值默认整数为int,浮点数为double
Java基于八种基本数据类型提供了对应的包装类
基本数据类型 -->包装类
byte -->Byte
short --> Short
int -->Integer
long -->Long
float -->Float
double -->Double
char -->Character
boolean -->Boolean
包装类
1、包装类是对象,有方法和字段,对象的调用是通过引用对象的地址,而基本类型不是。
2、包装类型是引用的传递,基本类型是值的传递。
3、初始值不同:int的初始值位0,boolean的初始值为false;包装类型的初始值null。
4、声明的方式不同:基本类型不需要new关键字;包装类型需要new关键字创建对象分配内存空间。
5、存储位置不同:基本数据类型直接将值保存在堆中;包装类型的对象存储在堆中,通过对象的引用来调用。
6、使用的方式不同:基本数据类型直接赋值就可以;包装类型通常是在集合时使用
Java方法是语句的集合,用于处理某些特定任务并将响应返回给调用方。 方法使我们可以编写可重用的代码,并将程序划分为几个小的工作单元
Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段
标识符命名
给类,方法,变量等起名字的符号
不能以数字开头,不能是关键字,区分大小写
可用数字,字母,下划线和美元符号
常见命名规范:小驼峰针对方法和变量 name ,firstName
大驼峰命名法:类 Student GoodStudent
类型转换
1.自动类型转换
把一个表示表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量
范例:double d=10 在不同的定义中换为不同的数据类型
2.强制转换
把一个表示表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
例子:int t=(int)88.88
会变成88,丢失精度
运算符:对常量或者变量进行操作的符号
表达式:用运算符把常量或者变量连接起来符合Java语法的式子就可以称为表达式
不同运算符连接的表达式体现的是不同类型的表达式
算术运算符
+
-
*
/ (商)
%(得余数)
字符的+(待解决的问题A,ASCII码)
拿字符在计机底层对应的数值来进行计算
'A' A-Z是连续的 65
'a' a-z是连续的 97
'0' 0-9是连续的 48
算术表达式中包含多个基本数据类型的值的时候,整个算术表达式的类型会自动进行提升
byte类型,short类型和char类型将提升到int类型
整个表达式的类型自动提示到表达式中最高等级操作数同样的类型
等级顺序:byte,short,char——int——long——float——double
接收数据时要用表达式最高的类型
字符串的+操作
当“+”操作出现字符串时,这个“+”是字符串连接符,而不是算术运算
在“+”操作中,如果出现了字符串,就是连接运算符,否则就是算术运算。当连续进行“+”操作时,从左到右逐个执行
赋值运算符(扩展的赋值运算符隐含了强制类型转换)
= 赋值
+= 把左边和右边的数据做加法的操作,结果赋值给左边
-= 减后赋值,a-=b,将a-b的值给a
*= 乘后赋值,a*=b,将axb的值给a
/= 除后赋值,a/=b,将a除以b的商给a
%= 取余后赋值,a%=b,将a除以b的余数给a
自增自减运算符(常单独使用)
++ 自增 变量的值加1,,
-- 自减,变量的值减1
放前后都可,参与操作的时候,如果放在变量的后边,先拿变量参与操作,后拿变量做++或者--
反之亦然
关系运算符
== ,a==b,判断a和b的值是否相等,成立为true,不成立为false
!= a != b,判断a和b的值是否不相等,成立为true,不成立为false
> a>b,判断a是否大于等于b,成立为true,不成立为false
< a
关系运算符的结果都是boolean类型,要么是true,要么是false
逻辑运算符
在数学当中,一个数据x,大于3,小于6,我们可以这样来进行表示:3
在Java中,需要把上面的式子先进行拆解,再进行合并表达
拆解为:x>3和x和并为:x>3&&x
符号
& 逻辑与(有false则为false)
I 逻辑或 (有true则true)
^ 逻辑异或 (相同为false,不同为true)
! 逻辑非 (!a,结果相反,奇变偶不变)
短路运算符
&&,II
(作用与单相同,但是有短路效果
&,无论左边真假,右边都要执行
&&短路与,如果左边为真,右边执行;如果左边为假,右边不执行
逻辑或I,无论左边真假,右边都要执行
短路或II,如果左边为假,右边执行;如果左边为真,右边执行
)
三元运算符
格式:
关系表达式?表达式1:表达式2:
int max(创建接收) = a > b ? a : b(结果为a或b);
(首先计算关系表达式的值,如果值为true,表达式1的值就是运算结果,如果为false,表达式2的值就是运算结果)
Scanner
1.导包
import java.util.Scanner;(导包的动作必须出现在类定义的上边)
2.创建对象
Scanner sc = new Scanner(System.in);(只有sc是变量名,可以变,其它都不允许变)
3.使用变量接收数据
int i =sc.nextInt();(i是变量名,可变,其不可)(使用)
分支语句
流程控制语句概述
流程控制语句分类:
*顺序结构(按照代码的先后顺序,依次执行)
*分支结构(if,switch)
if语句格式1:
if(关系表达式){
语句体;
}
执行流程:
1.首先计算关系表达式的值
2.如果关系表达式的值为true就执行语句体
3.如果关系表达式的值为false就不执行语句体
4.继续执行后面的语句内容
if语句格式2
if(关系表达式){
语句体1;
}else{
语句体2;
}
执行流程:
1.首先计算关系表达式的值
2.如果关系表达式的值为true就执行语句体1
3.如果关系表达式的值为false就执行语句体2
4.继续执行后面的语句内容
if语句格式3:
if(关系表达式){
语句体1;
}else if(关系表达式2){
语句体2;
}
...
else{
语句体n+1;
}
执行流程:
1.首先计算关系表达式1的值
2.如果值为true就执行语句体1;如果值为false就计算关系表达式2的值
3.如果值为true就执行语句体2;如果值为false就计算关系表达式3的值
4. ...
5.如果没有任何关系表达式为true,就执行语句体n+1.
//数据测试:正确数据,边界数据,错误数据,经过才称的上健壮性
switch语句格式:
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
default:
语句体n+1:
[break;]
}
格式说明:
表达式:取值为byte,short,int,char,JDK5以后可以是枚举,JDK7以后可以是String.
case:后面跟的是要和表达式进行比较的值
break:表示中断,结束的意思,用来结束switch语句
default:表示所有情况都不匹配的时候,就执行该处内容,和if语句的else相似
执行流程:
1.首先计算表达式的值
2,依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束
3.如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句体,然后程序结束掉
case有穿透性,如果case控制的语句后面不写break,将出现穿透现象,在不判断下一个case值的情况下,向下运行,直到遇到break,或者switch语句结束
*循环结构(for,while,do...while)
重复做某件事,具有名确的开始和停止标志
循环结构的组成:
初始化语句:用于表示循环开启时的起始状态,简单说是循环开始的时候什么样(这是一条或者多条语句,这些语句可以完成一些初始化操作)
条件判断语句:用于表示循环反复执行的条件,简单说是判断循环是否能一直执行下去(这里使用一个结果值为boolean类型的表达式,这个表达式能决定是否执行循环体。例如:a
循环体语句:用于表示循环反复执行的内容,简单说是循环反复执行的事情(这里可以是任何语句,这些语句将反复执行)
条件控制语句:用于表示循环执行中每次变化的内容,简单来说就是控制循环是否能执行下去(这里通常是使用一条语句来改变变量的值,从而达到控制循环是否继续向下执行的效果。常见i++,i--这样的处理)
for循环格式:
for (初始化语句;条件判断语句;条件控制语句){
循环体语句;
}
执行流程:
1.执行初始化语句
2.执行条件判断语句,看其结果是true还是false
如是false,循环结束
如果是true,继续执行
3.执行循环体语句
4.执行条件控制语句
5.回到2继续执行
例子:for(int i=1;i
while循环语句
基本格式:
while(条件判断语句){
循环体语句;
}
完整格式:
初始化语句;
while (条件判断语句) {
循环体语句;
条件控制语句;
}
执行流程:
1.执行初始化语句
2.执行条件判断语句,看结果是true还是false
如果是false,循环结束
如果是ture,继续执行
3.执行循环体语句
4,执行条件控制语句
5.回到2继续
do...while循环语句格式
基本格式:
do{
循环体语句;
}while(条件判断语句);
完整格式:
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句);
执行流程:
1.执行初始化语句
2.执行循环体语句
3.执行条件控制语句
4.执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
5.回到2继续
三种循环的区别:
for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
do...while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行再判断)
for和while的区别
条件控制语句所控制的自增变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了
条件控制语句所控制的自增变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
死循环格式
for(;;){ }
while(true){ }
do{ }while(true);
while的死循环格式是最常用的
命令提示符窗口中Ctrl+C可以结束死循环
跳转控制语句
终止循环体内容的执行
使用是基于条件控制的
continue 用在循环当中,跳过某次循环体内容的执行,继续下一次的执行
break 用在循环当中基于条件控制,终止循环体内容的执行,也就是结束当前的整个循环
循环嵌套
语句结构:
顺序语句 以分号结束,表示一句话的结束
分支语句 一对大括号表示if的整体结构,整体描述一个完整的if语句
一对大括号表示switch的整体结构,整体描述一个完整的switch语句
循环语句 一对大括号表示for的整体结构,整体描述一个完整的for语句
一对大括号表示while的整体结构,整体描述一个完整的while语句
do...while以分号结尾,整体描述一个完整的do...while语句
任何语句对外都可以看成是一句话,一句代码
分支语句中包含分支语句称为分支嵌套
循环语句中包含循环语句称为循环嵌套
Random
用于产生一个随机数
使用步骤
1.导包import java.util.Randon;
导包的动作必须在类的定义之上
2.创建对象
Randon r = new Randon();
r是变量名,可变
3.获取随机数
int number = r.nextInt(10);//获取数据的范围:[0,10],包括0.不包括10
number是变量名,可以变,数字10可变,其它都不能变