day 5:Java基本语法3(流程控制语句、方法、数组、内存分配)

若果在程序中,要改变运算顺序,可以使用();

正负号>单目运算符(++、- -、!)>算术运算符(乘除、加减)>关系运算(==、!=、<、>、<=、>=、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);

对于数组空间:我们只能通过引用变量来间接操作数组在堆上所对应的内存空间;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值