要争气,因为心里憋着太多的不服气
——24.1.18
数组重点回顾
1.概述:容器,本身属于引用数据类型
2.特点:
①定长
②既可以存储基本数据类型的数据,还可以存储引用数据类型的数据
3.定义:
动态初始化:数据类型[ ] 数组名 = new 数据类型{数组长度}
静态初始化:数据类型[ ] 数组名 = new 数据类型{数据1,数据2,……}
4.数组操作:
①获取数组长度:数组名.length
②存储数据:数组名[索引值] = 元素 -> 将元素存储到数组指定的索引上
③获取元素:数组名[索引值]
④遍历:数组名.fori
⑤索引:指的是元素在数组中存储的位置
从0开始,最大索引是数组.length - 1,唯一,不能重复
5.操作数组时容易出现的异常:
①数组索引越界异常:ArrayIndexOutOfBoundsException
原因:操作的索引超出了数组索引异常
②空指针异常:NullPointerException
原因:对象为null,然后再去操作此对象
6.内存:
①栈:方法的运行在栈
②堆:数组、对象都在堆,而且每new一次都会在堆中开辟一个空间,堆内存会为此空间分配一个地址值
③方法区:代码运行之前的预备区,存储class文件
④本地方法栈
⑤寄存器
7.二维数组概述:数组中有多个一维数组/二维数组是元素为一维数组的一维数组
①动态初始化定义:数据类型[ ][ ] 数组名 = new 数据类型[m][n]
m:代表的是二维数组的长度
n:代表的是每一个一维数组的长度
②静态初始化定义(简化形式):
数据类型[ ] 数组名 = {{元素1,元素2,…},{元素1,元素2,…},{元素1,元素2,…}…}
8.二维数组操作:
①获取长度:数组名.length
②存元素:数组名[i][j] = 值
i:代表的是一维数组在二维数组中的索引位置
j:代表的是元素在一维数组中的索引位置
③获取元素:数组名[i][j]
④遍历:嵌套for 先将一维数组从二维数组中遍历出来,再遍历每一个一维数组
若所有的代码都在main方法中,会显得main方法代码太多,太乱,太臃肿 -> 不好维护
将代码块分为三个区域,每个区域存该区域模块相应的代码
分好模块后,直接调用功能名称就好了
将不同功能的方法放到不同的方法中,想执行某个功能,直接调用方法名就好,对应的代码被自动执行起来,将来维护的时候,直接找到对应的方法,就可以对其直接进行修改维护
方法:
拥有功能性代码的代码块
将不同的功能放在不同的方法中,给每个方法取个名字,直接调用方法名,对应的方法就被执行起来了,便于维护。
通用定义格式:
修饰符 返回值类型 方法名(参数){
方法体
return 结果
}
①无参无返回值方法
②有参无返回值方法
③无参有返回值方法
④有参有返回值方法
1.无参无返回值方法的定义:
public static void 方法名(){
方法体 -> 实现此方法的具体代码
}
2.调用:
在其它方法中:方法名()
3.注意事项:
①void关键字代表无返回值,写了void,就不要在方法中写return了
②方法不调用,不执行,main方法是jvm自动调用的
③方法之间是平级关系,不能嵌套调用
④方法的执行顺序和定义顺序无关,只和调用的顺序有关
public static void main(String[] args) {
farmer();
cooker();
personal();
}
//农民伯伯
public static void farmer(){
System.out.println("播种");
System.out.println("施肥");
System.out.println("拔草");
System.out.println("浇水");
System.out.println("除虫");
System.out.println("收割");
}
//厨师
public static void cooker(){
System.out.println("洗菜");
System.out.println("切菜");
System.out.println("炒菜");
System.out.println("装盘");
}
//自己个人
public static void personal(){
System.out.println("洗手");
System.out.println("吃菜");
}
定义一个方法,实现两个整数相加
public static void main(String[] args) {
Add();
System.out.println("调用了Add方法");
}
public static void Add(){
int a = 20;
int b = 55;
int sum = a+b;
System.out.println("sum = " + sum);
}
settings勾选,使得每个方法之间被隔开
①修饰符:public static
②返回值类型:
该方法最终返回结果的数据类型
比如:return 1 -> 方法上的返回值类型写int
return 2.5 -> 方法上的返回值类型写double
return "" -> 方法上的返回值类型写String
如果没有返回值,不要写具体的返回值类型,要写void
③方法名:见名知意(小驼峰原则)
④参数:进入到方法内部参与执行的数据(数据类型 变量名,数据类型 变量名)
⑤方法体:实现该方法的具体代码
1.格式:
public static void 方法名(数据类型 变量名){
方法体
}
定义一个方法,实现两个整数相加
public static void main(String[] args) {
sum(10,20);
}
public static void sum(int a,int b){
int sum = a+b;
System.out.println("sum = " + sum);
}
1.格式:
public static void 方法名(数据类型 变量名){
方法体
}
定义一个方法,实现两个整数相加,将结果返回
public static void main(String[] args) {
int sum=sum();
System.out.println("sum = " + sum);
}
public static int sum(){
int a = 10;
int b = 20;
return a+b;
}
1.格式:
public static void 方法名(数据类型 变量名){
方法体
}
2.调用:
①打印调用:
sout(方法名(具体的值))
②赋值调用:(推荐)
数据类型 变量名 = 方法名(具体的值)
定义一个方法,实现两个整数相加,将结果返回
public static void main(String[] args) {
int sum=sum();
System.out.println("sum = " + sum);
}
public static int sum(){
int a = 10;
int b = 20;
return a+b;
}
1.形式参数(形参):在定义方法的时候形式上定义的参数,此参数还没有值
2.实际参数(实参):在调用方法的时候给形参赋予具体的值
1.参数:
当想将方法A的数据传递到方法B时,那么定义方法B时就需要带两个参数,在方法A中调用方法B时,可以将方法A中的数据通过参数传递到方法B中
2.返回值:
调用方法A时,想要方法A的结果,去参与其他的操作,那么方法A就需要将自己的结果返回
public static void main(String[] args) {
int a = 10;
int b = 20;
method(a,b);
int result = sum(a,b);
System.out.println("result = " + result);
}
public static void method(int a,int b){
System.out.println(a+" "+b);
}
public static int sum(int a,int b){
int result =a + b;
return result;
}
1.Controller(表现层)接受的请求参数需要一层一层传递到service(业务层),service层需要将请求参数再传递到dao(持久层),此时service以及dao的方法都需要参数接收
2.dao层的结果需要传递给service,service再传递给controller层,此时dao层和service方法需要返回值
定义一个方法,比较两个整数的大小,如果第一个大于第二个,返回true,否则返回false
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
boolean Pare = Compare(a,b);//传递的是a和b代表的数据,不是变量本身
System.out.println("Pare = " + Pare);
}
public static boolean Compare(int a,int b){
if(a>b){
return true;
}else{
return false;
}
}
1.方法不调用不执行
2.方法的执行顺序只和调用顺序有关
3.方法之间不能互相嵌套
4.void不能和return结果共存,但是 void能和return共存
①void:代表没有返回值
②return 结果:就代表有返回值,先将结果返回,然后结束方法
③return:仅仅代表结束方法,不代表有返回值
5.一个方法中不能连续写多个return,也就是说,一个方法不能有多个返回值
6.调用方法时,先看一下方法有没有被定义,如果没有被定义将会直接报错
1.先定义在调用
2.如果是没有返回值的方法,直接再被调用的方法内部输出结果
3.如果是带返回值的方法,在调用完毕后,用一个变量去接受结果,输出这个变量
4.调用方法:
直接调用:方法名()或 方法名(实参) -> 只针对于无返回值的方法
打印调用:sout(方法名())或者 sout(方法名(实参)) -> 针对有返回值的方法,不推荐使用
赋值调用:数据类型 变量名 = 方法名() 或者 数据类型 变量名 = 方法名(实参) -> 针对于有返回值的方法,推荐使用
5.练习:
①如果定义的方法没有返回值,写个void,不要写renturn结果
②如果定义的方法有返回值,将void改为具体的返回值类型,在方法体中最后写一个return结果,将结果返回
③如果方法有返回值,调用的时候推荐使用赋值调用,如果没有返回值,使用直接调用
④练习的时候,完成一个简单的需求,针对这个需求,定义四种方法,并成功调用
键盘录入一个整数,将整数传递到另外一个方法中,在此方法中判断这个整数的奇偶性
如果是偶数,方法返回“偶数”,否则返回“奇数”
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请您输入一个整数");
int num = sc.nextInt();
String result = Judge(num);
System.out.println("result = " + result);
}
public static String Judge(int a){
if(a%2==0){
return "偶数";
}else{
return "奇数";
}
}
求出1-100的和,并将结果返回
public static void main(String[] args) {
int num = Sum();
System.out.println("num = " + num);
}
public static int Sum()
{
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
return sum;
}
定义一个方法,给这个方法传几,就让这个方法循环打印几次“一切都会好的”
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请您输入一个数,选择打印次数");
int num = sc.nextInt();
Print(num);
}
public static void Print(int a){
for (int i = 0; i < a; i++) {
System.out.println("一切都会好的");
}
}
在main方法中定义一个数组,将数组传递到方法中去,在此方法中遍历数组
public static void main(String[] args) {
int[] arr = new int[9];
Scanner sc = new Scanner(System.in);
System.out.println("请您给数组赋值");
int i = 0;
for (i = 0; i < 9; i++) {
arr[i] = sc.nextInt();
}
Print(arr);
}
public static void Print(int arr[]){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
return;
}
数组作为返回值返回
数组本身是引用数据类型,引用数据类型做方法参数传递,传递的是地址值
public static void main(String[] args) {
int[] arr=method();//用和方法类型相同类型的变量接收
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static int[] method(){
int a = 10;
int b = 20;
int sum = a+b;
int sub = a-b;
int[] arr1 = {sum,sub};
return arr1;//返回的是一个int[],那么返回值类型也应该是int[]
}
方法名相同 参数列表不同的方法
参数列表不同:
①参数个数不同
②参数类型不同
③参数类型顺序不同
定义一个方法,分别求2个整数相加,3个整数相加,4个整数相加
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = 3;
int d = 4;
sum(a,b);
sum(a,b,c);
sum(a,b,c,d);
}
//两个整数相加
public static void sum(int a,int b)
{
System.out.println("(a+b) = " + (a + b));
}
//三个整数相加
public static void sum(int a,int b,int c){
System.out.println("(a+b+c) = " + (a + b + c));
}
//四个整数相加
public static void sum(int a,int b,int c,int d){
System.out.println("(a+b+c+d) = " + (a + b + c + d));
}
1.判断两个方法是否为重载方法,与什么无关?
①和方法的参数名无关
②和方法的返回值无关
方法名严格区分大小写
2.什么时候用到方法的重载?
如果定义方法的功能一样,只不过实现细节不一样,就可以考虑定义成重载的方法