单级和多级分别举例 包:liuyi,cn.itcast - 类或者接口
一个单词和和多个单词分别举例 类或者接口:Student,HelloWorld
方法和变量一个单词和和多个单词分别举例 方法和变量:name,main,studentName - 常量
一个单词和和多个单词分别举例 常量:MAX,STUDENT_MAX_AGE
注意: 1:对于单行和多行注释,被注释的文字,不会被JVM(java虚拟机)解释执行。 2:对于文档注释,是java特有的注释,其中注释内容可以被JDK提供的工具 javadoc 所解析, 生成一套以网页文件形式体现的该程序的说明文档。
Java中常量分类
字面值常量自定义常量字符串常量 用双引号括起来的内容
整数常量 所有整数
12,23
小数常量 所有小数
12.34,56.78
字符常量 用单引号括起来的内容
‘a’,’A’,’0’
布尔常量 较为特有,只有true和false
空常量 null
Java针对整数常量提供了4种表现形式
二进制 八进制 十进制 十六进制
进制概述
进制:就是进位制,是人们规定的一种进位方法。 对于任何一种进制–X进制,就表示某一位置上的数运算时是逢X进一位。二进制就是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。
变量概述
在程序执行的过程中,在某个范围内其值可以发生改变的量 理解:如同数学中的未知数
变量定义格式
数据类型 变量名 = 初始化值; 注意:格式是固定的,记住格式,以不变应万变
注意: 1:从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量使用前必须要先申请(声明),然后必须进行赋值(填充内容),才能使用。 变量的组成部分:数据类型,变量名,变量值 2:为什么要定义变量呢 用来不断的存放同一类型的常量,并可以重复使用
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间
注意: Java 各整数类型有固定的表数范围和字段长度,其不受具体操作系统的影响,以保证Java程序的可移植性。 Java语言的整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ ,如:
int i1 = 600; //正确 long l1 = 88888888888L; //必须加l否则会出错与整数类型类似,Java浮点类型有固定的表数范围和字段长度,不受平台影响。 Java 浮点类型常量有两种表示形式 十进制数形式,如: 3.14 314.0 科学记数法形式,如 3.14e2 3.14*10^2 Java 浮点型常量默认为 double 型,如要声明一个常量为 float 型,则需在数字后面加 f 或 F ,如:
double d = 12345.6; //正确 float f = 12.3f; //必须加f否则会出错char 型数据用来表示通常意义上的“字符” 字符常量为用单引号括起来的单个字符,例如:
char ch1= 'a'; char ch2='中';Java 字符采用 Unicode 编码,每个字符占两个字节,因而可用十六进制编码形式表示。注:Unicode是全球语言统一编码
boolean 类型适于逻辑运算,一般用于程序流程控制 。 boolean 类型数据只允许取值 true 或 false ,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。
作用域
变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两个同名变量。
初始化值
没有初始化值不能直接使用
在一行上建议只定义一个变量
可以定义多个,但是不建议
一行定义多个变量的两种情况:
int x = 10;int y = 20; int x,y; x = 10; y = 20; +是一个运算符, 我们应该能够看懂,做数据的加法。boolean类型不能转换为其他的数据类型默认转换
byte,short,char—int—long—float—double byte,short,char相互之间补转换,他们参与运算首先转换为int类型
强制转换
目标类型 变量名=(目标类型)(被转换的数据);
1:案例演示隐式转换
byte b = 10; int i = 100; System.out.println(b+i); //有问题 byte bb = b + i; System.out.println(bb); //没有问题 int j = b + i; System.out.println(j);2:刚才上面的那个例子不可以,但是,我们明明知道它就是在这个范围内,我就想赋值,怎么办? 用强制转换 目标数据类型 变量名 = (目标数据类型)(被转换的数据); 3:那么,我们到底用那种转换呢? 一般建议,最好不要随意使用强制类型转换,容易造成数据精度的损失。 (1)容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意。 (2)有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。
【面试题】
byte b1=3,b2=4,b; b=b1+b2; b=3+4;哪句是编译失败的呢?为什么呢? b=3+4 ,3和4都是常量,所以java在编译时期会检查该常量的和是否超出byte类型的范围。如果没有可以赋值。 b=b1+b2不可以,是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。
【思考题】 byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢? 原因:因为byte的范围是:-128到127。 而130不在此范围内,所以报错。 我们可以使用强制类型转换 : 结果为-126,为什么?
数据130默认是int类型的十进制数据 第一步十进制的130转换成二进制数据 1 0 0 0 0 0 1 0 第二步130是int类型是占4个字节的,所以在内存的表现形式是 00000000 00000000 00000000 10000010 做了截取后的结果为 10000010 通过观察最高位符号位是1,这是一个负数,因为在计算机中所有的数据都是以补码的形式出现的所以要算它的补码 原码:1 0000010 原码变反码,最高位符号位不变,其他数值位1变0,0变1得反码 反码:1 1111101 反码变补码就是反码加1得 补码;1 1111110 最终的看到的结果就是 1 1111110最高为是符号位不运算,数值为转化为十进制是64+32+16+8+4+2=126符号位负 所以为-126请写出下列程序结果
System.out.println('a'); System.out.println('a'+1); System.out.println("hello"+'a'+1); System.out.println('a'+1+"hello"); System.out.println("5+5="+5+5); System.out.println(5+5+"=5+5");结果: 注意: 1:在这里引入ASCII码表 2:任何数据和字符串进行操作,结果都是字符串类型。但是要注意运算的顺序。
1:运算 对常量和变量进行操作的过程称为运算。 2:运算符 对常量和变量进行操作的符号称为运算符 3:操作数 参与运算的数据称为操作数 4:用运算符把常量或者变量连接起来符号java语法的式子就可以称为表达式。 不同运算符连接的式子体现的是不同类型的表达式。
举例:
int a = 3 + 4;这是做了一个加法运算 +就是运算符,是算术运算符,我们还有其他很多的运算符 3,4就是参与运算的操作数据 3 + 4整体其实就是一个算数表达式
+的几种作用:
加法 正数 字符串连接符
除法的时候要注意一个问题:
整数相除,只能得到整数 要想得到小数,可以*1.0
/和%的区别
++和–的应用
单独使用效果相同 参与运算使用,在操作数的前后效果不同
1:基本小题目
int a = 10; int b = 10; int c = 10; a = b++; c = --a; b = ++a; a = c--; System.out.println(a); System.out.println(b); System.out.println(c);请分别计算出a,b,c的值
2:比较复杂的题目
int a = 4; int b = (a++)+(++a)+(a*10); System.out.println(b);结果:70
= , +=, -=, *=, /=, %= =为基本的赋值运算符,其他的为扩展的赋值运算符
如下操作写出结果 int a,b; a = b = 10; System.out.println(a); System.out.println(b); int a = 10; a += 20; System.out.println(a);+=加赋值 把左边和右边的结果赋值给左边。 注意:左边不能是常量
【面试题】
short s=1; s = s+1; short s=1; s+=1;上面两个代码有没有问题,如果有,那里有问题? 通过面试题引出+=运算符的特点: 有一个隐含的默认转换功能。 实际上等价于:
short s = 1; s+=1等价于 s=(s的数据类型)(s+1);注意:
比较运算符的结果都是boolean型,也就是要么是true,要么是false。比较运算符“==”不能误写成“=” 。“&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算; 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 “|”和“||”的区别同理,双或时,左边为真,右边不参与运算。
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
注意: &:有false则false |:有true则true ^:相同false,不同true !:非false则true,非true则false
&&,||和&以及|的区别 结果相同,但是有短路效果,一般建议使用&&,||
int x = 3;int y =4; System.out.println((x++ > 4) & (y++ > 5)); System.out.println(x); System.out.println(y); System.out.println((x++ > 4) && (y++ > 5)); System.out.println(x); System.out.println(y);看结果:总结相当于乘以或者除以2的多少次幂。
System.out.println(3 << 2); System.out.println(24 >> 2); System.out.println(24 >>> 2); System.out.println(-24 >> 2); System.out.println(-24 >>> 2);格式
(关系表达式)?表达式1:表达式2; 如果条件为true,运算后的结果是表达式1; 如果条件为false,运算后的结果是表达式2;
示例: 获取两个数中大数。
int x=3,y=4,z; z = (x>y)?x:y;//z变量存储的就是两个数的大数。键盘录入数据概述
我们目前在写程序的时候,数据值都是固定的,但是实际开发中,数据值肯定是变化的,所以,我准备把数据改进为键盘录入,提高程序的灵活性。
如何实现键盘录入数据呢?
导包(位置放到class定义的上面)
import java.util.Scanner;创建对象
Scanner sc = new Scanner(System.in);接收数据
int x = sc.nextInt();在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
流程控制语句分类
顺序结构 选择结构 循环结构
顺序结构概述
是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。 总的来说:写在前面的先执行,写在后面的后执行
顺序结构图
选择结构
也被称为分支结构。选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。Java语言提供了两种选择结构语句
if语句 switch语句
if语句有三种格式
if语句第一种格式:
if(关系表达式) { 语句体 }执行流程
首先判断关系表达式看其结果是true还是false 如果是true就执行语句体 如果是false就不执行语句体
if图1
注意事项
关系表达式无论简单还是复杂,结果必须是boolean类型 if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,就不能省略。建议永远不要省略。 一般来说:有左大括号就没有分号,有分号就没有左大括号
if语句第二种格式:
if(关系表达式) { 语句体1; }else { 语句体2; }执行流程
首先判断关系表达式看其结果是true还是false 如果是true就执行语句体1 如果是false就执行语句体2
if图2
我们前面讲解过三元运算符,它根据比较判断后,给出的也是两个结果,所以,这种情况和if语句的第二种格式很相似,他们在某些情况下应该是可以相互转换的。
if语句第二种格式和三元运算符
三元运算符的操作都可以使用if语句改进,反之不成立 什么时候不成立呢? 当if语句控制的语句体是一条输出语句的时候,就不成立。因为三元运算符是一个运算符,必须要求有一个结果返回。而输出语句却不能作为一个返回结果。
if语句第三种格式:
if(关系表达式1) { 语句体1; }else if (关系表达式2) { 语句体2; } … else { 语句体n+1; }执行流程
首先判断关系表达式1看其结果是true还是false 如果是true就执行语句体1 如果是false就继续判断关系表达式2看其结果是true还是false 如果是true就执行语句体2 如果是false就继续判断关系表达式…看其结果是true还是false … 如果没有任何关系表达式为true,就执行语句体n+1。
if图3
switch语句格式:
switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; … default: 语句体n+1; break; }格式解释
switch表示这是switch语句
表达式的取值:byte,short,int,char JDK5以后可以是枚举 JDK7以后可以是String
case后面跟的是要和表达式进行比较的值
语句体部分可以是一条或多条语句
break表示中断,结束的意思,可以结束switch语句
default语句表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似。
执行流程
首先计算出表达式的值 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
switch语句图
注意事项
case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
default可以省略吗?
可以省略。一般不建议。除非判断的值是固定的。(单选题)
break可以省略吗?
可以省略,一般不建议。否则结果可能不是你想要的
default的位置一定要在最后吗?
可以出现在switch语句任意位置。
switch语句的结束条件
遇到break 执行到程序的末尾
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。
循环语句的组成
初始化语句: 一条或者多条语句,这些语句完成一些初始化操作。 判断条件语句: 这是一个boolean 表达式,这个表达式能决定是否执行循环体。 循环体语句: 这个部分是循环体语句,也就是我们要多次做的事情。 控制条件语句: 这个部分在一次循环体结束后,下一次循环判断条件执行前执行。通过用于控制循环条件中的变量,使得循环在合适的时候结束。
for循环语句格式:
for(初始化语句;判断条件语句;控制条件语句) { 循环体语句; }执行流程
A:执行初始化语句 B:执行判断条件语句,看其结果是true还是false 如果是false,循环结束。 如果是true,继续执行。 C:执行循环体语句 D:执行控制条件语句 E:回到B继续
for循环语句图
注意事项
判断条件语句的结果是一个boolean类型 循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。 一般来说:有左大括号就没有分号,有分号就没有左大括号
while循环语句格式:
基本格式
while(判断条件语句) { 循环体语句; }扩展格式
初始化语句; while(判断条件语句) { 循环体语句; 控制条件语句; }while循环语句格式图
for循环语句和while循环语句可以等价转换,但还是有些小区别的
使用区别:控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。场景区别:
for循环适合针对一个范围判断进行操作 while循环适合判断次数不明确操作
do…while循环语句格式:
基本格式
do { 循环体语句; }while((判断条件语句);扩展格式
初始化语句; do { 循环体语句; 控制条件语句; } while((判断条件语句);do…while循环语句图:
三种循环语句其实都可以完成一样的功能,也就是说可以等价转换,但还是有小区别的:
do…while循环至少会执行一次循环体。 for循环和while循环只有在条件成立的时候才会去执行循环体
注意事项:
写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环。 如下代码是死循环
while(true){} for(;;){}break的使用场景:
在选择结构switch语句中 在循环语句中 离开使用场景的存在是没有意义的
break的作用:
跳出单层循环 跳出多层循环
带标签的跳出 格式:标签名: 循环语句 标签名要符合Java的命名规则continue的使用场景:
在循环语句中 离开使用场景的存在是没有意义的
continue的作用:
单层循环对比break,然后总结两个的区别
break 退出当前循环 continue 退出本次循环也可以带标签的使用
方法概述
假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可。
简单的说:方法就是完成特定功能的代码块
在很多语言里面都有函数的定义 函数在Java中被称为方法
格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) { 函数体; return 返回值; }方法格式解释
修饰符 比较多,后面会详细介绍。目前public static 返回值类型 用于限定返回值的数据类型 方法名 一个名称,为了方便我们调用方法 参数类型 限定调用方法时传入参数的数据类型 参数名 是一个变量,接收调用方法时传入的参数 方法体 完成功能的代码 return 结束方法以及返回方法指定类型的值 返回值 程序被return带回的结果,返回给调用者
有明确返回值的方法调用:
单独调用,没有意义 输出调用,有意义,但是不够好,因为我不一定非要把结果输出 赋值调用,推荐方式
方法不调用不执行
方法与方法是平级关系,不能嵌套定义
方法定义的时候参数之间用逗号隔开
方法调用的时候不用在传递数据类型
如果方法有明确的返回值,一定要有return带回一个值
没有明确返回值的函数调用:
其实就是void类型方法的调用 只能单独调用
方法重载概述
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
方法重载特点
与返回值类型无关,只看方法名和参数列表 在调用时,虚拟机通过参数列表的不同来区分同名方法
数组概述
需求:现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有80名员工,用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦。为了解决这种问题,Java就提供了数组供我们使用。 那么数组到底是什么呢?有什么特点呢?通过上面的分析:我们可以得到如下两句话:
数组是存储多个变量(元素)的东西(容器)
这多个变量的数据类型要一致
数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
数组既可以存储基本数据类型,也可以存储引用数据类型。
数组的定义格式
格式1:数据类型[] 数组名; 格式2:数据类型 数组名[]; 【注意】: 1:针对数组定义两种格式,推荐使用第一种格式。因为第一种的可读性更强。 第二种可以早期的时候确实有很多人这样用。不过,现在这样用的人越来越少了。 2:作为Java的粉丝C#(Java的模仿者)就不再支持第二种语法格式了。越来越多的语言可能会抛弃第二种格式。
注意:这两种定义做完了,数组中是没有元素值的。如何对数组的元素进行初始化呢?
数组初始化概述:
Java中的数组必须先初始化,然后才能使用。 所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
数组的初始化方式
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
格式:数据类型[] 数组名 = new 数据类型[数组长度]; 数组长度其实就是数组中元素的个数。 举例:
int[] arr = new int[3];解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
格式: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…}; 举例:
int[] arr = new int[]{1,2,3};解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。 其实这种写法还有一个简化的写法
int[] arr = {1,2,3};注意: 但是一定要注意不能同时进行动态初始化和静态初始化。 什么意思呢,就是不能在给定数组长度的同时给出元素。
数组索引越界
ArrayIndexOutOfBoundsException 访问到了数组中的不存在的索引时发生。
空指针异常
NullPointerException 数组引用没有指向实体,却在操作实体中的元素时
Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈 存储局部变量
堆 存储new出来的东西
方法区
本地方法区 (和系统相关)
寄存器 (给CPU使用)
二维数组概述
每个班有很多个学生,所以,可以用数组来存储,而我们又同时有很多个Java基础班。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。 由此可见:其实二维数组其实就是一个元素为一维数组的数组。
格式1
数据类型[][] 变量名 = new 数据类型[m][n]; m表示这个二维数组有多少个一维数组 n表示每一个一维数组的元素个数
举例:
int[][] arr = new int[3][2];定义了一个二维数组arr 这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2] 每个一维数组有2个元素,可以通过arr[m][n]来获取 表示获取第m+1个一维数组的第n+1个元素
【注意】 针对格式1其实还可以
int arr[][]; int[] arr[];但是都不建议。
这个时候提醒大家注意一个问题
int[] x,y[];这种定义x是一个一维数组。 y是一个二维数组。
格式2
数据类型[][] 变量名 = new 数据类型[m][]; m表示这个二维数组有多少个一维数组 这一次没有直接给出一维数组的元素个数,可以动态的给出。
举例:
int[][] arr = new int[3][]; arr[0] = new int[2]; arr[1] = new int[3] arr[2] = new int[1];格式3
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
简化版格式:
数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
举例:
int[][] arr = {{1,2,3},{4,6},{6}}; c. 认证博客专家 MySQL Java Elasticsearch github:https://github.com/cckevincyhgitee:https://gitee.com/cckevincyh