4网课内容总结
1.Java方法:
方法通常是为了完成某一功能,把程序中特定的代码块组合在一起构成的。
方法的好处体现在:(1)可重用性,多次使用,避免冗余(2)使程序结构更加清晰
2.方法的语法形式:
[修饰符] 返回值类型 方法名(形参列表){
方法体
},即方法头+方法体。
3.方法语法形式中各个元素的含义:
(1)修饰符:用来规定方法的可见范围等特征。如public表示公开方法,static表示该方法是静态的。
(2)返回值类型:表示该方法会返回一个什么类型的值。如果不需要返回值,则类型为void。其他类型则需要在方法体内部最后使用 return 返回值类型 语句。return和break,continue一样。属于跳转语句,return的作用是返回给主调方法并退出当前方法。方法的返回值只能有一个。
(3)方法名:符合方法的命名规则。
(4)形参列表:接收传入的参数。形参的个数可以是零个,一个或多个。无论是否有参数,()都必须出现。形参列表的格式为 类型A a,类型B b。
4.调用方法时,只需要使用方法名(实参列表)的形式。实参列表要与形参列表形势一致。静态方法可以直接在入口函数中调用。
5.递归:
递归就是自己调用自己的方法,主调函数也是被调函数。为了防止递归没有穷尽,必须规定递归的退出条件。
6.数组:
数组是相同类型数据的有序集合。数组描述的是相同类型的若干数据。按照一定的先后次序排列组合。其中每一个数据称为元素,每个元素都可以通过数组的索引或者下标(角标)来定位。
7.数组的特点:
数组是引用类型。数组中的元素可以是基本类型或者引用类型。一个数组的内存空间是连续的,而数组的引用名是连续空间的首址。数组的长度一旦确定就不能更改。数组需要声明、创建、赋值并使用。
8.数组创建和使用:
(1)声明/定义:有两种格式,数据类型[] 引用名; 和数据类型 引用名[];。java推荐使用前一种。数组的声明中不可以定义数组的长度。
(2)创建/初始化:所谓初始化,就是为数组中的元素分配内存空间,并为每个元素赋值。方式也有两种,分为动态初始化和静态初始化。
动态初始化即数组声明和数组元素的分配空间和赋值可以分开进行:引用名 = new 数组类型[数组长度];,数组长度必须是正整数。new的作用是为数组开辟空间。数据类型指定每个数组元素的空间大小。[]表示这个是一个数组。长度表名数组元素个数。
静态初始化:声明和初始化必须同时完成 :数组类型[] 引用名 = {初值列表};此时在声明数组时,不需要指定长度,系统会根据给出的数据自动分配长度。
(3)赋值并使用数组:引用名[下标] = 值; 使用数组时,使用 引用名[下标]获取相应的值。下标范围为0-数组长度-1,当下标不在此范围时会发生数组越界。
一般使用for循环为数组赋值\取值。
9.引用名存储的其实是数组的首地址。
数组元素中存储的内容和类型相关,如果是基本数据类型,存放的是数据本身,如果是引用类型,存放的是引用变量的地址。Java的内存分为栈内存和堆内存,基本数据类型的变量和数据都存在于栈中,引用数据类型的变量(地址)存在于栈中,数据存在于堆中,所以引用数据元素的内容 其实是堆内存地址。数组也是引用类型,所以整个数组内容都存在于堆中。
10.数组的默认值:在动态初始化中,byte short int初值都为0 long为0L char是一个空格('\u0000')float和double类型的默认值为0.0 String和其他引用类型都是null(String类型初值不等于“”)
11.数组下标越界异常:ArrayIndexOutOfBoundsException
12.内存管理:
程序运行必须在内存中进行,Java程序运行时,向JVM请求内存,JVM再向操作系统申请内存。JVM进行内存分配时,将内存分为栈和堆。
线程共享数据区中有堆和方法区。
其中堆存储对象数据,方法区简单地说就是存放着class文件中的内容。如果new对象时申请不到空间,就会抛出内存溢出异常。
线程隔离(私有)的数据区中有虚拟机栈、本地方法栈和程序计数器。
其中程序计数器共CPU找到下一条指令的地址和恢复现场,虚拟机栈中分割成一个个的栈帧,每个栈帧对应着一次方法的调用。栈帧中存放着局部变量表【方法中的参数和局部变量】(基本数据结构的变量和对象的引用)、操作数栈(进行运算的栈)、方法出口和其他的信息。换一种说法,栈帧中存放着函数入参、出参、返回地址和上一个栈帧的栈底指针以及操作数栈。当栈调用的深度大于JVM所允许的范围,也会发生一个异常。本地方法栈是Java方法调用其他语言的接口。
堆中存放的是引用对象的数据,栈中存放着基本数据类型的数据和引用对象的地址。

13.数组只定义未初始化引起的空指针异常:NullPointerException,即引用对象的地址没有引用到任何堆内存中的数据。
14.数组的遍历:for循环和增强for循环。拷贝:自动扩容 获取最值:保存最值或者保存最值的下标。
15.二维数组:
声明:int[][] arr; int arr[][];
动态初始化:指定行数列数和仅指定行数。int[][] arr = new int[]3[5]; int[][] arr = new int[3][];
赋值(针对不同的初始化方法):arr[1][2] = 2; arr[0] = new int[3]; 没赋值的默认是0
静态初始化:int[][] arr = {{2,1,4},{3,1,4,2,1},{3}}; int[][] arr = new int[][]{{2,1,4},{3,1,4,2,1},{3}};

16.Java方法:
方法 就是将具有独立功能的代码库组织成为一个整体,使其具有特殊功能的代码集。方法必须先创建才可以使用,过程就成为方法的定义。方法定义之后不能直接运行 需要手动的调用 才可以执行。过程称为方法的调用。
方法语法格式:[修饰符] 返回值类型 方法名([形参列表]){ 方法体 }。
方法的优点:可以重复使用;使程序结构更加清晰;程序可读性强。
方法定义:无参方法/有参方法
public static void 方法名称(){
方法体;
}
public static void 方法名称(形参列表){
方法体;
}
方法的调用: 方法名称();方法调用时,首先main()进入方法栈,执行main中的代码,当调用一个方法时,新的方法进入方法栈,创建形参和局部变量,并在自己的操作数栈中运算,运算结束后,该方法出方法栈,main方法继续运行,main方法执行完成后出栈。出栈时同时会释放空间。
17.形参与实参的区别和联系:
形参是在方法入栈才分配内存,方法调用结束后,内存会被立即释放,所以形参只在方法内有效。实参可以是常量、变量、表达式、方法等,实参在被方法调用时,必须有实际的值。形参和实参在类型、数量、顺序上都必须一致。如果重载方法中没有一致的数据类型,那么首先找到最小兼容实参的参数列表进行调用。方法调用中,数据传递是单向的,即实参传给形参,修改的形参不能反向传给实参。但是如果传递的是引用对象的地址,那么可以根据这个地址访问,来修改引用变量内部的值。
18.方法的返回值类型:指定类型或空(void)。return后任何语句都不会执行。
19.方法的重载:
方法名一样,形参列表的参数个数、参数类型的顺序、参数类型不同时,定义多个重名方法称为方法的重载。如果方法的返回值相同,也符合上述描述,那么也是方法的重载,如果方法的返回值不同,参数列表没有变化,则会直接提示报错。总之,返回类型的改变不引起方法的重载。
20.冒泡排序:
一次比较相邻的两个数,升序时依次将大数向后传递。可以升序,也可以降序。第i轮的作用是把第i大的数放到数组的n-i下标处。每一轮需要比较的次数-1。第一次需要n-1次比较。冒泡排序最多要进行 (n-1)+(n-2)+……+1 次相邻 2 数交换
21.插入排序:
前面有序,后面无序。从下标为1的元素开始,(升序排序)如果小于就和前面的元素交换。形成一种前面暂时有序,后面未处理的状态,直到数组全部有序。如果数据本身是降序的,而要求按照升序排序,那么插入排序需要 1+2+3+……+(n-1) 次数据移动。每一轮从第二部分中的挑选第一个元素插入到第一部分。
22.快速排序(单向扫描法):
每次取第一个元素(头部元素),设置两个指针,分别是下标为1和下标为n-1。将大于头部元素的数移动到后面,直到前面的指针下标大于后面的指针。此时将头部元素和后面的指针所指的元素交换,即和最后一个小于头部元素的元素交换。返回这个下标,此时得到的数组就是以这个下标为分界,前面部分小于等于头部元素,后面部分大于等于头部元素的半有序数组。此时递归前面部分和后面部分,直到只剩下一个元素或没有元素。
快速排序(双向扫描法):
首先一直移动左指针到首次大于头部元素的下标处,再移动右指针到首次小于头部元素的下标处。如果此时左指针大于右指针,则结束这次遍历返回。否则,交换两个元素,并再次移动。方法的结果也是会形成一个半有序的数组,一直递归调用直到剩下一个或零个元素为止。

浙公网安备 33010602011771号