JVM、JRE和JDK的区别

JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。
              java语言是跨平台,jvm不是跨平台的。
JRE(Java Runtime Environment):java的运行环境,包括jvm+java的核心类库。    
JDK(Java Development Kit):java的开发工具,包括jre+开发工具

Java中的关键字和保留字(共53个)

一、概念

Java关键字(Key Word): 对Java的编译器有特殊的意义,他们用来表示一种数据类型或者表示程序的结构.

保留字(Reserve Word):即它们在Java现有版本中没有特殊含义,以后版本可能会作为有特殊含义的词,或者该词虽然在Java中没有特殊含义,以后版本也不打算使用,但在其它语言中有特殊含义,不宜在Java中定义为变量名称等,因为容易混淆。

注意:关键字和保留字均不能用作变量名、方法名、类名、包名和参数。

二、具体的保留字

goto、const

三、具体的关键字(51个)

1.访问修饰符(3个)

public、protected、private

作用:用来修饰类(接口、抽象类)、方法、属性、构造方法、常量、主函数

2.类、接口、抽象类(9个)

class、interface、abstract——定义

extends——继承类、implements——实现接口

new——新建一个对象、super——调用父类方法、this——指代当前对象

instanceof——通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

3.数据类型(13个)

void——没有返回值

byte、short、int、long——整型数据

float、double——浮点型数据

char——字符型数据

boolean——判断型数据

enum——枚举

null、true、false——值类型

4.线程(2个)

synchronized——线程同步(修饰方法、代码块,方法、代码块的同步)

volatile——线程同步(修饰属性,属性的同步)

5.异常(5个)

throw——抛出方法代码中的异常给方法自身。使用位置:方法中间

throws——抛出方法中的异常给调用者。使用位置:方法外部

try——捕获{}中代码是否有发生异常

catch——处理try捕获的异常

finally——不管有没有异常发生都会执行的代码块

6.返回(1个)

return

7.循环、条件(10个)

if、else、switch、case、break、default、continue、while、do、for

8.包(2个)

package、import

9.瞬时的(1个)

transient

10.断言(1个)

assert

11.调用底层代码(C\C++)(1个)

native

12、不可变的——final(1个)

修饰属性、常量、局部变量、参数——作用:数据是不可改变的

修饰类——作用:修饰的类不能被继承

修饰普通方法——作用:修饰的方法不能被重写

13.静态的——static(1个)

修饰属性、常量

修饰内部类

修饰普通方法

作用:所有使用static关键字修饰的内容会最先执行。static修饰的内容在内存中只有唯一的一份(存储在静态内存空间中)。

14.格式规范——strictfp(1个)

修饰类、接口或方法。

修饰方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。

修饰类或接口时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。

严格约束意味着所有表达式的结果都必须是 IEEE 754 算法对操作数预期的结果,以单精度和双精度格式表示。

常用的dos命令:

盘符切换:
		盘符号(不区分大小写):
罗列当前盘符下或者某个目录下的所有的文件夹以及文件的详情信息:dir	(日期时间  文件夹(DIR)/文件名称 )
基础命令
					创建文件夹/目录: md(make directory)  文件夹/目录的名称
					切换目录名称(进入单级目录):cd(change directory)  文件夹名称
					回退上一级目录:cd ..(单级目录)
					进入多级目录: cd D:\JavaEE_2008\day01\code
					直接从多级目录中回退根目录:cd \
					cls:(clear screen) :清屏命令
					删除目录(目录必须为空:)rd 文件夹名称(删除目录)	
					ipconfig:查看当前本地ip地址
					ping 其他计算机的ip地址 :查看本机与其他计算机的通信是否成功
扩展命令	
				在某个盘符或者目录下创建文件
				copy con 文件名称 (回车)
				输入文件的内容 ctrl+z (结束) 回车:复制文件
				copy con a.txt
				hello,java^Z
				已复制         1 个文件。	
				rd /s 目录名称 : 可以删除带内容的目录,询问是否删除
				rd  /s /q 目录名称: 暴力删除(不询问直接删除掉,不建议使用!)
				del 删除文件的命令: 
				del 文件名称(带后缀):删除单个文件
				del *.txt(批量删除所有带后缀名为.txt的文件)

path环境变量的配置

1)将jdk安装目录的bin目录路径作为path变量中的某个变量直接引用!
2)系统变量:
			变量名:JAVA_HOME
			变量值:Jdk的安装目录
			在path:引入JAVA_HOME变量
			%JAVA_HOME%\bin

注释: 提高代码阅读性

注释的划分:
	1)单行注释    以双斜杠“//”标识,只能注释一行内容,用在注释信息内容少的地方。
	2)多行注释    包含在“/*”和“*/”之间,能注释很多行的内容。为了可读性比较好,一般                首行和尾行不写注释信息(这样也比较美观好看)
	             注意:多行注释可以嵌套单行注释,但是不能嵌套多行注释和文档注释。
	3)文档注释   包含在“/**”和“*/”之间,也能注释多行内容,一般用在类、方法和变量上面,用来描述其作用。
	             注意:文档注释能嵌套单行注释,不能嵌套多行注释和文档注释,一般首行和尾行也不写注释信息。
	             文档注释可以通过 Javadoc 命令把文档注释中的内容生成文档,并输出到 HTML 文件中,方便记录程序信息。还可以包含一个或多个 @ 标签,每个 @ 标签都在新的一行开始。

标识符

- 标识符:给类,接口,变量以及方法等起名字的字符序列! (见名知意)
 - 常见命名规则(见名知意)
(1)包(文件夹)解决相同类名的问题,全部小写
         单级:abc
			多级:cn.itcast
(2)类或接口
        一个单词:单词的首字母必须大写
				举例:Student,Dog
			多个单词:每个单词的首字母必须大写
				举例:HelloWorld,StudentName
(3)方法和变量
(4)常量

 - 给常量的命名规则:
			1)一个单词: 字母全部大写
				举例:		"HEELO"
					
			2)多个单词:每个单词字母全部大写,单词和单词之间使用下划线隔开
				举例
							"HELLO_WORLD"
 - 标识符的组成规则:
		1)数字字符
		2)英文大小写字母
		3)_和$符号
		注意事项:
				1)数字不能开头
				2)Java严格区分大小写
				3)起名字:给类,变量等,不能是Java中的关键字

常量

常量:在程序的执行过程中,其值不发生改变的量!
分为两大类:
	1)字面值常量
			 字符串常量
					使用双引号括起来的内容
			 字符常量
					使用单引号括起来的单个内容
			 整数常量:
					整数:默认十进制数据
						进制---整数常量范畴!
			 小数常量
			 布尔常量
			 空常量:null
	 2)自定义常量(后面:面向对象部分讲解)  关键字:final有关
	  定义常量:final 类型 大写常量名 = 常量值
      常量命名规范:字母全部要大写,如果这个名字由多个单词组成,单词之间用_隔开
     注意:  ASCII码表:'A' -- 65 	大写字母字符
     	    ASCII码表:'0' -- 48     数字字符
     	    ASCII码表: 'a' -- 97   小写字母字符

变量

- 变量:是指没有固定的值,可以改变的数
 - 变量的三要素:
	1)数据类型
	2)变量名(遵循标识符的规则)
	3)初始化值
 - 定义变量的注意事项:
	1)给变量命名的时候:见名知意
	2)变量尽量给一个初始化值,或者在使用之前给定一个初始化值
		如果使用之前都没有初始化,报错(在方法定义中变量:局部变量)
	3)Java是一种强类型语言,规定了同一个变量名不能定义多次(提示:已经定义了!)
	4)定义变量的时候,书写格式
		数据类型 变量名 = 初始值 ;  (分号一定要带,表示语句结束!)
		在同一行上,一般定义一个变量
	
 - Java中数据类型划分:(重点)
      A)基本数据类型:四类8种
				整数类型:(默认int),
				byte:字节类型	占1个字节		取值范围;-128~127(考点)   
				short:短整型	占2个字节
				int:整数 		占4个字节
				long:长整型     占8个字节    
			浮点类型:(默认double)
				单精度:float    :占4个字节
				双精度:double   :占8个字节
			字符类型
				char:          占2个字节
			布尔类型
				boolean		   占1个字节
	    B)引用数据类型:数组,接口,类(具体类,抽象类) 
 - 定义long类型的注意事项:
		需要在当前变量值的加上标记:L或者l(建议大写L):描述当前变量是长整型
		long类型---------------->系统时间(精确到毫秒),时间.....
 - 定义float类型的注意事项:
		在变量值的后面标记当前是一个单精度变量:F/f
 - 使用变量注意事项:
(1)作用域	
变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两个同名变量。
(2)初始化值
没有初始化值不能直接使用
(3)在一行上建议只定义一个变量
可以定义多个,但是不建议

数据转换

- 变量在进行运算的时候,需要保证变量的类型一致:最终使用的该数据类型接收即可!
 - 在运算的时候,变量的数据类型不一致的情况:
***隐式类型提升:***
 - 从小到大   byte,short,char—int—long—float—double
 - byte,short,char,三者之间互相不转换,一旦他们参与运算,***数据类型优先提升int类型***
 - boolean 类型不进行数据转换(判断去使用)
 ***强制类型转换***
 
 - 从大的数据类型到小的数据类型
 - Java中强制类型转换的书写格式:
	**目标数据类型 变量名 = (目标数据类型)初始化值;**	
	注意:
		不要随意使用,除非一些业务需求必须使用的时候才能用!
		强制类型:会损失数据的精度
		a. 容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精   度降低或溢出;使用时要格外注意。
        b. 有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。

 - 变量相加:必须考虑 数据类型的问题 (Java中的隐式类型提升:)
 - 常量相加:将常量进行运算----->运算之后看其结果是否在接收数据类型的范围之内!
强制转换经典示例:  
                    byte b = 130;有没有问题?
                    分析过程:运行时,你会发现出现类型不匹配的问题,那么可以使用强制类型转换:                    
                    byte b = (byte) 130;
    那么如何求解呢?我们知道,计算机运算都用的是数据的补码,要得到补码,就需要求出数据的二进制.
       A:获取130这个数据的二进制。 00000000 00000000 00000000 10000010 这是130的原码,也是反码,还是补码。
       B:做截取操作,截成byte类型的了。 10000010 这个结果是补码。 
       C:已知补码求原码。 符号位 数值位 补码: 1 0000010
                                      反码: 1 0000001
                                      原码: 1 1111110
       由此可得该数据类型转换后,其值为-126

关于+

1)表示数据是一个正整数
2)表示算术运算符中的加法运算
3)字符串拼接符号
注意:字符串+(拼接符号)任何数据= 新的字符串

Java中运算符:

算术运算符

- 基本的算术运算符
		+,-,*,/(默认:取值),%(取模:求余数)
		注意:     a*1.0/b   默认:取整
 - 扩展的算术运算符:
		++
		--
	分两种情况:
		1)单独使用
			结论:
		    无论++还是--在变量前面还是后面:都是对当前该变量值进行自增1或者自减1
			应用场景:结合流程控制语句之循环语句去使用!  
			  
		2)参与运算使用
		
			如果++或者--在变量前面,先自增1或者自减1,然后运算!
			如果++或者--在变量后面,先运算(赋值),然后在自增1或者自减1

赋值运算符

- 基本的赋值运算符 = 
 - 注意事项:
	  =不能写成==:表示比较运算符 ==连接表达式最终true/false		
 - 扩展的赋值运算符(细节)
	  +=,*=,-=,/=,%= **隐藏了强制类型转换!**

比较(关系)运算符

比较运算符---关系运算符
	>,<,>=,<=,==,!=
	变量x范围: 
			数学表达式:  2<=x<=35
			Java表表达式:
						x>=2 &&(逻辑运算符) x<=35
							 || (逻辑运算符)					
	比较运算符:连接的表达式无论是简单还是复杂的,最终结果要么true要么false
	注意事项:    ==不能写成=

逻辑运算符 (使用居多)

- 基本的逻辑运算符:
				逻辑单与 &  (并列关系)
						结论:有false,则false
				逻辑单或 | (或关系:有一个满足条件就成立了)
						 结论:有true,则true							
				逻辑异或 ^
						结论:相同则为false,不同则为true				
				逻辑非   !
						非true,则false
						非false,则true						
						偶数个非,是当前结果本身!
			
 - 扩展的逻辑运算符
				逻辑双与: &&
				逻辑双或: ||
		特别:逻辑双与&& 和逻辑单与&的区别:
			共同点: 
					结论:有false,则false(有一个不满足条件,就false)	
			最大的区别:
					逻辑双与&& 连接的表达式:如果左表的表达式为false,右边就不执行了,
					有false,则false(短路效果)
		注意:逻辑双|| :如果连接的表达式左边为true,右边不执行(短路效果!)

位运算符(了解)

- 基本的运算符号
		  位与:&
		  位或:|
		  位异或:^		  
		  ~(反码:按位取反:全部1变0,0变1):
 - 移动符号
		左移:<<
				左移动,将最高符合位丢弃掉,在右边补齐0				
				特点:将<<符号左边的数据乘以2的移动次幂
		右移:>> :
		       右移动,如果最高符号位为0,左边补0,如果最高符号位为1,左边补齐1			   
			   特点:将>>符号左边的数据除以2的移动次幂 
		无符号右移:	>>>
				向右移动,无论最高符合位为0还是1,左边补0!	   
 - 位异或^特点:
		一个数据被另一个数据位异或两次,结果是它本身!
		例如:实现两个变量的结果进行交换?
			int a = 30 ;
			int b = 10 ;
			方式1:开发中:采用中间变量的方式
			         int temp  = a ; 
			         a = b ;
			         b = temp ;
			方式2:位异或运算符的特点:一个数据被另一个数据位异或两次,其值是它本身
		             a = a ^ b ; 
		             b = a ^ b ;
		             a = a ^ b ;
		    方式3:利用加减法实现两个变量之间的交换
		             a = a+b;
                     b = a-b;
                     a = a-b;
	   注意:位运算符号:连接的是两个具体的数据值----->具体的结果数据!
	           逻辑运算符号:连接的要么数值/要么表达式--->结果:true/false

三元(三目)运算符(使用居多)

三元运算符---三目运算符 	 	
           格式:
   	 		(表达式) ? 执行true的结果:执行false的结果
   		 	表达式:可以是简单的或者复杂的表达式------>true/false
   		 	执行流程: 			
   		 	1)先判断表达式是否成立,如果成立,执行true的结果 			
   		 	2)如果不成立,执行false的结果

键盘录入

为了让程序的数据更符合开发的数据
(1):导包
			格式:		import java.util.Scanner; 
			位置:		在class上面。
(2):创建键盘录入对象
			格式:		Scanner sc = new Scanner(System.in);
(3)通过对象获取数据	
			格式:		int x = sc.nextInt();  (录入int型数据)
			                String str=sc.nextLine();(录入字符串数据)
			                注意:在先录入int型数据,后录入字符串数据时,需要重新创建对象.

流程控制语句

顺序结构语句

  • 一旦进入main方法中(由Jvm 调用),从有效行开始依次从上往下执行!

选择控制语句if

- if语句的格式:

	第一种格式
	
		if(表达式){
				语句;
		}
		

 - 执行流程:

	判断表达式是否成立,如果是true,成立,执行语句;
	如果不成立,不执行!

 - if语句整体的注意事项:

			1)有if的地方需要有一对{}  
		    2)有{}的地方不能分号;
	

 - if语句整体的注意事项:

			1)有if的地方需要有一对{}  
					有{}的地方不能分号; 
			2)在一个方法中(main() )定义一个{xxxd代码}---->局部代码块 (了解)
					作用:限定局部变量的生命周期
					
			局部变量:在方法定义中的变量---->随着方法的调用完毕而消失!
			
				内存中:GC 垃圾回收器(自动回收这些对象或者变量)
- if格式1)应用场景:
		针对单个业务场景进行判断
if格式2:
	
	if(表达式){
		语句1;
	}else{
		语句2;
	}
	
执行流程:
	1)首先判断表达式是否成立,如果是true,执行语句1
	2)如果不成立,执行语句2;
if语句的第三种结构:
	
		if(表达式1){
			语句1;
		}else if(表达式2){
			语句2;
		...
		...
		...
		}else{
			语句n+1 ;
		}
		
执行流程:
	1)首先判断表达式1是否成立,如果成立,执行语句1,if语句结束!
	2)如果表达式1不成立,再次判断表达式2是否成立,如果成立,执行语句2,语句结束!
	3)如果上述表达式都不成立,就执行else中的语句,if语句结束!
	
应用场景:
	针对多种情况进行判断
if语句格式2的嵌套:
	
			if(表达式){
				//表达式成立
				if(表达式1){
						语句1;
				}else{
						语句2;
				}
			}else{
				//不成立
				if(表达式11){
					语句11;
				}else{
					语句22;
				}
			}
			
流程:
	首先判断外层if中表达式是否成立,
	如果成立,执行表达式2是否成立
			如果表达式2成立,执行语句1;否则,执行语句2;
	外层if中表达式不成立,就执行else中的语句
			首先判断表达式11是否成立,如果成立,执行语句11,
			否则执行语句22;
例如:求三个数据最大值
	使用if语句格式嵌套
		//定义一个变量max
		int max ;
		if( a > b){
			//a>b成立
			if(a > c){
					//a比c大
				max= a ;	
			}else{
				//c比a大
				max = c ;
			}
		}else{
			//不成立
			if(b > c){
				//b比c大
				max = b ;
			}else{
				//c比b大
				max = c ;
			}
		}
		System.out.println("三个数据中的最大值是:"+max) ;

选择控制语句switch

switch语句的格式
	
	switch(表达式){
	
	
		case 值1:
				语句1;
				break ;
		case 值2:
				语句2;
				break ;
				
		...
		...
		default:
				语句n;
				break ;
		
	
	}
	
执行流程:
		1)先判断表达式的值它和case语句值1,是否匹配
			如果匹配,执行语句1,遇见break ,switch语句结束了!
		2)如果值1不匹配,继续判断值2是否和表达式中的值是否匹配,如果匹配,执行语句2
				遇见break,switch语句结束!
		3)如果上面的所有case语句都不匹配,执行default语句,执行语句n,直接结束
switch(表达式)---->本身可以使用的类型:byte,short,char,int类型

 - switch语句使用的注意事项:
	1)switch语句中的case语句后面跟的常量值,不能跟变量!  
					对比:javascript:switch语句 中的case可以是常量也可以变量
	2)case语句中的break不能轻易省略,否则就会造成"case穿透"
				如果没有写break,跟下面case值不进行比较,直接运行语句,直到遇见break结束!
	3)switch中的default语句:书写位置默认是在末尾,但是它也可以在switch语句中的任何位置,但是不影响执行流程
				都需要先跟case中的值进行比较,如果都没有匹配,都需要执行default...	
				如果default在语句的末尾,break可以省略,如果在语句中的话,不建议省略break ;	
	4)关于switch语句的结束问题:
			1)遇见break (中断,结束的意思) ,switch语句结束
					break:属于跳转控制语句中一种:两种场景:switch中/循环语句中
			2)语句默认执行到末尾!

循环结构语句

for循环

for循环的格式:
		for(初始化语句;条件表达式;步长语句){
			  循环体语句;
		}	
执行流程:
	1)初始化语句给变量进行赋值,只执行一次
	2)判断这个条件表达式是否成立,
		如果成立,就执行循环体语句,在去执行步长语句 (++,--)
	3)再次判断条件表达式是否成立,如果成立,继续上面执行方式...
		...
		
		...
	4)一直循环到条件表达式不成立的时候,for循环结束!

拓展:Java中使用增强的for循环

格式:
 for(循环变量类型循环变量名称 : 要被遍历的对象){
                 循环体
}

while循环

- while循环的基本格式:
		while(判断条件语句) {
			循环体语句;
		}
 - 扩展格式:
		初始化语句;
	    while(判断条件语句) {
			 循环体语句;
			 控制条件语句;
		}
- 三种循环语句其实都可以完成一样的功能,也就是说可以等价转换,但还是有小区别的:
       •	do…while循环至少会执行一次循环体。
      •	for循环和while循环只有在条件成立的时候才会去执行循环体
 - 注意事项:
        •	写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环。
        •	如下代码是死循环
               •	while(true){}
               •	for(;;){}