java基础
一 、java发展历程
1.java创始
- 一种面向Internet的编程语言。
- 开始因为java程序可以在Web浏览器运行,成为java小程序(Applet)
- applet使用GUI与web交互,applet内嵌在html中
2.java发展、版本迭代
1991年 Green项目,开发语言最初命名为Oak (橡树)
1994年,开发组意识到Oak 非常适合于互联网
1996年,发布JDK 1.0,约8.3万个网页应用Java技术来制作
1997年,发布JDK 1.1,JavaOne会议召开,创当时全球同类会议规模之最
1998年,发布JDK 1.2,同年发布企业平台J2EE
1999年,Java分成J2SE、J2EE和J2ME,JSP/Servlet技术诞生
2004年,发布里程碑式版本:JDK 1.5,为突出此版本的重要性,更名为JDK 5.0
2005年,J2SE -> JavaSE,J2EE -> JavaEE,J2ME -> JavaME
2009年,Oracle公司收购SUN,交易价格74亿美元
2011年,发布JDK 7.0
**2014年,发布JDK 8.0,是继JDK 5.0以来变化最大的版本**
2017年,发布JDK 9.0,最大限度实现模块化
2018年3月,发布JDK 10.0,版本号也称为18.3
2018年9月,发布JDK 11.0,版本号也称为18.9
3.体系平台
- Java SE(Java Standard Edition)标准版
- Java EE(Java Enterprise Edition)企业版
- Java ME(Java MicroEdition)小型版
- Java Card
4.应用
5.诞生 特征
java之父:James Gosling 开发Green项目时为了满足一些需求(移植、安全、垃圾回收等)开发
特征
- 易学的: 接近c、c++
- 强制面向对象 : 提供类、接口、单继承、多实现
- 分布式的:支持Internet开发,java net接口,java的RMI(远程方法激活)
- 健壮性的:强类型、异常以及① 去除了C语言中的指针 ②自动的垃圾回收机制 -->仍然会出现内存溢出、内存泄漏
- 安全的 :安全机制,安全防范机制ClassLoader
- 体系结构中立的:在java平台编译成结构中立class文件
- 解释型:在java平台编译为字节码文件后,可在实现该java平台的任何系统解释器运行
- 性能略高
- 原生支持多线程:线程是特殊对象,需要Thread类或子孙类来创建
6.特点
- 面向对象
类、对象
封装、继承、多态 - 健壮性
继承了c/c++的优点,但去掉了影响健壮性的指针、内存的申请与释放等,提供了一种相对安全的内存管理和访问机制 - 跨平台
Write once,Run AnayWhere
在需要运行的java程序的平台安装jvm即可
7.两种机制
- 垃圾回收机制(Garbage Collection)
- java虚拟机(Java Virtual Machine)
- 内存溢出问题仍然会发生
- 用户-> java->字节码文件->JVM->操作系统->硬件
二、java环境搭建
JDK(java Development Kit )java开发工具包
JRE(java RunTime Environment) java运行时环境
1.Java语言的环境搭建:JDK、JRE、JVM关系
JDK=JRE+开发工具集(javac等)
JRE=JVM+java基础类库
2.配置java环境
安装:jdk
环境变量配置
- 配置JAVA_HOME为 D:\Java\jdk1.8.0_144\
- 配置CLASSPATH为 ;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;D:\JMF\lib\jmf.jar;D:\JMF\lib\sound.jar
- 配置Path为 %JAVA_HOME%\bin 和 %JAVA_HOME%\jre\bin
3.注释及代码风格
使用文档注释整个类或者方法
使用单行或者多行注释方法某一步
使用Tab实现缩进
运算符前后留出空格
行尾风格和次行风格
三、java基本语法
数据类型
1.关键字&保留字
关键字 | |
---|---|
用于定义数据类型的 | |
class、interface、enum、byte、short、int、long、float、double、char、boolean、void | |
用于定义流程控制的 | |
if、else、switch、case、default、while、do、for、continue、break、return | |
定义访问权限修饰符的 | |
private、protected、public | |
定义类、函数、变量修饰符 | |
abstract、final、static、synchronized | |
用于定义类与类之间关系的 | |
extends、implements | |
用于定义建立实例与引用实例,判断实例的关键字 | |
new、this、super、instanceof | |
用于异常处理的 | |
try、catch、finally、throw、throws | |
用于包的 | |
import、package | |
其他修饰关键字 | |
native、strictfp、transient、volatile、assert | |
用于定义数据类型值的 | |
true、false、null |
保留字尚未使用goto、const
-
native:JNI,Java Native Interface,Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Java本地接口)。
-
strictfp:一旦使用了strictfp来声明一个 类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确,
可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字 -
transient:Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输
transient关键字就是让某些被修饰的成员属性变量不被序列化 -
volatile: volatile是Java提供的一种轻量级的同步机制 Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。
-
assert:assert意为断言的意思,这个关键字可以判断布尔值的结果是否和预期的一样,如果一样就正常执行,否则会抛出AssertionError。
assert有两种用法: -
- (1)assert expression1;
-
- (2)assert expression1 : expression2;
数据类型
2.标识符(Identifier)
Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符
技巧:凡是自己可以起名字的地方都叫标识符。
1. 定义合法标识符规则:
由26个英文字母大小写,0-9 ,_或 $ 组成
数字不可以开头。
不可以使用关键字和保留字,但能包含关键字和保留字。
Java中严格区分大小写,长度无限制。
标识符不能包含空格。
2. 命名规范
包名:多单词组成时所有字母都小写:xxxyyyzzz
类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个 单词首字母大写:xxxYyyZzz
常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
注意1:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
注意2:java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用。
3.变量
成员变量:
·····实例变量(不以static修饰)、类变量(可以static修饰)
局部变量:
······形参(方法、构造器中定义的变量)、方法局部变量(在方法内定义)、代码块局部变量(代码块内定义)
4.字符集
-
ASCII:除第一位外,后面七位表示,共定义了128种字符:48是0,65是A,97是a
-
Unicode:采用多字节表示,为所有字符分配独一无二的二进制代码,计算机无法辨别表示的是一个字符还是多个字符
-
-
Utf-8:变长的字节表示,1~6位,是Unicode的一种,单字节表示时首位为0,类似ASCII
5.String
特点:
不可变
效果相当于字符数组,底层是字节数组byte[]
new一次,地址就不同
以“ ”出现的字符串,始终一个String对象
==与equals
基本类型 | 引用类型 | |
---|---|---|
== | 数据值 | 地址值 |
equals | 内容值 |
API:Application Programming Interface 应用程序接口
StringBuilder:
可变的字符串序列,(容器)
添加:append(任意类型) (链式编程: s.append().append().append())
反转:reverse
-
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
-
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
-
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
-
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
-
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
6.类型转换
- 自动转型:容量小的转容量大的
- 强制转型:容量大的转小的(long b = 154; int a= (int)b;)
- boolean类型不可以转换为其它的数据类型。 整型默认 int 浮点型默认 double
通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可 以实现把字符串转换成基本类型。
如: String a = “43”; int i = Integer.parseInt(a);
7.进制转换
- 正数:原码、反码、补码都一样
- 负数:原码 -> 原码除首位符号位外取反->反码 -> 反码最后一位加1 -> 补码
- 二进制:Binary system,简写BIN。
- 八进制:Octal number system,简写OCT。3位来计算
- 十进制:Decimal system,简写DEC。
- 十六进制:Hexadecimal,简写HEX。4位来计算
BIN->DEC:把二进制数按权展开、相加即得十进制数。
DEC->BIN:十进制数除2取余法(二进制位从后往前),即十进制数除2,余数为权位上的数,得到的商值继续除,直到商为0为止
BIN->OCT:3位二进制数按权展开相加得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)。
OCT->BIN:八进制数通过除2取余法,得到二进制数,对每个八进制为3个二进制,不足时在最左边补零。
BIN->HEX:与二进制转八进制方法近似,八进制是取三合一,十六进制是取四合一。(注意事项,4位二进制转成十六进制是从右到左开始转换,不足时补0)。
HEX->BIN:十六进制数通过除2取余法,得到二进制数,对每个十六进制为4个二进制,不足时在最左边补零。
运算符
1.取余
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。
2.运算逻辑
逻辑运算符用于连接布尔型表达式,在Java中不可以写成33 & x<6
“&”和“&&”的区别: 单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。 理解:异或,追求的是“异”!
// 区分:| 与 ||
//相同点1:| 与 || 的运算结果相同
//相同点2:当符号左边是false时,二者都会执行符号右边的运算
//不同点3:当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算
//开发中,推荐使用||
//区分& 与 &&
//相同点1:& 与 && 的运算结果相同
//相同点2:当符号左边是true时,二者都会执行符号右边的运算
//不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。
//开发中,推荐使用&&
3.位运算
&、|、^、<<、>>、>>>、~
-
位运算符操作的都是整型的数据
-
<< :在一定范围内,每向左移1位,相当于 * 2
-
>> :在一定范围内,每向右移1位,相当于 / 2
面试题:最高效方式的计算2 * 8 ? 2 << 3 或 8 << 1
4.三元运算
凡是可以使用三元运算符的地方,都可以改写为if-else
反之,不成立。
如果程序既可以使用三元运算符,又可以使用if-else结构,那么**优先选择三元运算符**。原因:简洁、执行效率高。
流程控制
1.if-else
条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量
语句块只有一条执行语句时,一对{}可以省略,但建议保留`
if-else语句结构,根据需要可以嵌套使用`
当if-else结构是“多选一”时,最后的else是可选的,根据需要可以省略`
当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓 当多个条件是“包含”关系时,“小上大下 / 子上父下”`
2.switch
switch(表达式)中表达式的值必须是下述几种类型之一:byte,short, char,int,枚举 (jdk 5.0),String (jdk 7.0);
case子句中的值必须是常量,不能是变量名或不确定的表达式值;
同一个switch语句,所有case子句中的常量值互不相同;
break语句用来在执行完一个case分支后使程序跳出switch语句块;如 果没有break,程序会顺序执行到switch结尾
default子句是可任选的。同时,位置也是灵活的。当没有匹配的case时, 执行default
3.switch和if-else
if和switch语句很像,具体什么场景下,应用哪个语句呢?
如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几 种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if
凡是可以使用switch-case的结构,都可以转换为if-else。反之,不成立。
4.循环语句
while:先判断后执行
do-while:先执行后判断
break:终止本层循环
多层循环时,通过添加标签来声明终止哪层循环
lable1:{
lable2:{
lable3:{
break lable2;
}
}
}
continue:终止本次循环
数组
数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括 基本数据类型和引用数据类型。
创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是 这块连续空间的首地址。
数组的长度一旦确定,就不能修改。
我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
- 数组的分类:
按照维度:一维数组、二维数组、三维数组、…
按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对 象数组)
对于基本数据类型而言,默认初始化值各有不同
对于引用数据类型而言,默认初始化值为null(注意与0不同!)
byte、short、int、char默认为 0
long 默认为 0L
float默认为0.0F double为 0.0
引用类型默认为 null boolean默认为false
Arrays:
知识图谱
在线阅读详细图谱:java基础
此篇仅为java基础入门知识,介绍了简单的数据类型、运算符、字符串、数组等常用
类型,想获取知识图请私信我!
面向对象与异常处理,下篇讲到!