cmd:先切盘-->进入目录-->进入.exe目录
1.java的重要指令
(1)javac:将源码编译成(ctrl+s时就自动编译了)字节码
(2)java:执行字节码
java是一种半编译半解释的编程语言
源代码(.java)--->字节码(.class)--->JVM(虚拟机)执行出结果--->windows/linux
javascrpt是一种解释型语言
源source(src)代码(.js)--->执行出结果
配置环境变量的目的:让环境变量中的指令可以在操作系统中任何位置执行
java的特性-跨平台(OS-操作系统)
jdk(开发工具包){ jre(运行环境 { jvm( 虚拟机 ) })}
2.java的三个平台
javase:java标准平台,java基础功能和内置API
javaee:java企业级平台,开发b/s架构应用一套API
javame:java移动平台,现在已经已经淘汰了
3.java的数据类型
(变量是一块内存的名字)
-
java是一种强类型的编程语言:声明变量时,必须声明数据类型,且未来不允许再改类型
-
js是一种弱类型编程语言:变量没有数据类型的概念,且变量在使用过程中可以改变类型
java数据类型分为两大类
-
一. 引用数据类型(默认值为null)
-
二. 基本数据类型(涉及到默认值)
-
1.整形:
-
byte占一字节 (1byte=8bit [-2^8, 2^8) )
-
short占两个字节 (2byte=16bit [-2^15,2^15) )
-
int占四个字节 (4byte=32bit [-2^31, 2^31) )
-
long占八个字节 ( 8byte=64bit [-2^63, 2^63) ) L:long类型标志
-
计算机常用进制:
-
二进制(0b): 转换十进制-->按位的倒序求幂和
-
八进制(0): 八进制的一位是二进制的三位
-
十进制(_): 十进制转换直接除所转换的相应位取余,从下向上取结果
-
十六进制(0x): 十六进制的一位是二进制的四位
-
2.浮点数:
-
double:8个字节,默认类型
-
flort: 4个字节
-
3.字符类型:
-
char: 2个字节,'啊',‘A’
-
4.布尔类型:
-
boolean:1个字节,true、false(不参与任何数据转换)
-
转换规则:
-
小的自动转换成大的:byte-->short-->int-->long
-
整数可以自动转换成浮点数:float-->double (int/long-->float/double 有精度丢失的可能)
-
char可以自动转换成int类型,得到字符对应的unicode(A-65,a-97) ,ASC是Unicode的子集(不包含东亚文字)
-
布尔类型不参与任何数据转换
-
char可以赋值 char c= ‘\u0041’(10转换成16进制) -->输出A
-
强制转换:按照自动转换规则反向操作
-
(1)浮点数转换成整数,损失小数部分的精度
-
(2)大取值范围-->小取值范围, 强制转换
-
(3)(char)int--->char :得到数字对应的字符
-
(4)布尔类型不参与任何数据转换
4.操作符(运算符)
-
算数运算符:+,-,*,【/(整数间的除法取整) ---%(取余)----除数不能为零】
-
赋值运算符:=(将右侧赋值给左侧),+=,-=......(自动类型转换)
-
比较运算符:< , >, ==,!=(结果为布尔类型的值),instanceof--判断某个对象是否是某个类的实例
-
单目运算符:(++a:先+1再参与运算, a++:先参与运算再+1 都是自增如果独立成句他俩没区别),--a, a--
-
逻辑运算符:&&\&(两者都为真才为真),|| \ |(一者为真就为真),!(取反)
-
位运算符:&,|,^
-
三目运算符
5.程序的结构控制
(1) 条件控制
执行某段代码之前,先检查是否满足某些条件
(a) 独立条件控制
-
某条件(逻辑表达式)成立,执行代码;不成立什么都不做
-
if(逻辑表达式){
-
//逻辑成立时需要执行的程序
-
}
-
//逻辑表达式为true时,执行{}中的代码
-
//逻辑表达式为false时,越过{}执行后续代码
(b) 互斥条件控制
-
如果...否则...,其中进入其中的某一个分支执行
-
if(逻辑表达式){
-
//逻辑成立时需要执行的程序
-
}else{
-
//逻辑不成立时需要执行的程序
-
}
(c) 多互斥条件控制
-
程序会执行第一个“逻辑表达式”为true的分支
-
if(逻辑表达式A){
-
...
-
} else if(逻辑表达式B){
-
...
-
} else if(逻辑表达式C){
-
...
-
} ...
-
else{
-
...
-
}
(d) switch句式 (了解)
-
switch句式只能判断“点状分布”的条件,不能进行“区间分布”条件的判断
-
仅支持byte,short,int,String,char几种类型
(2) 循环控制
某段代码或某段代码结构需要多次反复执行
(a) 前置条件循环
-
当“某个条件”成立时,反复执行循环的代码,直至条件不成立
-
while(逻辑表达式){
-
//逻辑成立时需要执行的程序
-
//循环代码中应该有使逻辑表达式变成false的代码
-
// 或者通过中断结束循环,否则可能产生“死循环”
-
}
(b) 后置条件循环(了解)
-
do{
-
}while(逻辑表达式);
-
区别: while,先判断条件,再执行循环,循环可能一次不执行
-
do...while, 先执行循环,再判断条件,循环至少执行一次
(c) for循环(次数循环)
-
有明确次数的循环,有明确循环区间的循环。
-
for(初始化控制信号①; 信号的循环条件②; 信号值的变化④){
-
循环代码③
-
}
-
①②③④ -> ②③④ -> ②③④ ->... -> ②(false)
(d) 循环的中断
-
break: 中止整个循环,后续轮次全部不执行了
-
continue: 轮空当前轮次,继续执行后续轮次
-
(e) 循环的嵌套
-
循环嵌套:尝试两个循环数字的组合
-
break只能中止所在的循环,如果中止的是内部循环,外部仍然继续
6.数组
-
数组的声明与实例化
-
用一个变量来描述一组同类型数据
-
所有数组均是引用数据类型
-
数组是最基础的“数据结构”:同数据类型,定长(声明时给定长度<最大存储量>),在内存中连续分布
-
声明:int[] a */ int a[]
-
实例化:必须直接或间接的声明数组的长度
-
int[] a={1,2,3,4,5};
-
int[] a=new int[5];
-
语法糖:{1,2,3,4,5}
-
-
2. 数组的内存模型(基本数据类型与引用数据类型的区别)
-
3. 数组操作的内置API
-
a.length 得到数组变量的长度
-
Arrays工具类,包含了一些关于数组操作的方法
-
Arrays.toString(a); 将数组数据转换成字符串形式
-
Arrays.sort(a); 将数组数据进行自然排序(升序),内部使用“快速排序法”
-
Arrays.binarySearch(a, key); 在数组a中利用二分查找,寻找key的位置,前提数组必须先经过排序
-
7.方法
-
方法的声明
-
访问权限修饰符 [限定修饰符] +返回值类型 +方法名(形参:参数列表,,,,,){ 方法体 }
-
public static void main(String[]arrgs){
-
方法体
-
return 返回值;
-
-
}
-
2. 方法的调用
-
通过 ”方法名(提供参数)“调用方法执行方法的逻辑
-
如果方法有返回值,需要利用一个同类型的变量进行接收
-
如果方法没有返回值,不需变量接收,直接调用即可
-
3. 方法的参数(形式参数和实际参数)
-
形式参数:形参,声明方法时,参数列表中的变量
-
实际参数:实参,调用方法时,提供给方法的实际数据
-
4. 方法的重载(重要)
-
将一个同名的方法,定义多次。
-
要求方法名一致,但参数列表必须不一致。
-
(1)参数的个数不同
-
(2)参数的类型不同
-
(3)参数的类型顺序不同
-
重载与返回值类型无关
-
重载还有其他名字: overload, 编译时多态。
-
5. 方法调用的值传递(非常重要)
-
每调用一次方法,在栈中新建一个”栈帧“入栈
-
当一个方法执行完毕后,从栈中出栈
-
正在的执行的方法一定是在栈顶
-
6. 方法的递归
-
一个方法调用自身
-
思路:将一个复杂问题拆解成多个步骤相似的小问题
-
5!= 5*4*3*2*1
-
5! = 5*4!
-
条件1: 推导公式(递归的前进公式)
-
n! = n*(n-1)! //递归的前进公式
-
func(n) = n * func(n-1)
-
条件2:递归的边界
-
1! = 1
-
func(1) = 1
-
练习:第1个人他有2支笔
-
第2个人是第1个人2倍多1个
-
第3个人是第2个人2倍多1个
-
第6个人有多少支笔
-
f(1) = 2
-
f(2) = 2*f(1) + 1
-
f(3) = 2*f(2) + 1
-
...
-
f(n) = 2*f(n-1) + 1
-
斐波拉契数列: 1, 1, 2, 3, 5, 8, 13...
-
f(n) = f(n-2) + f(n-1)
-
f(1) = 1
-
f(2) = 1