一、关于Java发展史
1.JAVA的语言设计始于1991年,SUN公司最开始想在消费类电子产品方面寻求市场,成立了由James Gosling领导的Green开发小组首要目标是编写可内嵌于家用小型电器设备内部的软件 ,使得机器变得更加的人工智能。
2.开始的时候Green小组是用C++编写的,后来发现C++并不适合这类任务。为什么呢?因为C++编写的程序常常会有使系统失效的程序错误,由其是内存管理和指针操作,常产生很多bug,大家设想 一下啊,比如说一台烤面包机上的程序有错误,可能会使面包机烧毁,甚至 更严重会产生爆炸。
3.所以后期呢,为了解决这个问题,Green小组 决定自己开发一种新的语言,该语言的设计目标是具有平台 的独立 性、高度的可靠性和安全性。因为那个时候C以及C++已经得到了广泛的应用,所以他们决定 以C++为基础来开发该语言。该语言最初被取名为Oak(橡树)。 Java的取名也有一些趣闻, 有一天, 几位Java成员组的 会员正在讨论给这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖啡,有一 个人灵机一动说就叫Java怎样, 得到了其他人的赞赏, 于是更名为JAVA(咖啡),一会呢,我们安装JDK的时候大家能看见我们JDK的图标呢就是一杯咖啡。
4.后期呢,在这个家电方面确实取得了一些成就,但是由于各种原因,还是没有推上市场。直到1994年,借着Internet和WWW的飞速发展,SUN公司呢,发现JAVA具有平台的独立性、高度的可靠和安全性非常适合在Internet的WWW上做应用开发。经过改造呢,终于JAVA在1995年5月23号正式宣布诞生了。
二、JAVA的特性和优势
简单性:就是c++语法的纯净版。没有头文件,指针运算,结构,联合,操作符重载,虚基类等等。由于语法基于c,因此学习起来完全不费力。
面向对象:面向对象是一种程序设计技术,他将重点放在数据(即对象)和对象之间的接口上。
可移植性:这是JAVA的一个重要的优势。JAVA代码或者说字节码、二进制码可以跨平台的移植,而不用管具体的操作系统和硬件环境。JAVA本身就是面向网络的,只有在网络环境中才能显示出他的优势,比如:现在我有一个网络环境,要让我的笔记本和手机交互,笔记本环境是windows发出一个让手机定时录音的JAVA代码,手机只有简单Linux内核操作系统,照样可以完美的执行这个代码。“一次编写,随处运行”:“write once, run anywhere”JAVA在设计时就很注重移植和跨平台性。比如:JAVA的Int永远都是32位。不像c++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。
高性能:J2EE是J2SE的扩展,增加了用于服务器开发的类库。如:javax.servletEnterprise JavaBeans 是一种用来代表企业逻辑的软件组件;JDBC则是让程序人员能直接在Java内使用的SQL的语法来访问数据库内的数据;Servlet能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP是一种可以将Java程序代码内嵌在网页内的技术;另外还有包括XML、email及transaction等各种应用于服务器端的API。这个版本是Java平台的核心,它提供了非常丰富的API来开发一般个人计算机上的应用程序,包括用户接口AWT及Swing,网络功能与国际化、图像处理能力以及输入输出支持等。在互联网上大放异彩的Applet也属于这个版本。J2ME是J2SE的内伸,包含J2SE的一部分核心类,也有自己的扩展类,增加了适合微小装置的类库:javax.microedition.io.*等。JIT(JUST IN TIME)即时编译。将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使JAVA程序的执行效率大大提高,某些代码甚至接待c++的效率。随着这种技术的一天天完善,也许有一天会超越编译代码的效率。
动态性:就是在需要时将某些代码添加到正在运行的程序中。反射机制。当需要把某些代码添加到正在运行的程序中时,动态性是一个非常重要的特性。Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类,这是C++语言进行面向对象程序设计所无法实现的
多线程:多线程的使用可以带来更好的交互响应和实时行为。多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。
安全性Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以构建防病毒,防篡改的系统。
健壮性:Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。Java系统仔细检测对内存的每次访问,确认它是合法的,而且不致引起任何问题。不过,即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该例外抛弃。再通过异常处理机制,程序就会发现这类例外,并加以处理。
三、Java重点版本的新特性
jdk1.2新特性:可变参数、面向对象特性、特殊类型String、static静态声明静态代码块、构造方法私有化。
jdk1.5新特性:泛型,for-each循环,自动装包/拆包,枚举,可变参数,静态导入,注解。
jdk1.7新特性:二进制字面量,数字字面量可以出现下划线,switch 语句可以用字符串,泛型简化(即泛型推断),异常的多个catch合并,try-with-resources 语句。
jdk.8新特性:接口的默认方法与静态方法,也就是接口中可以有实现方法、Lambda 表达式、函数式接口与静态导入、Lambda 作用域 在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相...、访问局部变量,等等其他新特性。
四、环境变量的配置
path:
目的: 为了能够在任意路径下使用javac,java命令
步骤: 系统右键->属性->高级系统设置->环境变量->系统变量->path->把jdk的bin目录配置进去
JAVA_HOME :
目的:
为了不频繁的修改path的值,可以配置JAVA_HOME来优化配置
未来使用某些框架等资源的时候有可能会需要查找JAVA_HOME的路径
步骤: JAVA_HOME -> jdk的安装路径D:\install_path\Java\jdk-11.0.7
path -> %JAVA_HOME%\bin 引用JAVA_HOME变量的值
classpath: 指定class文件的路径
五、注释
注释: 解释说明的文字
作用:
1.对程序的解释说明
2.便于后期维护
注释的分类:单行注释、多行注释、文档注释。
多行注释与文档注释的区别:
1.颜色
2.文档注释能够存在API文档中,但是多行注释不可以
API文档: 类的说明书
通过javadoc Class002_Comment.java为java文件中类声明API文档
3.工具中,在方法的上面添加文档注释会自动匹配一些方法的说明
注意:注释的内容不会被编译;类中适当的位置一定要添加注释
六、标识符
标识符: 一切起名字 的地方的名字就是标识符
标识符的命名规则 :
1.组成: 数字,字母,下划线_,美元符号$任意组合而成,数字不能开头 abc123
2.严格区分大小写
3.关键字与保留字不能作为标识符使用
关键字 : java中有一些单词,java语法赋予了特殊的作用与用法,这些单词成为关键字
保留字 : java中有一些单词,java的语法现在还没有使用,将来有可能使用的单词成为保留字 const goto
关键字全小写,工具中特殊的颜色显示
标识符的命名规范 :
1.见名知意
2.驼峰命名原则
包名 : 文件夹 全部小写
单级包 : 一个文件夹 shanghai
多级包 : 多个文件夹嵌套,层级之间使用.进行分隔 shang.hai
类名|接口名 : 每个单词首字母大写 ShangHai
方法名|变量名 : 第一个单词全部小写,第二个单词开始每个单词的首字母大写 shangHai
常量名 : 所有单词全部大写,多个单词之间_连接 SHANG_HAI
七、常量
常量 :java程序执行过程中,其值不会发生改变的量
分类:
字面值常量 :
整数常量 : -1 100 51 0 100
小数常量 : 1.1 -1.5
字符常量 : 'a' '1' ',' ' '
字符串常量 : "" "abc" "HelloWorld" " "
布尔常量 : true false
自定义常量 :
被final修饰的变量为常量
八、变量
变量 : 存储单个数据,可变的量;执行过程中,其值可能会发生改变的量;内存中开辟一块空间,用来存放指定类型的数据;变量相当于造盒子|开辟空间;空间|盒子就是变量;盒子的名字叫做变量名;盒子中|空间中存放的数据叫做变量的值;盒子|空间的大小->由数据的类型决定。
定义变量的语法:
数据类型 变量名 = 赋值; --> 声明的同时赋值
数据类型 变量名; -->变量声明
变量名 = 赋值; -->变量赋值
数据类型 : 整数int 小数double 字符char 布尔boolean 字符串String
注意: =是java中唯一一个自右向左运算的符号
一行内同时声明或者创建多个变量
变量关注的点:
1.数据类型 : 存储的数据决定
2.变量的名字 : 标识符的命名规则|规范
3.变量的值 : 要与数据类型保持一致
4.作用域 : 能够使用的范围
{} -> 代表作用域
从变量的声明开始,到包裹这个变量的,离它最近的}结束
注意:变量必须在作用域范围之内才能使用
同一个作用域中,变量不能同名
统一时刻变量只能存储一个值,变量的值不能回复
变量的分类:
1.局部变量 : 在方法中或者语句块中定义的变量成为局部变量
使用前必须已经声明并且已经赋值
2.成员变量 : 在类中方法外定义的变量成为成员变量
只声明不赋值存在默认值
整数:0 小数:0.0 字符:' ' 布尔: false 字符串: null
九、数据类型
数据类型:存储数据的空间大小
计算机中最基本的存储的单位: 1字节 = 1byte
1 byte = 8 bit
基本数据类型 : 4类八种
整型
表示名称 | 表现形式 | 大小 | 范围 |
---|---|---|---|
字节型 | byte | 1个字节 | 8bit [-128,127] |
短整型 | short | 2个字节 | 16bit [-32768,32767] 正负三万 |
整型 | int | 4个字节 | 32bit 正负21亿 |
长整型 | long | 8个字节 | 64bit 非常大 |
整数字面常量值默认的数据类型为int类型
表示一个比int类型更大的数值的时候,在数据的后面添加一个L|l-->推荐使用L
在java中,如果给byte,short,char赋值的时候,在其范围内的常量能够直接赋值
浮点型
单精度 float 4个字节32bit 精确表示6~7位
双精度 double 8个字节64bit 精确表示16~17位
java中浮点类型的字面常量值默认是double类型
在java中 表示一个float类型的数据在数据的后面添加f|F
浮点类型的数据运算可能会造成数据的不精确
java中的浮点型数据存储标准: 二进制浮点型运算标准
字符型
char 字符型 2个字节
char类型数据的表现形式:一对''包裹一个字符 ' ' '1' '中'
十进制的整数表示某一个字符 0~65535 -->Unicode
布尔型
boolean 真(对)->true | 假(错)->false 1bit
引用数据类型 : 类 接口 数组[]
十、 转义字符
当java中有些字符,java语法赋予了特殊的含义,如果不想要这些字符代表特殊含义,想要表示其字符本身,可以使用转义字符进行转义
转义字符从\开始
\t : 制表符
一个制表符位置代表8个空格
cmd中一个英文占据1个空格,一个汉字占据2个空格
制表符位置 前面的内容如果满制表符位的整数倍,重新开辟一个制表符位,如果不满,补全一整个制表符位置
\n 换行
光标从这一行的行尾换到下一行的行首
\b 退格
光标回到上一格
如果\b后面没有内容的输出,对原数据不影响,如果\b后面存在内容的输出,会覆盖原有位置的内容
数值型表现形式:
整型 :
进制: 满几进一
二进制 : 由0,1组成 通过0b|0B开头
八进制 : 由0~7之间的数字组合而成 通过0开头
十进制 : 默认 由0~9之间的数字组合而成
十六进制 : 由0~9,a~f组合而成 通过0x|0X开头
转换:
其他进制转为十进制: 从后往前,从右往左,最后一位开始,当前这一个位置的数值*当前进制数^0开始,每次+1,最后的和为转为十进制的数据
十进制转为其他进制: 当前的十进制数据不停的除以2,每次关注余数,当结果为0不除了,余数从下往上看
浮点型:
1.当小数的整数位为0的时候,0.5-->0省略 : .5
2.科学计数法 e|E->10
1.23E3 - > 1.23*10^3
十一、数据类型转换
正常: 对应类型的数据赋值给对应类型的变量
boolean类型不参与类型转换
自动类型提升:
从小到大
大范围类型 变量名 = 小范围类型的数据;
强制类型转换
从大到小,有可能会损失精度
小范围类型 变量名 = (小范围类型)大范围类型的数据;
强转是发生在赋值之前的,大范围类型的数据强转为小范围类型,然后赋值给对应的小范围类型的变量
注意:
1.当多种类型参与运算时候,结果为参与运算中最大的数据类型
2.当多种类型参与运算时候,如果参数运算的最大类型小于int类型,结果提升成为int类型
3. byte->short->int->long->float->double
4.当byte,short,char赋值的时候,只要在其范围内的常量就能够成功赋值
十二、运算符
功能作用的不同分类:算数运算符、 赋值运算符、比较运算符|关系运算符、 逻辑运算符、条件运算符、位运算符 (了解)。
操作数: 运算符左右两边的数据成为操作数 3+4
表达式: 运算符连接左右两边的操作数整体称为表达式
语句 : 以 ; 结束
操作数的不同 一元运算符: 操作数为1个 ++ -- +(正号) -(负号)
双目运算符|二元运算符: 操作数为2个 a+b - * /
三目运算符|三元运算符: 条件运算符
算数运算符:、
+
1)正号
2)加法运算
3)字符串的连接符
当+左右两边一旦出现字符串,+作为字符串的连接符使用,最后会把左右两边的数据拼接成一整个字符串得到结果
% 模以 取模 求余数
操作1%操作数2 当操作数1<操作数2时候,结果为操作数1
注意:
一个字符型数据参与运算(四则运算),会前转为十进制的整数再运算--> Unicode,ASCII
++ -- 一元运算符
++ 自增 自身+1
-- 自减 自身-1
只影响操作数本身
++放在操作数的前面或者后面,都是自身+1
--放在操作数的前面或者后面,都是自身-1
影响其他值(赋值,输出,表达式计算)
++|--放在操作数的前面,先+1|-1,然后再去运算
++|--放在操作数的后面,先参与运算,然后再自身+1|-1
赋值运算符
基础赋值运算符 =
=是java中唯一一个自右向左运算的符号
扩展赋值运算符 (算数运算符+基础赋值运算符)
+= a+=b ==> a = a+b
%= a%=b ==> a = a%b;
缺点:
不直观
优点:
提高执行效率,编译期会自动优化为扩展赋值运算符
自动做强制类型转换
比较运算符|关系运算符
> < >= <=
只能针对数值型|能够转为数值型的数据进行操作
== !=
可以针对任意类型数据进行操作
结果为boolean类型的运算符
逻辑运算符:
& 与
一个为false就是false,两个都为true,结果才为true
| 或
一个为true就是true,两个都为false才是false
! 非 取反
!true->false
!false->true
^ 异或
相同为false,不同为true
短路运算符 : 当左边的操作数的值就能够决定最终的结果,右边操作数将不会执行
短路与 : 与单与逻辑相同
短路或 : 与单或的逻辑相同
推荐使用短路运算符
两边的操作数为boolean类型
结果为boolean类型结果
条件运算符
boolean表达式 ?值1 : 值2;
boolean表达式 : 值为boolean类型的表达式
1)计算表达式,得到一个boolean结果
2)如果结果为true,条件运算符结果为值1
3)如果结果为false,条件运算符结果为值2
位运算符:(了解)
把操作数转为二进制,对二进制的操作数进行某种规则的运算,最终得到的二进制的结果再转为十进制
一下三个 运算符,当操作数为boolean类型作为逻辑运算符,操作数为整数,作为位运算符
& : 两边的操作数转为二进制,同一位置的两个数,一个为0就是0,两个都为1才1,结果转为十进制
| : 两边的操作数转为二进制,同一位置的两个数, 一个为1就是1,两个都为0才是0,结果转为十进制
^ : 两边的操作数转为二进制,同一位置的两个数, 相同为0,不同为1,结果转为十进制
位移运算符
<< 左移 : 第一个操作数转为二进制,向左移动第二个操作数个位置,空位补0,结果转为十进制
>> 右移 : 第一个操作数转为二进制,向右移动第二个操作数个位置,移出的位置舍弃,结果转为十进制
规律:
左移: 相当于*2的倍数 a<<b ==> a*2^b
右移: 相当于/2的倍数 a>>b ==> a/2^b
位运算符的执行效率较高,因为针对二进制的数据
当想要对2或者2的倍数进行乘除,建议使用位移运算符效率更高
十三、两个常用工具类
基本数据类型:基本数据类型 变量名 = 赋值; 如: int i = 1;
引用数据类型:
1.导包 : 指明当前引用数据类型类的位置
import 包名.类名;
位置: 类的上面
2.创建当前引用数据类型的一个变量|引用
引用数据类型 变量名 = new 引用数据类型();
3.根据引用使用功能
引用名.功能名字();
Scanner 接收用户键盘输入的内容
1.导包
import java.util.Scanner;
2.创建Scanner类型的一个变量|引用
Scanner sc = new Scanner(System.in);
3.使用功能
sc.功能名字();
如: sc.nextInt(); 接收用户键盘输入的int类型的数据
sc.nextByte(); 接收用户键盘输入的Byte类型的数据
字符串
sc.next(); 接收用户输入的字符串
从有效字符开始接收(非空格),知道遇到enter才能结束功能,但是接收过程中如果遇到空格,就停止接收,但是功能不会结束
sc.nextLine(); 接收用户输入的一整行字符串
从任意字符开始接收,如果接收的内容为enter结束功能
如果nextLine功能的上面有使用到系列next功能,需要处理遗留enter问题sc.nextLine();
4.关闭
sc.close();
使用当前类中完全使用完毕之后进行关闭,以便于回收资源
Random : 产生随机数
nextInt() 产生int范围内随机整数
nextInt(整数n) 产生int类型的[0,n)整数
nextDouble() 产生一个double类型 的随机小数-->[0.0,1.0)
总结公式:
产生某一个范围内的随机 整数
[0,max] ran.nextInt(max+1)
[min,max]
ran.nextInt(max-min+1)+min -->[0,max-min] +min --> [min,max]
[min,max)
ran.nextInt(max-min)+min -->[0,max-min)+min-->[min,max)
伪随机数: 没有真实达到完全随机
十四、流程控制语句
顺序结构 : 从上到下,从左到右-->默认
选择结构 : 满足条件执行对应的代码
循环结构 : 让一些代码重复不停的执行多次
选择结构:
if 区间判断|定值判断
switch 定值判断
能用switch的都能if,能用if不一定能够使用switch
if
单选泽|单分支\
if(条件表达式){
满足条件执行的代码段;
}
条件表达式 : 必须为一个值为boolean的表达式
执行流程:
1.计算条件表达式
2.如果结果为true,执行{}中的语句体
3.如果结果为false,就直接跳过if结构
双选择|双分支
if(条件表达式){
满足条件执行的代码段;
}else{
不满足条件执行的代码段;
}
注意: 双选择一定能够执行语句体|一定能够得到结果
多选择|多分支
if(条件表达式1){
满足条件表达式1执行的语句体1;
}else if(条件表达式2){
满足条件表达式2执行的语句体2;
}else if(条件表达式3){
满足条件表达式3执行的语句体3;
}.....
else{ -->接盘侠
如果以上都不满足执行得到语句体n;
}
注意: 当{}中的语句体只有一句,前后的{}可以省略
if 与 条件运算符之间的区别:i
能够使用条件运算符的都可以使用if语句
if是一个语法结构,条件运算符是运算符
条件运算符编写更简洁,性能更高,结构简单,但是if更强大
条件运算符必须得到一个结果的,但是if语句可以没有结果(单选择)
if语句可以根据不同 的选择判断,决定执行对应的语句体结构,而条件运算符只能存在一个条件
建议: 如果结构简单,能够使用条件运算符就使用条件运算符,否则就使用if语句
for循环
for(条件初始化;条件判断;条件变化 ){
重复执行的语句体;
}
条件初始化 : 声明一个变量i并且第一次赋值 -->i条件
条件判断 : 对变量的i判断
决定循环是否结束
条件变化|迭代因子 : 变量i自身值的改变
执行顺序:
1.条件初始化 i
2.条件判断,满足执行语句体,不满足条件,结束循环
3.条件变化
从第二次循环开始,重复执行2,3步骤
注意:
for循环的变量条件i只属于当前 for循环,只能在循环中使用
for可以通过条件的变化控制循环的次数,循环体中可以使用条件的值,条件变量可以按照想要的逻辑进行变化,实现需求
考虑: 是否存在一些代码重复执行,如果是,规律可循,可以选择使用循环结构
如果循环体语句只有一句,前后的{}可以省略
switch 定值判断
能用if的不一定能用switch,能用switch都能使用if
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
....
default:
语句体n;
break;
}
表达式 : 一般为一个变量,可以为一个表达式,常量都可以
结果数据类型要求: byte,short,int,char,枚举类型(jdk5),String字符串(jdk7)
case : 后面接一个定值,拿到表达式的结果与case后面的定值进行判断是否相等,相等执行对应的语句体,不相等,继续向下判断
从上到下一次判断
break : 终止当前的switch语句
如果没有break会发生case穿透 : 从当前满足条件的语句体开始执行,一直向下 穿透,无论下面的case是否满足条件都不再判断,直接执行语句体,
直到遇到下一个break或者switch语句的结束而结束
default : 与else相同
以上的case都不满足,name就执行default中的内容
位置可以在switch语句中的任意位置
一般定义在switch语句的最后,如果切换位置,注意break定义
一对{}中的内容就要缩进一个tab键