一、Java概述
1.为什么要学习Java?
Java语言用途广
服务器程序,比如银行,证券交易平台,电子商务后台...
Android应用,比如安卓手机,各种移动设备,智能家电...
软件工具,比如开发工具eclipse,IneteLiJIdea
嵌入式领域,智能卡,传感器
大数据技术,Hadoop以及其它大数据处理技术都是用Java
2.Java语言发展史
在1991年,sun公司提出了程序在内存和芯片比较小的情况下的一个需求,然后James Gosling(詹姆斯•高斯林)带领团队进行研发,历经四年,在1995年正式发布。然后在2005年被Oracle公司收购。
3.Java语言的特点
- 开源--->开放源代码,可免费下载
- 简单、高效
- 平台无关性--->开发出来的Java程序可以在不同的操作系统上运行;在不同的平台上开发不同的Java虚拟机(虚拟环境),一套程序,可以实现在不同的平台上运行;Java程序与平台无关,但虚拟机与平台相关。
- 支持网络编程
- 多线程机制
- 动态的内存管理机制
- 安全性
4.Java语言体系结构
JavaSE(Java标准版):Java Standard Edition,是整个Java语言的基础,里面包含Java最基础、最核心的内容
JavaEE(Java企业版):Java Enterprise Edition,是企业版本 servelt-->server + applet 服务端程序开发,其中包含JavaSE
即前端网页-->发起请求-->后端服务器程序(处理,与数据库交互)
JavaME(Java微缩版):Java Micro Edition,微缩版 早期适用于电子设备中的程序,现在被安卓方向开发代替
5.Java语言的运行机制
Java语言的核心机制之Java虚拟机
Java虚拟机可以理解为一个翻译器。
对于不同的运行平台,有不同的虚拟机。
Java虚拟机机制屏蔽了底层运行平台的差别,实现类“一次编译,随处运行”。
开发源代码(Hello,java if{}else{})--->编译器jdk--->Hello.class(标准字节码文件)---JVM(虚拟机)--->翻译成不同平台支持的机器码
6.Java运行环境的安装与配置
开发运行Java程序,需要一个环境的支持,所以官方提供了jdk(集成开发工具包)。
jdk是给开发人员提供的,里面包含各种工具,运行环境,jvm
7.什么是JDK,JRE,JVM?
- JDK:是程序员使用Java语言编写Java程序所需的开发工具包(包括JRE,工具等),是提供给程序员使用的
- JRE:是用户运行Java程序需要的运行环境(Java虚拟机,Java基础类库)。
- JVM:JVM虚拟机,用来解释执行字节码文件(.class文件:通过javac翻译.java得到),Java的跨平台就是通过JVM来实现的。
8.Java编译过程
Java编译过程:Java编译程序(javac)将Java源程序(HelloWorld.java),翻译成Java字节码文件(HelloWorld.class),JVM虚拟机对HelloWorld.class进行解释执行。
二、JavaSE基础语法
1. IDE的使用
IDE(Integrated Development Environment)集成开发环境,是所有开发工具的总称。
Java主流的开发工具:eclipse(开源) idea(主流,收费)
2.注释
即使用特定的符号,标注内容,对代码的功能进行说明,程序在执行的时候不会执行注释。
// 单行注释 ctrl+/
/* */ 多行注释 ctrl+shift+/
/** */ 文档注释 用于为类,属性,方法进行功能注释,在其它地方使用时可以提示出来。
3.关键字
定义:被Java语言赋予了特殊含义,用作专门用途的字符串(单词)public class int ...
功能:用来修饰包,类,变量,方法...
特点:关键字所有字母都为小写
4.保留字
Java现有的版本尚未使用,但以后版本可能会作为关键字使用。自己命名标记符时要避免使用这些保留字goto,const
5.标识符
定义:Java对各种变量、方法和类等要素命名时使用的字符序列称为标识符,即Java语言中用来命名的字符(自己能定义名字的字符)
命名规则:
- 由26个英文字母大小写,0-9 ,_或 $ 组成 数字不可以开头。
-
不可以使用关键字和保留字,但能包含关键字和保留字。
-
Java中严格区分大小写,长度无限制。
-
标识符不能包含空格。
-
注意:在起名字时,为了提高阅读性,要尽量有意义, “见名知意” 。
6.Java变量
变量是程序中最基本的存储单元,程序执行中数值是可变的。
本质上是内存中一块很小的空间,使用变量名来访问这块区域,所以每一个变量在使用前必须要申请(声明),然后必须进行赋值。
[修饰符] 数据类型(必须明确类型) 变量名 = 值;
7.Java数据类型
Java语言是一种强类型语言,所谓的强类型指的是对于每一种数据都有明确的数据类型,在内存中分配了不同大小的内存空间。
整数类型:Java各整数类型又固定的表数范围和字段长度,不受具体操作系统的影响,保证Java程序的可移植性。
类型 | 占用存储空间 | 表数范围 |
byte | 1字节 | -127~127 |
short | 2字节 |
-2^
15
~ 2^
15
-1
|
int | 4字节 |
-2^
31
~ 2^
31
-1
|
long | 8字节 |
-2^63
~ 2^
63
-1
|
Java语言的整型常量默认为int型,声明long类型常量可以后加'l'或'L'。
浮点类型:与整数类型相似,Java浮点类型有固定的表数范围和字段长度。Java浮点类型有两种表示形式(十进制形式和科学计数法形式)
类型 | 占用存储空间 |
float | 4字节 |
double | 8字节 |
Java浮点型常量默认为double型,声明常量为float型是,需在数字后面加f和F.
逻辑型boolean(布尔型):适用于逻辑运算,一般用于程序流程控制。需要注意的是Java语言中boolean类型数据只允许取值true或false。不可以用0或非0的整数替代false和true。
字符型char
char型数据用来表示一个单个字符 占两个字节 使用单引号 char c = 'a';
可以涵盖世界上所有的书面语的字符
char类型是可以运算的,因为在char在字符编码表中有对应的数值。
在Java中,对char类型字符运行时,直接当作对应编码表的整数来对待。char c = 'a' + 1
先将'a' 提升为int类型,计算结果98,对应的字符是b。
8.基本数据类型转换
Java中可以从任意基本类型转型到另外的基本类型,boolean类型例外。
转换分为默认转换和强制转换
默认转换:整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循容量小的类型默认转换为容量大的数据类型;数据类型按容量大小排序为:byte,short,char -> float -> double,byte,short,char之间不会相互转换
容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能会造成精度降低或溢出。有多种类型的数据混合运算时,会自动将所有数据转换成容量最大的那一种数据类型
四个字节的float类型的最大值大于long型的最大值,因为浮点数在内存中的二进制值不是直接转换为十进制的,通过V = (-1)^S * M * 2 ^E
其中第一位,符号位,即S;接下来的八位,指数域,即E;剩下的23位,小数域,即M.
9.运算符
另外还有赋值运算符
运算符 | 用法举例 | 等效的表达式 |
+= | a += b | a = a + b |
-= | a -= b | a = a - b |
*= | a *= b | a = a * b |
/= | a /= b | a = a / b |
%= | a %= b | a = a % b |
表达式的运算顺序
优先级 | 运算符分类 | 结合顺序 | 运算符 | |||
由高到低 | 分隔符 | 左结合 | . [] () ; , | |||
一元运算符 | 右结合 | ! ++ -- - ~ | ||||
算术运算符 移位运算符 | 左结合 | * / % + - << >> >>> | ||||
* / % + - << >> >>> | ||||||
关系运算符 | 左结合 | < > <= >= instanceof(Java特有) = = != | ||||
逻辑运算符 | 左结合 | ! && || ~ & | ^ | ||||
三目运算符 | 右结合 | 布尔表达式?表达式1:表达式2 | ||||
赋值运算符 | 右结合 | = *= /= %= += -= <<= >>= >>>= &= *= |= |
关于&& || 与 & | 的区别
&&,||表示如果前面一项表达式已经满足要求了后面一项的表达式就无需再进行相应的判断了。
关于三目运算
三目运算表达式进行判断之后,表达式为true返回 “:”
左面的值,如果为false返回 “:”
右面的值。
10.控制语句
条件语句
if(条件表达式){ }
if(条件表达式){ }else{ }
if(条件表达式1){ }else if(条件表达式1){ }
if(条件表达式1){ }else if(条件表达式1){ }else{ }
多路选择语句switch
switch(表达式){ 表达式数据类型:byte int short char 枚举 String
case 常量1 : 语句块;
case 常量1 : 语句块;
case 常量1 : 语句块;
default: 默认语句块;
}
switch能够实现的功能,if都可以实现,而if能实现的功能,switch不一定能实现
if(各种条件表达式)
switch(表达式 变量) 表达式与case后面的值进行匹配一般用于固定的选项选择
case 后面只能给常量,不能重复
循环语句
循环:重复
循环组成部分:
循环变量的初始化 循环条件部分 循环体部分 循环变量的更新
while(逻辑表达式){语句;...;}
do { 语句; … ; } while(逻辑表达式);
for(循环变量初始1;循环条件2;变量更新4){ 循环体3 }
while与do-while语句的区别是while先判断后执行 do-while先执行后判断
另外还有两个语句:
break: 终止循环
continue:跳过continue语句后面的循环内容,继续执行下一次循环
循环嵌套
将一个循环加在另一个循环就形成了循环嵌套
嵌套循环就是把内层循环当作外层循环的循环体,当内层循环的条件为false时,就会跳出内层循环,结束外层的这次循环,然后开始下一次循环
如果需要直接结束循环,可以定义一个标签如label,在需要跳出循环的地方用break label。
三、数组
1.数组的基本概念及作用
数组是相同数据类型元素的集合,可以把它看成一个容器,可以存储多个数据,数组本身是引用类型,即对象。可以存储基本数据类型,也可以存储引用数据类型。
2.数组的创建
数组的两种声明方式:
数据类型 [ ] 数组名字:例如 int[] a;
数据类型 数组名字 [] :例如 int a [];
数组的三种创建方式:
//声明数组的同时,根据指定的长度分配内存,但数组中元素值都为默认的初始化值
int[] arr1 = new int[10];
//声明数组并分配内存,同时将其初始化
int[] arr2 = new int[]{1,2,3};
//是前一种的简写
int[] arr3 = {1,2,3};
数组的创建还可以分为静态和动态两种:动态创建数组,即给定数组长度,通过循环进行赋值;静态创建数组,即在创建数组时,为每个元素赋初值。
3.数组的访问与迭代
数组元素的访问
数组名字[索引]:例如 a[0],a[1],需要注意索引从0开始,索引的数据类型都是整型,索引最大值和数组长度始终差1。
数组迭代的两种方式:
第一种,for循环
int[] b = new int[]{1,2,3,4,5};
for(int i = 0;i < b.length;i++){
System.out.println(b[i]);
}
第二种,增强for循环
int[] a = new int[]{1,2,3,4,5};
/*
for(数组元素的类型 临时变量名:数组名){
System.out.println(临时变量名);
}
*/
for(int x:b){
System.out.println(x);
}
4.数组排序
冒泡排序
public static void main(String [] args){
int[] arr = {5,4,3,2,1};
for(int i = 0;i < arr.length - 1 - i;i++){
for(int j = 0;j < arr.length - 1;j++){
if(a[j] > a[j + 1]){
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
选择排序
public static void main(String [] args){
int[] a = {5,1,4,3,2};
for(int i = 0;i < a.length-1;i++){
int minIndex = i;//i = 0 假设第一个就是最小的
for(int j = i + 1; j < a.length;j++){
if(a[minIndex] > a[j]){
minIndex = j;//minIndex记录最小值所在的位置
}
}
int temp = a[minIndex];//一次比较完成后,只交换一次即可
a[minIndex] = a[i];
a[i] = temp;
}
}
5.二维数组
二维数组的定义
二维数组即数组中的数组,就是数组中的每一个元素又是一个数组。例如:
int[][] a = {{1,2,3},{7,8,9},{4,5,6}}
二维数组的声明和创建方式和一维数组相同。
二维数组的迭代
int[][] a = {{1,2,3},{1,2,3},{1,2,3}};
for(int i = 0;i < a.length;i++){
for(int j = 0;j < a[i].length;j++){
System.out.print(a[i][j]);
}
}