一、语言概述
Java整体概述
1、Java语言概述
1.1 Java版本
-
Java SE 标准版(J2SE) : 占领桌面应用;
-
Java ME 移动版 (J2ME) : 占领手机;
-
Java EE 企业版(J2EE):占领服务器;
1.2 Java特性和优势
【简单性 面向对象 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性】
主要是:
- 面向对象:
- 两个要素:类、对象;
- 三个特征:封装、继承、多态;
- 健壮性:① 去除了C语言中的指针 ②自动的垃圾回收机制 → 仍然会出现内存溢出、内存泄漏;
- 跨平台型:write once,run anywhere:一次编译,到处运行;功劳归功于:JVM;
1.3 JDK、JRE、JVM的关系
-
JDK 中有 JRE;JDK = JRE + 开发工具集(如javac编译工具等);
-
JRE 中有 JVM;JRE = JVM + JavaSE标准类库;
2、注释与API文档
2.1 注释:Comment
单行注释://; 多行注释:/* / ;文档注释:/* */;
【注意】
-
单行注释和多行注释,注释了的内容不参与编译。 换句话说,编译以后生成的.class结尾的字节码文件中不包含注释掉的信息;
-
注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档;
-
多行注释不可以嵌套使用;
2.2 Java API 文档
- API: application programming interface。实际习惯上:将语言提供的类库,都称为API;
- API文档:针对于提供的类库如何使用,给的一个说明书。类似于《新华字典》;
2.3 生成API文档
-
javadoc命令是用来生成自己的文档的
并且 要添加 -encoding UTF-8 -charset UTF-8 ,以便显示中文
-
参数信息
- @author 作者名
- @version 版本号
- @since 指明需要最早使用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
/**
* @author Honson Chan
* @date 2020/5/7 - 2:52
*/
public class Demo06 {
/**
*
* @param args
*/
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a + b + "");
System.out.println("" + a + b);
}
}
二、基本语法
1、关键字与标识符
1.1 Java关键字的使用
定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词) 特点:关键字中所字母都为小写 具体关键字:
1.2 保留字:
现Java版本尚未使用,但以后版本可能会作为关键字使用;
保留字:goto 、const ;
【注意:自己命名标识符时要避免使用这些保留字】
1.3 标识符的使用
定义:凡是自己可以起名字的地方都叫标识符。
规则(必须要遵守。否则,编译不通过):
- 由26个英文字母大小写,0-9, _或$组成;
- 数字不可以开头;
- 不可以使用关键字和保留字,但能包含关键字和保留字;
- Java中严格区分大小写,长度无限制;
- 标识符不能包含空格;
2、数据类型
- Java是强类型语言
Java的数据类型分为两大类
-
基本类型
整型:byte(1字节=8bit) \ short(2字节) \ int(4字节) \ long(8字节)
- byte=10
- short=10
- int=10
- long = 12L 【注意:要加一个L或l,但是小写的 ‘L’ 像数字1,用L】
浮点数:
- float=1.1F 【注意:要加一个F或f】
- double=1.111111
字符:
- char = ‘a’
- boolean = true
-
整数扩展:
进制
-
二进制 0b
-
十进制
-
八进制 0
-
十六进制 0x 【十六进制中用 A-F 来表示10-15】
int i = 0b10; int i2 = 010; int i3 = 10; int i4 = 0x10; //控制台输出结果 i=2,i2=8,i3=10,i4=16
-
-
浮点数扩展:
- 0.1f 不等于 0.1
- 一个很大的浮点数加1,两个数会判定为相等的数
float f = 0.1f;
System.out.println(f);
double d = 0.1;
System.out.println(d);
System.out.println(f == d);
//float 是有限 离散 舍入误差 大约 接近但不等于
//最好完全避免使用浮点数 可以使用 BigDecimal 数学工具类
float f1 = 23333333333333333f;
float f2 = f1 + 1;
System.out.println(f1 == f2);
//控制台输出结果
0.1
0.1
false (f == d);
true (f1 == f2)
- 字符扩展
- 字符实际上也是数字,从 U0000 - UFFFF
char c1 = 'a';
char c2 = '中';
System.out.println((int) c1);
System.out.println((int) c2);
char c3 = '\u0061'; // ’a‘实际上就是'\u0061'
System.out.println(c3);
//输出结果
97
20013
a
- 布尔类型
//两种if表示的都是一个意思
boolean flag = true;
if (flag) {
}
if (flag == true) {
}
- 转义字符
- \t 要用 ” \t“来表示 ,‘\t’只是一个 字符 不会转义。‘ x’表示一个char类型
- \n
- 溢出相关
//操作比较大的数的时候,注意溢出问题
//JDK7 新特性,数字之间可以用下划线分割
int money = 10_0000_0000;
int years = 20;
int total = money*years; //-1474836480 计算的时候已经溢出了
long total2 = money*years; //默认是int,转换之前已经存在问题了
long total3 = money*(long)years; //先把一个数转换为long
long total4 = (long) money*years;
System.out.println(total);
System.out.println(total);
System.out.println(total3);
System.out.println(total4);
//输出
-1474836480
-1474836480
20000000000
20000000000
-
类型转换
byte < short < int < long < float < double
float 大于 long 是因为浮点数优先
注意点: 1、不能对布尔值进行转换 2、不能把对象类型转换为不相干的类型 3、在把高容量转换到低容量的时候,需要强制转换 4、转换的时候可能存在内存溢出,或者精度问题!
int i1 = 128;
byte i2 = (byte) i1;//内存溢出 ,这是强制转换
double i3 = i1; //自动转换
char c = 'a';
int d1 = c+1; //自动转换为整型
int y = 10;
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
System.out.println((int) 23.7); //舍去小数
System.out.println((int) -45.89f);
System.out.println((char) d1);
System.out.println(d1);
System.out.println((long) y);
//输出
128
-128
128.0
23
-45
b
98
10
3、常量与变量
-
变量有三种
按照声明位置分类
- 局部变量
- 必须初始化
- 类变量
- 静态变量,不需要实例就可以调用,默认值与实例变量相同。
- 实例变量
- 从属于对象,如果不自行初始化,默认值为 整型:0 ,浮点型:0.0,字符型:U000
- 布尔类型:默认值为false
- 除了基本类型,其余的默认值都是null
public class demo03 {
static double salary = 2500;
String name; //实例变量
int age; //实例变量
public void add(){
int i = 10; //方法内的局部变量
System.out.println(i);
}
public static void main(String[] args) {
//变量类型 变量名字
demo03 demo03 = new demo03();
System.out.println(demo03.age);
System.out.println(demo03.name);
//类变量 static
System.out.println(salary);
}
}
//输出
0
null
2500.0
- 常量
- final修饰的变量
//修饰符,不存在先后顺序
public static final double PI = 3.14;
-
命名规则
-
驼峰原则:lastname → 应该写成→ lastName
-
所有名字要 见名知意
-
类成员变量:首字母小写和驼峰原则:lastName
-
常量:大写字母,不同单词用下划线区分:,MAX_VALUE
-
类名:首字母大写和驼峰原则:Main,GoodMan
-
方法名:首字母小写和驼峰原则:run() ,runMan()
-
4、运算符
-
算术运算符:+,-,*,/,%,++,–
- % 求余 模运算
- ++,-- 这两个是一元运算符
- i++,先赋值,再自增;++i,先自增,再赋值
int i = 1; int k = ++i; //此时先执行i=i+1,然后i的值(2)赋给k int j = i++; //此时先执行 j=i,就是等于2,然后i再自增1,i=3 System.out.println(k); System.out.println(j); System.out.println(i); //结果 2 2 3
int i = 1; int k = i++; //此时先执行 k=i,就是等于1,然后i再自增1,i=2 int j = ++i; //此时先执行i=i+1,然后i的值(3)赋给k System.out.println(k); System.out.println(j); System.out.println(i); //结果 1 3 3
- i–;--i 同理,只是自增改为自减
-
赋值运算符:= ,+=,-=,*=,/=
-
关系运算符:>,<,>=,<=,==,!= instanceof
- 关系运算符返回的结果:true/false, 一个boolean值
- 短路运算
int i = 3; boolean b = (i<2)&&(i++<4); //i<2判断为false了,后面的条件就不会执行,因为没必要执行,所有i不会自增 System.out.println(b); System.out.println(i); //结果 false 3
-
逻辑运算符:&&,||,!
-
位运算符:&,|,^ , ~ , >> , << , >>>
A = 0011 1100 B = 0000 1101 A&B = 0000 1100 同 1 为 1,其余为0 A|B = 0011 1101 有 1 为 1 A^B = 1100 0010 相同为1,不同为0,异或运算 ~B = 1111 0010 取反 2<<3 = 16 左移3位,(就是乘2,进行3次;2*2*2) >> 右移,移一位就除2 >>> 右移,高位部0
-
三元运算符
- x?y:z x为true 执行 y ,x为false执行 z;
-
连接字符串 +
int a = 10; int b = 20; System.out.println(a + b + ""); +是计算,再连接字符串 System.out.println("" + a + b); +是连接字符串 //输出 30 1020
-
表达式输出结果类型
int a = 10;
double b = 10;
short c = 10;
byte d = 10;
long f = 10;
char e = 'c';
char h = 'c';
float g = 10f;
//表达式输出的结果默认是int类型,除非操作数里的有比 int 高容量的数据类型,long,float,double;
System.out.println(a+b+c+d+f);
System.out.println(a+e);
System.out.println(a + c + d + g);
System.out.println(e+h);
System.out.println(e);
System.out.println(c + d);
//结果
50.0 //double
109 //int
40.0 //float
198 //两个字符相加输出是int
c //输出单个字符
20 //short + byte
5、流程控制
5.1 Scanner类(补充)
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
//接收int,不是int就会报错,可以用下面的判断
int i = scanner.nextInt();
//接收double
double k = scanner.nextDouble();
//接收String,会接收enter
String s = scanner.nextLine();
//if(scanner.hasNextLine()){} //判断输入的是不是字符串
//if(scanner.hasNextInt()){} //判断输入的是不是整型
//if (scanner.hasNextDouble()){} //判断输入的是不是double类型
System.out.println(i);
System.out.println(k);
System.out.println(s);
//凡是属于IO流的类如果不关闭会一直占用资源
scanner.close();
5.2 顺序结构
- 按顺序执行,最基本的算法结构
5.3 选择结构
5.3.1 单选择
boolean flag = false;
if (flag){
System.out.println(true);
}else{
System.out.println(false);
}
5.3.2 多选择
再 if-else之间加入 else if (可以有多个)
只要有一个条件为true,其余的条件都不执行。
5.3.3 嵌套if结构
5.3.4 switch多选举结构
- expression变量类型可以是 byte,short,int,char,String,但case中value的值只能是字面量或者常量。
- 只要有一个case中value等于expression的变量值,就会执行该case的语句;
- 如果都没有就执行default;
- case会穿透,如果case中没有break,就会有该后面的case中的语句继续输出;
- 所有case中最后都加上case;
switch(expression){
case value:
//语句
break;
case value:
//语句
break;
default:
//语句
}
5.4 循环结构
5.4.1 while循环
- 只要条件为true,就会执行循环体中的代码
- 一直为true,就会死循环
- 先判断再执行
while(expression){
//语言
}
5.4.2 do while循环
- 会先执行一次do,再循环
- 先执行后判断,能保证至少执行一次
do{
}while(布尔表达式);
5.4.3 for循环
- 最有效的循环结构
for(初始化;布尔表达式;更新){
}
for(int i=0;i<=100;i++){
}
//死循环
for(;;){}
- 九九乘法表
for (int i = 1; i <= 9; i++) {
//去掉重复项 k<=i
for (int k =1;k<=i;k++){
System.out.print(i+"*"+k+"="+(i*k)+"\t");
}
System.out.println();
}
-
增强for循环
-
主要用于数组和集合的遍历
int[] array = {1, 2, 3, 4, 5}; for (int i:array){ System.out.print(i+"\t"); } //结果 1 2 3 4 5
-
5.4.4 break 和 continue
-
break
-
会跳出循环,终止循环,整个循环
-
对与嵌套循环,只能跳出break的所在的一层循环。
-
如果想要跳出任意层的循环,需要再循环体上加上标签;
out: while (true){ while (true){ int i =0; if (i==0){ System.out.println("跳出"); break out; } } }
-
-
continue
- 跳出当前的这次循环,不执行本次循环后面的代码,但会继续执行下一次代码。
- 碰到它,就会回到循环的最开始。