一、java的基本流程
1.1、java语言特性
- 简单性
- 面向对象可移植性
- 健壮性(自动垃回收机制,GC)
- 多线程
1.2、java的加载与执行过程
1、编译阶段:
- 首先,我们先创建一个java源文件xxx.java
- 经过javac.exe编译(如果源文件没有语法错误),生成一个或多个.class文件,注意的是此时的字节码文件不是二进制的,无法在操作系统上执行。
2、运行阶段:
- 当我们在命令窗口输入 java 类名 命令时,java.exe命令会启动JVM,JVM会启动类装载器ClassLoader.
- ClassLoader(即类装载器)会去硬盘上查找字节码文件,然后将查找到的.class字节码文件装载到JVM中。
- JVM再将.class字节码文件解释成二进制10001000这样的数据
- 然后操作系统会执行二进制和底层操作系统进行交互。
- 这样java的加载与执行就完成了
1.3、java内存主要划分
java的内存需要划分成五个部分:
-
栈(Stack):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。
1、局部变量:方法的参数,或者是方法{}内部的变量
2、作用域:一旦超出作用域,立从栈内存当中消失。 -
堆(Heap):凡是new出来的东西,都在堆当中。
1、堆内存里面的东西都有一个地址值:16进制
2、堆内存里面的数据,都有默认值。规则:
如果是整数类型:那么默认值为0
如果是浮点类型:那么默认值为0.0
如果是字符类型:那么默认值为\u0000
如果是布尔类型:那么默认值为false
如果是引用类型:那么默认值为null -
方法区(Method Area):存储.class相关信息,包含方法的信息。
-
本地方法栈(Native Method Stack):与操作系统相关。
-
寄存器(pc Register):与cpu相关。
二、java基本语法
2.1、变量、标识符、关键字、数据类型
1、变量
- 定义:在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值
- 注意:变量要先初始化以后才能使用
- 测试:编译报错;变量可以重复赋值但是不能重复声明
- 变量的作用域:变量的作用域分为四个级别:类级、对象实例级、方法级、块级;
1、类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习。类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化。
2、对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问。
3、方法级变量就是在方法内部定义的变量,就是局部变量。
4、块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了;如for、if语句块 - 变量作用域说明:
1、方法内部除了能访问方法级的变量,还可以访问类级和实例级的变量;
2、块内部能够访问类级、实例级变量,如果块被包含在方法内部,它还可以访问方法级的变量。
3、方法级和块级的变量必须被显示地初始化,否则不能访问
2、数据类型
- 基本数据类型:char、short、byte、int、long、float、double、boolean;字符串属于引用类型,因为String是一个类。
- 示例:字符是单引号初始化,字符串时双引号初始化
3、标识符
- Java 中标识符是为方法、变量或其他用户定义项所定义的名称。标识符可以有一个或多个字符。在 Java 语言中,标识符的构成规则如下:
1、标识符由数字(09)和字母(AZ 和 a~z)、美元符号($)、下划线(_)以及 Unicode 字符集中符号大于 0xC0 的所有符号组合构成(各符号之间没有空格)。
2、标识符的第一个符号为字母、下划线和美元符号,后面可以是任何字母、数字、美元符号或下划线。
3、Java 区分大小写,因此 myvar 和 MyVar 是两个不同的标识符
4、标识符命名时,切记不能以数字开头,也不能使用任何 Java 关键字作为标识符,而且不能赋予标识符任何标准的方法名
4、关键字
- 定义:关键字(或者保留字)是对编译器有特殊意义的固定单词,不能在程序中做其他目的使用。关键字具有专门的意义和用途,和自定义的标识符不同,不能当作一般的标识符来使用。
- 常用关键词:
1、数据类型:boolean、int、long、short、byte、float、double、char、class、interface。
2、流程控制:if、else、do、while、for、switch、case、default、break、continue、return、try、catch、finally。
3、修饰符:public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native。
4、动作:package、import、throw、throws、extends、implements、this、supper、instanceof、new。
5、保留字:true、false、null、goto、const。
2.2、运算符、控制语句
1、运算符
- 算术运算符:+、-、*、/、++、–、%(取余)
- 举例:下列代码中=的优先级要大于++;所以是先执行e=m,再执行m++
- 总结:++ 或者 – 出现在变量(m)的前面,则++ 或者 – 的优先级要大于=,先执行m++ 再执行 e = m;反之就先执行e = m,再执行m++
- 关系运算符:>、<、<=、>=、==、!= ; 运算结果一定是boolen类型
- 布尔运算符:&、|、!、^、&&(短路与)、||(短路或)
- 布尔运算规则:布尔运算符两边的算子都必须是布尔类型,整个布尔运算的最终结果也是一个布尔类型
- 短路与(&&)和逻辑与(&)的区别:判断结果一致,有假则为假,全真则为真(有假必假,全真为真);判断方式不一样,逻辑是从左到右全部判断,短路与是遇到false就停止
- 短路或(||)和逻辑或(|)的区别:判断结果一致,有真则为真,全假则为假(有真必真,全假为假);判断方式不一样,逻辑是从左到右全部判断,短路或是遇到true就停止
- 赋值运算符:=、+=、-=、*=、/=、%=
- 三目运算符: Boolen表达式?表达式1:表达式2;Boolen表达式为true就执行表达式1,为false就执行表达式2
- 示例:
2、控制语句
- 条件判断语句:if-else、switch
- 循环:for循环、while
- break:可以出现在循环里面,结束当前整个循环
- continue:结束此次循环,但不结束整个循环,可以继续沿着下一次循环进行
- return:结束当前整个函数的执行
2.3、java方法详解
1、方法重载必须满足下列条件
- 在同一个类中
- 方法名相同
- 参数列表不同
- 结论:方法重载和方法的返回类型和修饰符无关
2、方法执行的原理
- 方法在调用的时候实际就是在栈中分配空间,方法的调用本质上就是入栈,方法的结束就是出栈
- 栈溢出:当存在压栈时就会导致栈内存储溢出现象,俗称栈溢出;方法中一定要有结束条件,避免压栈现象
3、递归示例:求1-N的和
- 递归时一定要避免压栈现象产生
public static void main(String[] args) {
int sum = add(10);
System.out.println(sum);
}
public static int add(int n){
if(n == 1){
return 1;
}else{
return n + add(n-1);
}
}
- 执行结果: