关键字:
1、全部是小写
2、变色的,有特殊含义的英文单词、不能写错。
关键字个数:40+
数据类型:
计算机的本质是处理数据和保存数据
数字类型
可以用来计算
文本类型
不能用来计算
java当中的数据类型(关键字):
数字类型 | 中文 | 内存(字节) | 取值范围 |
---|---|---|---|
byte | 字节型 | 1 | -128到127 |
short | 短整型 | 2 | -32768到32767 |
int | 标准整型(使用最多) | 4 | -2^31-2^31-1 |
long | 长整型 | 8 | -2^63-2^63-1 |
float | 单精度浮点类型(小数类型) | 4 | -3.14E^38到-3.14E^38-1 (小数点后6位) |
double | 双精度浮点类型(小数类型默认) | 8 | -1.7E^308到-1.7E^308-1 (小数点后12位) |
在JAVA开发中,通常用:
整数型:int
浮点型:double
字符类型 | 中文 | 内存(字节) | 取值范围 |
---|---|---|---|
char | 保存单个字符 | 2 | 0-65535 |
JAVA当中的基本数据类型(8个):
byte,short,long,int,float,double,char,boolean
JAVA程序执行的流程:
从上往下顺序执行;
注意:
定义变量的代码,必须要把该代码放在打印语句的前面;
变量:
定义
可以改变的量(值):
当程序中遇到了某个类型的值可以改变或者不确定的时候,就使用变量;
定义变量的语法:
数据类型 变量名 = 初始值;
例:int age = 18;
变量名的命名规则:
1、只能由数字、英文字母和下划线(_)或者美元($)符号构成
2、不能以数字开头
3、不能和关键字一样
4、最好有意义
注意:如果输出一个变量的值的话,必须要给变量初始值
JAVA当中的运算符:
算数、赋值、比较、逻辑
1、算数运算符
+ - * / %(模、取余、求模)
两数相模取其余 两数同时为整数,余只取整数位
两束相除取其商 两数同时为整数,商只取整数位
注意:在字符串使用+运算的时候,+不代表加法运算,而是代表连接字符;
2、比较运算符(关系运算符)
> > = < <= ==(等于) !=(不等于)
注意:比较运算符的结果是boolean类型,必须会有一个结果
3、逻辑运算符
&(与)
当有多个比较表达式是,可以用&
作用是当比较表达式全部为true的时候就为ture,
只要其中一个表达式为false,就为false
|(或)
作用是当比较表达式全部为false的时候才为false,
只要其中一个表达式为true,就为true
!(非)
当我们表达式结果为true时,就为false
当我们表达式结果为false时,就为true
^(异或)
当整个表达式结果相同时,就为false
当整个表达式结果不相同时,就为true
&&(短路与)
当两个表达式,前面表达式有一个结果为false,则后面的表达式不再执行。返回结果为false;
如果前面的表达式结果为true,就会执行后面的表达式
||(短路或)
当两个表达式,前面表达式有一个结果为true,后面的表达式,则不再执行
表达1 | 表达2 | || | | | && | & | ^ |
---|---|---|---|---|---|---|
true | true | true | true | true | true | false |
true | false | true | true | false | false | true |
false | true | true | true | false | false | true |
false | false | false | false | false | false | false |
注意:为了提高程序效率我们通常使用&&和||
4、赋值运算符
= 将后面的值赋值给前面的。
+= -= *= /= %=
5、自增,自减
++ --
运算规则:
自增自减在后面:
1、先把num值赋值给一个临时变量;(JVM提供)
2、然后对num进行+1运算
3、把临时变量的值赋值给接收的变量
自增自减在前面
1、对定义变量进行+1或者-1运算
2、把运算的结果赋值给接收的变量或直接输出
注意:
在开发当中,如果遇到+1或者-1运算的,直接用一元运算符;
一元运算符:++ - -
二元运算符:+ - * / %
三元运算符:? :(也称条件运算符或三目运算符)
语法:接收变量=条件表达式?true的结果:false的结果
三元运算符和if的区别:
1、三元运算符必须要有一个接收变量
2、三元运算符只能作为if语句中的双支if语句的存在
3、三元运算符只能使用条件表达式和运算表达式
程序流程:
1、顺序流程(从上往下逐行代码执行)
2、条件控制流程(根据一个结果来执行某行或者某块代码)
3、重复流程(重复的执行某行或者某块代码)--循环控制流程
条件控制流程
1、判断语句
关键字:if
1、单支判断语句 if(条件){语句}
2、双支判断语句 if(条件){语句1}else{语句2}
注意:
单支和双支的IF区别:
1、都是判断一次,但是单支if语句只有一个执行效果,而双支if语句会有两个不同的执行语句
2、if语句的后面,如果只有一行代码的时候,大括号我们是可以省略的。(但不建议省略)一行代码以;结束
3、多支判断语句 if(条件1){语句1}else if(条件2){语句2}else if(条件3){语句3}else{语句4}
4、嵌套if语句 if(条件1){if(条件2){语句1}}else{语句2}
2、选择语句switch
关键字:switch(常量表达式){
case 常量值1:语句1; break;
case 常量值2:语句2; break;
case 常量值3:语句3; break;
case 常量值4:语句4; break;
default: 语句5; break;
}
特点:
1、switch中的case和default的书写上是没有先后顺序的,但是一定会先执行case语句
2、case语句在书写上也是没有先后顺序,但是在执行的时候会按照书写的case顺序去执行
3、只有两种情况结束switch语句:一种是遇到break语句,第二种是运行到switch的结尾处
4、在switch当中default语句可以省略;而且default语句中的break也是可以省略的。
5、switch语句中的case语句后面没有break关键字,也就是匹配的时候遇到没有break关键字case,是会执行该case语句中的代码
if与switch区别:
1、if语句在条件表达式使用变量时,每使用一次变量就会获取一次变量的值(多次获取);
2、switch语句在常量表达式使用变量的时候,指挥获取一次变量;
3、switch语句通常是用在单一值进行比较的时候,不适用范围区间的比较
循环控制语句
重复执行某行语句或者语句块;
语句:一行代码
语句块:多行代码
要求:这些代码包括在大括号里面{}
java当中的循环(三种)
while循环
关键字:while
语法:
while(){语句或者语句块}
如果希望循环正常执行,在循环过程中需要三要素
1、循环的初始值
2、循环条件
3、修改初始值(修改循环条件)
do while循环
关键字:do while
语法:
do{语句}while(判断)
do while和while的区别
1、while先判断条件,后执行循环。如果条件不满足,虚幻一次都不执行
2、do while先执行循环体,再判断条件,如果条件不满足,则循环至少执行了一次
do while和while的共同点
初始值 循环条件 修改循环条件
for循环
for(初始值; 循环条件;修改条件){执行循环语句}
两个关键字:
break: 结束,代表结束整个循环;
continue: 继续,结束本次循环(continue后面的代码就执行)。 直接进入到下一次循环
for 和 while循环的异同:
for循环和while循环特点相同,都是属于先判断后执行循环体的循环
定义在for循环里的变量,不能再for循环的外部使用。而while循环的初始值可以在while循环的外部使用
嵌套循环:
先执行外部的for循环,当外部的for循环条件为true时,则进行内部for循环
在执行内部for循环的时候,必须整个内部循环完成后(内部的for循环的循环条件不满足时),则执行外部循环的修改循环条件。
当条件修改完成后,继续判断外部for循环的条件是否满足,条件满足,则再次执行内部for循环;
只有外部for循环的条件不满足时,嵌套循环才会全部结束
输入语句
Scanner s=new Scanner(System.in);
int num1=s.nexInt();
指定用户输入什么类型的数据,接收的变量就必须为输入数据的数据类型
数组
在java当中有个概念:容器
容器:可以存储多个数据的单位
在java中,数组容器需要使用一个特殊符号来表示:[]
为什么使用数组:
数组即容器,可以存储多个 相同类型 的数据
数组的定义:
int num[] = new int [5] //表示定义了一个数组,这个数组容器中可以存储5个类型的数据
数组的定义的格式:
数据名 [ ] = new 数据类型 [ 数组的大小 ];
数组的使用:
在java中对数组进行操作,使用角标来对数组进行操作;
操作:
通过for循环
数组的输出:
直接用角标
数组常见错误
1、角标越界(java.lang.ArrayIndexOutOfBoundsException)
2、空指针异常(java.lang.NullPointerException)
数组在没有任何人引用堆中的内存时,如果你使用这个数据,就会出现空指针异常
数组的其他定义方式
int num1[]=new int[3];
int[] num2=new int[3];
int[] num3={3,12,34};
int num4[]={5,12,2,45};
注意:
1、在数组简化定义方式的时候,JVM在执行,没有声明数组长度,会根据数组所赋予值的个数来开辟空间
2、数组无论你使用new和不用new没区别,他都是在堆内存中;
在java数组当中提供一个属性:length
使用格式:数组名称.length(表示获取数组长度)
数组的内存图解
每个程序都有自己的内存空间
java中的内存空间(5个部分);
1、寄存器(CPU)跟开发没有关系;不需要关注
2、本地方法 和windows有关系,能调用系统的一些功能; 不需要关注
3、方法去 也叫静态区 存放 class 和 static ;后面详解
4、栈 存储一些局部信息,例如局部变量;
栈的特点:先进后出,效率高
5、堆 存储一些实体(只要使用new 关键字创建)数组就是放在堆里面
堆的特点:
在堆中存储的信息,都有一个默认的内存地址(首地址)
存储堆中的数据,都有一个默认值
数组的特点及使用思想:
1、数组必须有长度;数组的大小不能改变
2、数组存储的数据必须是相同类型的元素
3、对数组操作时用角标,角标开始值为0
什么时候用数组
存储数据长度固定,并且是相同类型且没规律,是通过角标来操作
有规律用循环
数组的排序
排序:把一些没规律的数据按照顺序排列
1、选择排序
使用嵌套循环方式,每一轮比较循环结束后,当循环的最小角标的值必须是最大值或最小值
2、冒泡排序
晓得向上浮,大的向下沉(从小到大)
二维数组:
其实就是多个一维数组;
二维数组的定义:
int num[][]=new int[2][4];
这个二维数组:其实就是由两个一维数组构成,并且每个一维数组能存储4个元素;
二维数组其他定义方式:
int num1[][]={{22,12,32},{12,45},{87,123,34,56}};
函数:
书写在同一个类中(class),具有特定功能的一段独立程序;
main 他是主函数 (运行java程序,程序入口)--main方法
函数也被称为方法:
早期函数叫做功能;
发现程序中存在重复的代码,这种重复的代码会造成程序的可读性、重复性比较差;
java程序对这种复用型比较差的解决思想就是使用:函数
函数定义的格式:
修饰符[public static] 返回值类型[void] 函数名(参数的数据类型 形式参数名1,参数的数据类型 形式参数名2......){
//函数体......功能代码
return 返回值;
}
形式参数名:变量
参数的数据类型:就是变量的类型
返回值类型:return 关键字后面跟的数据类型
函数名:自己取的(程序员)
return:
函数执行完成之后,需要的一个返回结果,这个结果就用使用return关键来返回;
结束函数;
在我们程序当中,只要明确两个地方,就能很方便的去写函数:
1、明确是否有函数运算的运算变量;(明确参数)
2、明确函数执行完成之后,有没有结果;(有没有返回值)
计算两个数相加:
明确1:是否有参与函数运算的变量? 有
加数 和 被加数
明确2:有没有结果,函数执行完成后? 有
相加的值
public static int add(int num1,int num2){
int sum=num1+num2;
return sum;
}
注意:
函数内不能嵌套!
直接在main函数中调用函数名(功能名),写上参数。有返回值的要用一个值去接收他的返回值;
栈内存的特点:先进后出 ;例如:枪中的弹夹
小结:
当函数入栈后,会开辟参数的空间,开辟完空间之后才会给参数赋值;
当函数出栈后,函数中所属所的参数会随着函数的出栈而消失(内存清楚)
结论:定义在函数内部中变量,都是是属于函数的,这种变量:局部变量
函数的重载:
遇到相似功能的函数时,我们可以把函数的名称定义为相同的名称,这种方式我们就叫做函数的重载;
函数重载的特点:
方法名相同
参数列表不同(参数的个数不相同、参数的数据类型不同)
参数顺序不同(参数个数相同,数据类型顺序不一样)
注意:
函数的重载跟函数的返回值是没有关系的;
跟变量名也是没关系;
void show(int a,float b,char c);
下列哪些函数和给的函数是重载了
void show(int x,float d,char z); //不是的,参数的个数和类型是一样的
int show(float b,char c, int a); 是 参数类型不一样
double show(); //是的,参数个数不一样
多态
事物以多种形态来表现。
java中,我们可以使用对象的具体类型来描述
例子:Dog(具体类型) dog(对象)=new Dog();//这就是对象具体类型来描述
也可以使用对象的父类型来描述:
Aniaml an=new Dog(); //使用父类类型描述对象
注意:使用多态有个前提:必须是继承关系或者实现关系
多态的体现:
父类(接口)的引用指向子类对象
例子:
父类 引用变量=new 子类();
接口 引用变量=new 子类();
多态好处:
提高程序中代码的扩展性
多态的前提:
使用多态必须是继承或者实现关系
通常子类需要把父类中的方法进行重写。
多态弊端:
只能操作父子类公有的方法,不能操作子类中特有的方法;
如何解决这个弊端:
多态的转型:
向上转型:
Aniaml an=new Dog();
Aniaml 父类类型 an 父类引用 new Dog() 子类对象
使用父类引用(an)指向子类对象时,其实子类类型已经向上提升为父类型;
向下转型:
Aniaml an=new Dog();
Dog dog=(Dog)an;
java.lang.ClassCastException:在使用多态中的向下转型时,会常遇到ClassCastException(类型转换异常)
例子:Aniaml an=new Dog();
Cat cat=(Cat)an; //会引发类型转换异常
向下转型遇见类型转换异常时,使用关键字 instanceof 来对转换的类型进行判断
小结:
向上转型:
为了提高程序中代码的扩展性
不需要使用子类中特有的方法
向下转型:
需要用到子类中特有的方法
转型的时候,使用instanceof(判断) 来避免