若果在程序中,要改变运算顺序,可以使用();
正负号>单目运算符(++、- -、!)>算术运算符(乘除、加减)>关系运算(==、!=、<、>、<=、>=、instanceof)>逻辑运算(&、|、^、!、&&、||)>位运算符>条件运算符(三目运算符)
如何键盘录入数据呢?
导包:import java.util.Scanner;
创建对象:Scanner sc=new Scanner(System.in);
接收数据:int x=sc.nextInt();
流程控制语句分三类:
顺序结构、选择结构、循环结构
选择结构分两种:if和switch;
switch(表达式){
case 值1:
语句1;break;
...
default:
语句n+1;break;
}
case后面跟的是要和表达式进行比较的值;只能是常量,不能使变量;不加break会导致case穿越。
default分支是否要加break取决于它所在的位置,如果是分支末尾不加也可以。
case穿越只发生在匹配完成后,不匹配则不会发生case穿越。
选择结构的使用场景:
if语句使用场景:针对结果是Boolean类型的判断;针对一个范围的判断;针对几个常量值得判断
switch语句的使用场景:针对几个常量值的判断
循环结构:
for 循环语句格式:
for(初始化语句;判断条件语句;控制条件语句){
循环体语句;
}//控制条件语句在循环体语句执行完成后再执行
循环体语句如果是一条语句,那么大括号可以省略;如果是多条语句,大括号不可以省略。建议永远不省略。
while循环语句:
while(判断条件语句){
循环体语句;
控制条件语句
}
for和while可以等价转换,但是还是有些小区别:控制提哦案件语句控制的变量,在for循环结束以后就不能再被访问到了,而while循环结束以后还可以继续使用,如果你想继续使用,就用while,否则使用for。原因是for循环结束,该变量就从内存中小时,能够提高内存的使用效率。
for适合针对一个范围判断地进行操作(循环次数比较明确);while循环适合判断次数不明确的操作。(i++里面的i)
do...while循环语句:
初始化语句;
do{
循环体语句;
控制条件语句;
}while(判断条件语句);
三种循环语句其实都可以完成一样的功能,也就是说可以等价转换,但还是有小区别:
do while 至少会执行一次循环体。
for 和while只有在条件成立的时候才会去执行循环体。
写代码优先考虑for循环,再考虑while循环,最后是do while。
while(true){};for(;;){}是死循环
即使循环没有达到终止条件,我们也可以主动结束跳转:break,continue,return;
break====中断循环(配合Outer使用可以结束外层循环)(离开使用场景没有意义)
return====退出函数(不管是内外层循环看见return就退出)
continue===跳出单次循环(OuterContinue+continue=break)
方法(c++里边的函数)
格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...){
函数体;
return 返回值;
}
1、修饰符:public static
2、返回值类型:限定,方法体代码最终计算出来的结果类型
3、方法名:标识符(见名知意)
4、参数列表(参数类型 参数名称):
5、函数定义当中所说的执行特定功能的代码块。
6、return 返回值:返回最终特定功能的代码块的计算结果。
函数调用:对于有返回值的方法:直接调用、输出调用、赋值调用
add (3、4);//直接调用
System.out.println(add(3,4);//输出调用
int addResult=add(x,y);//
我们只是定义了方法,方法不调用的话是不执行的;方法定义中,参数列表所定义的参数称之为形参;
方法的注意事项:
1、方法不调用不执行;
2、方法和方法是平级关系,不能嵌套定义;
3、方法定义的时候参数之间用逗号隔开;
4、方法调用的时候不用再传递数据类型 add(int a,int b)这样就是错的。
5、如果方法有明确的返回值,一定要return 带回一个值。
6、调用没有返回值的方法只能直接调用。
方法重载
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数、类型、顺序(是参数类型的顺序而不是参数名的顺序)不同;
方法名+参数列表=方法签名,编译器或虚拟机根据方法签名去区分不同的方法;
不能通过方法的返回值来确定方法。当形参数据类型不一致时,编译器并不会报错,而是选择能够转化的数据类型进行运算。
数组:
int arry1[];int []array2;
java中的数组必须先初始化,然后才能使用。就是为数组中的数组元素分配内存空间,并且为每个元素赋值。
动态初始化:初始化只指定数组长度,由系统为数组分配初始值;
int [] array1=new int [10];
array1表示为数组分配内存空间的地址 [I@14ae5a5;[表示该变量代表一个一维数组;I这个数组中存储的元素类型是int型;其余是是在内存地址的一个hash值。
1、我们可以通过数组下标形式访问数组元素内容。
2、java语言中实现的数组其索引(下标)从0开始
3、数组的动态初始化默认为0(各元素)
要使用该变量必须首先对它进行初始化,这是由编译器保证的。
数组的静态初始化:
int[] array1=new int []{1,2,3,4};
数组是java中的一种内置对象,它也有自己的属性array.length等,表示数组长度
常见的两种异常:
1、数组越界异常:
2、空指针异常:
int []array=new int [3];
System.out.println(array[3]);//数组越界异常;
array=null;
System.out.println(array[0]);//空指针异常
内存分配:
java虚拟机中的内存模型:java运行时候需要在内存中分配空间,为了运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据的方式和内存管理方式;
1、栈:存储局部变量
2、堆、存new出来的东西
3、方法区
4、本地方法栈(系统相关,JNI)(java语言调用其他语言调用的功能)
5、程序计数器
栈内存:存储局部变量(在方法(函数)中定义的变量);必须手动(显式)初始化没有默认初始值;局部变量,一旦超出函数作用域立即被虚拟机回收;
堆内存:存储的都是new出来的东西,但是new出来的东西会进行默认的初始化动作;byte,short,int 0;char'\u0000';float/double 0.0;boolean false;引用类型:null;
但是在堆内存中,即使某一块堆内存已经成为垃圾,也不会被立即回收,因为堆中的内存的回收是由来及回收器来完成,只有在垃圾回收期空闲的时候才会回收垃圾;
array1====引用变量;(默认初始化为null);
对于数组空间:我们只能通过引用变量来间接操作数组在堆上所对应的内存空间;