JDK、JRE、JVM三者之间的关系?
JDK:Java开发工具箱
JRE:java运行环境
JVM:java虚拟机
初步理解java的加载与执行
java程序从编写到最终运行经历了哪些过程????
运行阶段
注意:java程序员直接编写的java代码(普通文本)是无法执行被JVM
识别的。java程序员编写的java代码这种普通文本必须经过一个编译,
将这个“普通文本代码”变成“字节码”,JVM能够识别“字节码”。
java代码这种普通文本变成字节码的过程,被称为:编译。
java代码这种普通文本被称为:java源代码。(你编写的代码是源代码)
源代码不能直接执行,需要先进行编译,生成源代码对应的“字节码”
JVM可以识别的是字节码。
放源代码的文件扩展名必须是:并且需要注意的是:编译生成的字节码文件扩展名是:
另外需要注意的是:
1个java源文件是可以编译生成多个class文件的。最终运行的是class文件。
问题:字节码文件是二进制文件吗?
字节码文件不是二进制文件。(乱码了)
如果是二进制的话,就不需要JVM了。
因为操作系统可以直接执行二进制。
标识符
标识符可以标识什么?
可以标识:
类名
方法名
变量名
接口名
常量名
…
5、标识符可以随意编写吗,有命名规则吗?有
什么是命名规则?
命名规则属于语法机制,必须遵守,不遵守命名规则标识不符合语法,
这样,编译器会报错。
变量
注意:在java语言中“数据”被称为“字面量”。
10
1.23
true
false
‘a’
“abc”
以上这些都是数据,在程序中都被叫做“字面量”。
字面量可以分为很多种类:
整数型字面量:1 2 3 100 -100 -20 …
浮点型字面量:1.3 1.2 3.14…
布尔型字面量:true、false没有其它值了,表示真和假,true表示真,false表示假
其中字符型和字符串型都是描述了现实世界中的文字:
需要注意的是:
所有的字符型只能使用单引号括起来。
所有的字符串型只能使用双引号括起来。
字符型一定是单个字符才能成为“字符型”
在语法级别上怎么区分字符型和字符串型?
主要看是双引号还是单引号。
单引号的一定是字符型。
双引号的一定是字符串型。
变量
变量其实就是内存当中存储数据的最基本的单元。
变量就是一个存储数据的盒子。
数据类型有什么用呢?
int这种整数类型,JVM会自动给int分配4个字节大小的空间。
1个字节=8个比特位
1个比特位就是一个1或0. 注意:比特位是二进制位。
int是占用多少个二进制位?1个int占有32个二进制位(bit位)
对于一个变量来说,包括三要素:
- 变量的数据类型
- 变量的名字
- 变量中保存的值
类型+名字+值
- 类型决定空间的大小。
- 起个名字是为了以后方便访问。(以后在程序中访问这个数据是通过名称来访问的。)
- 值是变量保存的数据。
变量必须先声明,再赋值才能访问。(没有值相当于这个空间没有开辟。)
“=”,这个运算符被称为赋值运算符。
赋值运算符“=”的运算特点是:等号右边先执行,执行完之后赋值给左边的变量。
变量的分类
数据类型
第一种:基本数据类型
基本数据类型又可以划分为4大类8小种:
第一类:整数型
byte,short,int,long (没有小数的)
第二类:浮点型
float,double (带有小数的)
第三类:布尔型
boolean:只有两个值true和false,true表示真,false表示假
第四类:字符型
char:java中规定字符型字面量必须使用单引号括起来。属于文字。
第二种:引用数据类型
字符串型String属于引用数据类型。
String字符串不属于基本数据类型范畴。
java中除了基本数据类型之外,剩下的都是引用数据类型。
byte类型最大值是:2的7次方 - 1.
(1个字节)byte: [-128 ~ 127]
(2个字节)short:[-32768 ~ 32767] 可以表示65536个不同的数字
(4个字节)int: [- ~ ]
(2个字节)char: [0~65535] 可以表示65536个不同的数字
类型转换
char
第一个结论:当一个整数赋值给char类型变量的时候,会自动转换成char字符型,最终的结果是一个字符。
第二个结论:当一个整数没有超出byte short char的取值范围的时候,这个整数可以直接赋值给byte short char类型的变量。
int
整数型的“字面量/数据”默认被当做int类型处理。
1、小容量可以直接赋值给大容量,称为自动类型转换。
2、大容量不能直接赋值给小容量,需要使用强制类型转换符进行强转。
但需要注意的是:加强制类型转换符之后,虽然编译通过了,但是运行
的时候可能会损失精度。
java中有一个语法规则:
当这个整数型字面量没有超出byte的取值范围,那么这个整数型字面量可以直接赋值给byte类型的变量。
这种语法机制是为了方便写代码,而存在的
byte、char、short做混合运算
混合运算
float
浮点型包括:
float 4个字节
double 8个字节
float和double存储数据的时候都是存储的近似值。
为什么?
因为现实世界中有这种无线循环的数据,例如:3.33…
数据实际上是无限循环,但是计算机的内存有限,用一个有限的资源
表示无限的数据,只能存储近似值。
long类型占用8个字节。
float类型占用4个字节。
哪个容量大?
注意:任意一个浮点型都比整数型空间大。
float容量 > long容量。
任何一个浮点型数据默认被当做double来处理。
Boolean
1、在java语言中boolean类型只有两个值,没有其他值:
true和false。
不像C或者C++,C语言中1和0也可以表示布尔类型。
- 第一条:八种基本数据类型中,除 boolean 类型不能转换,剩下七种类型之间都可以进行转换;
- 第二条:如果整数型字面量没有超出 byte,short,char 的取值范围,可以直接将其赋值给byte,short,char 类型的变量;
- 第三条:小容量向大容量转换称为自动类型转换,容量从小到大的排序为:byte < short(char) < int < long < float < double,其中 short和 char 都占用两个字节,但是char 可以表示更大的正整数;
- 第四条:大容量转换成小容量,称为强制类型转换,编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用;
- 第五条:byte,short,char 类型混合运算时,先各自转换成 int 类型再做运算;
- 第六条:多种数据类型混合运算,各自先转换成容量最大的那一种再做运算;
小案例
运算符
++
对于++运算符来说:
可以出现在变量前,也可以出现在变量后。
不管出现在变量前还是后,总之++执行结束之后,变量的值一定会自加1。
关系运算符
>= <= !=
所有的关系运算符的运算结果都是布尔类型,
不是true就是false,不可能是其他值。
在java语言中:
= : 赋值运算符
== :关系运算符,判断是否相等。
逻辑运算符
& 逻辑与(可以翻译成并且)
| 逻辑或(可以翻译成或者)
! 逻辑非(取反)
&& 短路与
|| 短路或
非常重要:
逻辑运算符两边要求都是布尔类型,并且最终的运算结果也是布尔类型。
这是逻辑运算符的特点。
短路与&& 和 逻辑与 &有什么区别?
首先这两个运算符的运算结果没有任何区别,完全相同。
只不过“短路与&&”会发生短路现象。
什么时候使用&&,什么时候使用& ?
从效率方面来说,&&比&的效率高一些。
因为逻辑与&不管第一个表达式结果是什么,第二个表达式一定会执行。
以后的开发中,短路与&&和逻辑与还是需要同时并存的。
大部分情况下都建议使用短路与&&
只有当既需要左边表达式执行,又需要右边表达式执行的时候,才会
选择逻辑与&。
赋值运算符
扩展的赋值运算符?(永远都不会改变运算结果类型)
+=
-=
*=
/=
%=
条件运算符java 基础大全
执行原理是什么?
布尔表达式的结果为true时,表达式1的执行结果作为整个表达式的结果。
布尔表达式的结果为false时,表达式2的执行结果作为整个表达式的结果。
+ 运算符
1、+ 运算符在java语言中有两个作用。
作用1:求和
作用2:字符串拼接
2、什么时候求和?什么时候进行字符串的拼接呢?
当 + 运算符两边都是数字类型的时候,求和。
当 + 运算符两边的“任意一边”是字符串类型,那么这个+会进行字符串拼接操作。
3、一定要记住:字符串拼接完之后的结果还是一个字符串。
测试题
控制语句
if
if(布尔表达式){ // 分支1
java语句;
}else{ // 分支2
java语句;
}
switch
switch语句支持的值有哪些?
支持int类型以及String类型。
但一定要注意JDK的版本,JDK8之前不支持String类型,只支持int。
在JDK8之后,switch语句开始支持字符串String类型。
witch语句中“值”与“值1”、“值2”比较的时候会使用“==”进行比较。
for
1 2 4
for(初始化表达式; 条件表达式; 更新表达式){
3
循环体; // 循环体由java语句构成
java语句;
java语句;
java语句;
java语句;
…
}
while
while循环:
1、while循环的语法机制以及执行原理
语法机制:
while(布尔表达式){
循环体;
}
执行原理:
判断布尔表达式的结果,如果为true就执行循环体,
循环体结束之后,再次判断布尔表达式的结果,如果
还是true,继续执行循环体,直到布尔表达式结果
为false,while循环结束。
2、while循环有没有可能循环次数为0次?
可能。
while循环的循环次数是:0~n次。
do…while
语法机制:
do {
循环体;
}while(布尔表达式);
执行原理:
先执行循环体当中的代码,执行一次循环体之后,
判断布尔表达式的结果,如果为true,则继续执行
循环体,如果为false循环结束。
对于do…while循环来说,循环体至少执行1次。循环体的执行次数是:1~n次。
对于while循环来说,循环体执行次数是:0~n次。
break
3、break;语句可以用在哪里呢?
用在两个地方,其它位置不行
第一个位置:switch语句当中,用来终止switch语句的执行。
用在switch语句当中,防止case穿透现象,用来终止switch。
第二个位置:break;语句用在循环语句当中,用来终止循环的执行。
用在for当中
用在while当中
用在do…while…当中。
5、break;语句的执行并不会让整个方法结束,break;语句主要是用来终止离它最近的那个循环语句。
continue
、continue语句的作用是:
终止当前"本次"循环,直接进入下一次循环继续执行。
for(){
if(){ // 当这个条件成立时,执行continue语句
continue; //当这个continue语句执行时,continue下面的代码不执行,直接进入下一次循环执行。
}
// 以上的continue一旦执行,以下代码不执行,直接执行更新表达式。
code1;
code2;
code3;
code4;
}
方法
方法是一段可以完成某个特定功能的并且可以被重复利用的代码片段。方法的出现,让代码具有了很强的复用性。
程序开始执行的时候是先执行main方法。因为main方法是一个入口。
在java语言中所有的方法体中的代码都必须遵循自上而下的顺序依次逐行执行。这个必须记住。
main方法不需要程序员手动调用,是由JVM调用的。
但是除了main方法之外其他的方法,都需要程序员
手动调用,方法只有调用的时候才会执行,方法不调用是不会执行的。
方法定义
关于修饰符列表:
修饰符列表不是必选项,是可选的。
关于返回值类型:
第五:只要有“return”关键字的语句执行,当前方法必然结束。
return只要执行,当前所在的方法结束,记住:不是整个程序结束。
第六:如果返回值类型是void,那么在方法体当中不能有“return 值;”这样的
语句。但是可以有“return;”语句。这个语句“return;”的作用就是用来终止当前
方法的。
第七:除了void之外,剩下的都必须有“return 值;”这样的语句。
形式参数列表
简称:形参
注意:形式参数列表中的每一个参数都是“局部变量”,方法结束之后内存释放。
形参的个数是:0~N个。
形参的个数是:0~N个。
public static void sumInt(){}
public static void sumInt(int x){}
public static void sumInt(int x, int y){}
public static void sum(int a, int b, double d, String s){}
形参有多个的话使用“逗号,”隔开。逗号是英文的。
形参的数据类型起决定性作用,形参对应的变量名是随意的。
方法体:
在方法体中处理业务逻辑代码的时候需要数据,数据来源就是这些形参。
方法定义之后怎么调用呢?
方法必须调用才能执行。
怎么调用,语法是什么?
类名.方法名(实际参数列表);
实参和形参的类型必须一一对应,另外个数也要一一对应。
在方法调用的时候,什么时候“类名.”是可以省略的。什么时候不能省略?
a()方法调用b()方法的时候,a和b方法都在同一个类中,“类名.”可以省略。如果不在同一个类中“类名.”不能省略。
任何一个方法体当中的代码都是遵循自上而下的顺序依次逐行执行的。
方法区最先有数据:方法区中放代码片段。存放class字节码。
栈内存:方法调用的时候,该方法需要的内存空间在栈中分配。
方法不调用是不会在栈中分配空间的。
方法只有在调用的时候才会在栈中分配空间,并且调用时就是压栈。
方法执行结束之后,该方法所需要的空间就会释放,此时发生弹栈动作。
栈中存储什么?方法运行过程中需要的内存,以及栈中会存储方法的局部变量。
break;语句和return;语句有什么区别?
不是一个级别。
break;用来终止switch和离它最近的循环。
return;用来终止离它最近的一个方法。
方法重载
什么时候代码会发生方法重载?
条件1:在同一个类当中
条件2:方法名相同
条件3:参数列表不同
参数的个数不同算不同
参数的类型不同算不同
参数的顺序不同算不同
注意:
方法重载和方法的“返回值类型”无关。
方法重载和方法的“修饰符列表”无关。
方法溢出
2、当递归时程序没有结束条件,一定会发生:
栈内存溢出错误:StackOverflowError
所以:递归必须要有结束条件。(这是一个非常重要的知识点。)
JVM发生错误之后只有一个结果,就是退出JVM。
3、递归假设是有结束条件的,就一定不会发生栈内存溢出错误吗?
假设这个结束条件是对的,是合法的,递归有的时候也会出现栈内存溢出错误。
因为有可能递归的太深,栈内存不够了。因为一直在压栈。
4、在实际的开发中,不建议轻易的选择递归,能用for循环while循环代替的,尽量
使用循环来做。因为循环的效率高,耗费的内存少。递归耗费的内存比较大,另外
递归的使用不当,会导致JVM死掉。
(但在极少数的情况下,不用递归,这个程序没法实现。)
所以:递归我们还是要认真学习的。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/4373.html