方法的使用,数组的使用

方法

  • Java里边叫方法,其实就是函数;自己编写一个函数定义好函数名,之后可以重复调用。
  • 为什么要有方法?
    觉得可以从重复性上来理解,段从程序需要重复使用,为了简洁高效,使用方法,只需调用方法,使得程序简洁高效;
  • 格式:
    修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2 …){
    方法体;
    return 返回值;
    }
    (1): 修饰符 比较多,后面会详细介绍。目前使用 public static
    (2): 返回值类型 用于限定返回值的数据类型
    (3): 方法名 就是一个名称,它的存在是为了方便我们调用方法
    (4): 参数类型 限定调用方法时传入参数的数据类型
    (5): 参数名 是一个变量,接收调用方法时传入的参数
    这个参数其实有一个专业的名词,被称之为形式参数,它的作用是用来接收实际参数的.
    (6): 方法体 完成功能的代码
    (7): return 结束方法以及返回方法指定类型的值
    (8): 返回值 就是功能的结果,由return带回,带回给调用者

案例

案例一:

package org.westos.demo2;
public class MyTest {
    public static void main(String[] args) {
        System.out.println("abc");
        //直接调用我们自己定义的方法
        fashe();
        fashe();
        fashe();
        fashe();
        fashe();
        fashe();
        fashe();
    }
    public static void fashe(){
        //方法体,你具体要实现的功能
        System.out.println("发射炮弹");

    }

}

注意

  1. 主方法,是一个程序的入口。主方法是JVM来调用的,一个类中只能有一个主方法
  2. 方法:就是对一段功能逻辑的封装,以实现重复调用。
  3. 方法定义在类中,方法跟方法是平级关系,不能嵌套定义
  4. 方法不调用不执行

案例二:

package org.westos.demo2;

public class MyTest2 {
    public static void main(String[] args) {
        //show();
        //show();
        int num = add2();
        System.out.println(num);
    }

    //void 无明确反回值类型
    public static void show() {
        System.out.println("微微一笑,很倾城");
    }

    //定义一个相加的功能
    public static void add() {
        System.out.println(1 + 1);
    }

    //我明确了这个方法的返回值类型是int类型
    //如果一个方法一旦明确了返回值类型,必须由 return 带回一个 与明确了类型一致的结果
    public static int add2() {
        int sum = 1 + 1;
        return sum;  //return 结束方法,并带回一个结果
    }
}

注意

  1. void无明确返回值类型
  2. 如果一个方法一旦明确了返回值类型,必须由 return 带回一个 与明确了类型一致的结果;
    案例三:
package org.westos.demo2;

public class MyTest3 {
    public static void main(String[] args) {
        System.out.println("主方法");
       int r= add(1,2);//当我们去调用一个有参数的方法时,必须传入与之相对应的参数(参数个数要对应,数据类型要对应)
        int aa=10;
        int bb=20;
        //当我们在调用方法时,传入的参数,叫做实际参数,简称实参,传常量,变量都可以
       int r2 =add(aa,bb);
        System.out.println(r);
        System.out.println(r2);

    }
    //定义方法括号里面的参数,叫做形式参数,简称形参。
    //形参的作用是,调用方法时,接收传过来的实参
    //多个形参你用逗号隔开
    public static int add(int a1,int b1){
        System.out.println("add方法执行了");
        int sum=a1+b1;
        return sum ;
    }

}

案例四:

package org.westos.demo2;

public class MyTest4 {
    public static void main(String[] args) {
        show();
        int r=show2();
        System.out.println(r);
        //如果一个方法有返回值,我们可以输出调用,打印返回的结果
        System.out.println(show2());
    }
    public static void show(){
        System.out.println("我在人民广场,吃着炸鸡");
        return; //结束方法 如果一个方法的返回值类型,是void 那么这个return 可以省略
    }
    public static int show2() {
        return 100; //结束方法 如果一个方法的返回值类型,是void 那么这个return 可以省略
    }
}

注意

  1. return功能是结束方法并且返回函数值;
  2. 对于返回的函数值,如果函数定义为void则为无明确返回值类型,return可以省略;

案例五:
需求:获取两个数中最大的数

package org.westos.demo3;

import java.util.Scanner;

public class MyTest {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个整数");
        int num1 = scanner.nextInt();
        System.out.println("请输入第二个整数");
        int num2 = scanner.nextInt();
        int max = getMax(num1, num2);
        System.out.println("最大值是" + max);
    }

    public static int getMax(int a, int b) {
        int max = a > b ? a : b;
        return max;
    }
}

注意
(IntelliJ idea_64)

  1. alt+enter 万能纠错键
  2. ctrl+alt+v 自动补全
  3. alt+enter 选第一项也会补全

案例六:
需求:输入两个值判断是否相等

package org.westos.demo3;

import java.util.Scanner;

public class MyTest2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个数字");
        int num1 = sc.nextInt();
        System.out.println("请输入第二个数字");
        int num2 = sc.nextInt();
        //获取,输出 是两个概念
        boolean flag = isEquals(num1, num2); //调用方法

        if (flag) {
            System.out.println("相等");
        } else {
            System.out.println("不相等");
        }


    }

    public static boolean isEquals(int a, int b) {

        boolean flag = false;
        if (a == b) {
            flag = true;
        } else {
            flag = false;
        }
        return flag;
    }
}

方法使用注意事项

  1. 方法不调用不执行
  2. 方法与方法是平级关系,不能嵌套定义
  3. 方法定义的时候参数之间用逗号隔开
  4. 方法调用的时候不用在传递数据类型
  5. 如果方法有明确的返回值,一定要由return带回一个值

案例七:
方法调用之新型输出
需求:根据键盘录入的数据输出对应的乘法表

package org.westos.demo3;


import java.util.Scanner;

public class MyTest3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个行数");
        int i = sc.nextInt();
        //调用方法
        showChengFaBiao(i);
    }

    public static void showChengFaBiao(int a) {
        for (int i = 1; i <= a; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "*" + i + "=" + (j * i) + "\t");
            }
            System.out.println();
        }
    }
}

注意“\t”为空一个tab距离

案例八:
需求:输入行列数并打印出指定行列的*阵

package org.westos.demo3;

import java.util.Scanner;

public class MyTest4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入行数");
        int num= scanner.nextInt();
        System.out.println("请输入列数");
        int num2 = scanner.nextInt();
        showStar(num,num2);

    }

    private static void showStar(int num, int num2) {
        for (int i = 0; i <= num; i++) {
            for (int i1 = 0; i1 <= num2; i++) {
                System.out.print("*");
            }
            System.out.println();
        }

    }
}

方法的重载和基本使用

  • 在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同,与返回值无关。
    参数列表不同:
    A:参数个数不同
    B:参数类型不同

案例九:

package org.westos.demo4;

public class MyTest {
    public static void main(String[] args) {
        //求和案例
        //2 个整数
        //3 个整数
        //4 个整数
        int sum1=add1(1,2);
        int sum2 = add2(1, 2,3);
        int sum3 = add3(1, 2,3,4);

        System.out.println(sum1);
        System.out.println(sum2);
        System.out.println(sum3);
    }

    private static int add(int i, int i1) {
        System.out.println("两个int参数方法调用了");
        return i + i1;
    }

    /**private static double add(int i, double i1) {
        System.out.println("一个int 一个double调用了");
        return i + i1;
    }*/

    private static int add(int i, int i1, int i2, int i3) {

        return i + i1 + i2 + i3;
    }

    private static int add(int i, int i1, int i2) {

        return i + i1 + i2;
    }


}

注意

  1. 方法重载:允许一个类中,可以出现多个同名方法,只要他们的参数个数不同,或者参数类型不同,就构成重载,不拿返回值类型来区分

数组

  • 数组的作用
    现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有80名员工,
    用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦。
    为了解决这种问题,Java就提供了数组供我们使用
    结论:
    数组是存储多个变量(元素)的东西(容器)
    这多个变量的数据类型要一致
  • 数组定义:
    数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
    数组既可以存储基本数据类型,也可以存储引用数据类型。
  • 数组定义格式
    格式1: 数据类型[] 数组名;
    格式2: 数据类型 数组名[];
    举例:
    int[] a; 定义了一个int类型的数组a;
    int a[]; 定义了一个int类型的a数组;
    推荐使用第一种定义方式

数组初始化

  • 为什么要初始化
    Java中的数组必须先初始化,然后才能使用。
    所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
  • 初始化分类:
    a:动态初始化: 只指定长度,由系统给出初始化值
    b:静态初始化: 给出初始化值,由系统决定长度
    注意事项: 这两种方式,只能使用一种,不能进行动静结合
  • 动态初始化格式:
    数据类型[] 数组名 = new 数据类型[数组长度];
    数组长度其实就是数组中元素的个数。
    举例: int[] arr = new int[3]; 定义了一个int类型的数组arr,这个数组可以存放3个int类型的值。

案例

package org.westos.demo2;

public class ArrayDemo {
    public static void main(String[] args) {

        //方式1:
        //创建一个int类型的数组
     
        int[] arr=new int[10];
        //往数组中放入数据 通过数组的索引往里面存数据
        arr[0]=10;
        arr[1]=20;
        arr[2]=30;
        //取数组中的元素
        int num=arr[2];
        System.out.println(num);
        System.out.println(arr[4]);
        System.out.println(arr[5]);

        //语法2
        boolean bs[]=new boolean[2];
        bs[0]=true;
        System.out.println(bs[0]);
        System.out.println(bs[1]);


    }
}

注意

  1. 动态的定义方式,由我们规定数组的长度,由系统赋默认值
  2. 当我们创建好了数组后,系统会给分配索引(角标)从0开始(默认赋值)

Java中的内存分配以及栈和堆的区别

A:栈: 存放的是局部变量
局部变量:在方法定义中或者方法声明上的变量都是局部变量。
B:堆: 存放的是所有new出来的东西
特点:
a: 每一个new出来的东西都会为其分配一个地址值。
b: 每一个变量都有一个默认的值
byte,short,int,long – 0
float,double – 0.0
char – ‘\u0000’
boolean – false
引用数据类型 – null
c: 使用完毕就变成了垃圾,等待垃圾回收器对其回收
C:方法区

案例

案例一;

package org.westos.demo3;

public class ArrayDemo {
    public static void main(String[] args) {
        double[] arr = new double[10]; //动态初始化
        System.out.println(arr[0]);
        System.out.println(arr[9]);
    }
}

总结:由结果我们可以看出动态初始化:为数组中的数组元素分配内存空间,并为每个数组元素赋值默认值为0;

案例二:

package org.westos.demo4;

public class ArrayDemo2 {
    public static void main(String[] args) {
        int[] arr1 = new int[3];
        arr1[0]=10;
        arr1[2]=200;
        int[] arr2 = new int[3];
        arr2[0]=11;
        arr2[1]=19;
        int[] arr3=arr1;
        arr3[0]=108;
        arr3[1]=106;
        arr1[1]=177;
        System.out.println(arr1[0]); //  108
        System.out.println(arr1[1]); // 177
        System.out.println(arr1[2]); // 200
        System.out.println(arr2[0]); // 11
        System.out.println(arr2[1]); // 19
        System.out.println(arr2[2]); // 0
        System.out.println(arr3[0]); // 108
        System.out.println(arr3[1]); // 177
        System.out.println(arr3[2]); // 200
    }
}

注意
通过输出值我们可以理解数组栈、堆、方法区及内存分配过程。数组内存分配过程理解

数组操作的两个常见小问题越界和空指针

  • a:ArrayIndexOutOfBoundsException:数组索引越界异常
    原因:你访问了不存在的索引。
  • b:NullPointerException:空指针异常
    原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。

案例

案例一:

package org.westos.demo5;
public class ArrayDemo {
    public static void main(String[] args) {
        //数组静态初始化,由我们赋值,由系统计算长度
        //数组一旦定义号,长度就固定了
        int[] arr = new int[]{10, 20, 30};
        boolean[] arr2 = new boolean[]{true, false, true, true};
        char[] arr3 = new char[]{'a', 100, 'b'};
        byte[] bytes = new byte[]{127, 100, 0, -128};
        long[] longs = new long[]{1L, 100L};
        float[] floats = new float[]{1F, 2.9F};

        //静态初始化的简写方式
        int[] arr6 = {10, 20, 30};

        //数组有一个长度属性
        int length = arr.length;
        System.out.println(length);
        int length1 = arr2.length;
        System.out.println(length1);
       // 数组中最后一个元素的索引=数组长度-1;
       int num=bytes[bytes.length-1];
        System.out.println(num);
        //关于数组的一些一异常
        arr[3]=100;
       // System.out.println(arr[3]); //ArrayIndexOutOfBoundsException 数组角标越界异常

    }
}

案例二:

package org.westos.demo5;

public class ArrayDemo2 {
    public static void main(String[] args) {
        int[] arr = new int[]{10, 20};
        arr = null;// 人为置空
        //NullPointerException 空指针异常
        int length = arr.length;
        System.out.println(length);
    }
}

数组的遍历

案例一:

package org.westos.demo6;


public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr={10,20,50,40,102};
       
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("---------------------------");
        //反向遍历
        for(int i=arr.length-1;i>=0;i--){
            System.out.println(arr[i]);
        }

    }
}

案例二:
求数组中元素极值

package org.westos.demo6;

public class ArrayDemo2 {
    public static void main(String[] args) {
        //获取数组中的最大值或最小值
        int[] arr = {10, 20, 50, 40, 102};
        int max = getMax(arr);
        System.out.println("最大值是" + max);

        int[] arr2 = {10, 20, 50, 40, 102,1000,1};
        int max1 = getMax(arr2);
        System.out.println("最大值是" + max1);
    }

    public static int getMax(int[] arr){

        //定义一个参照值
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }
}

案例三:
数组元素反转

package org.westos.demo6;

public class ArrayDemo3 {
    public static void main(String[] args) {

        int[] arr = {10, 20, 30, 40, 50}; //50 40 30 20 10

        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }

        //reverseArray(arr);
        showArray(arr);


    }

    //数组元素反转
    private static void reverseArray(int[] arr) {
        //分析:首尾元素值交换,遍历一半
        for (int i = 0; i < arr.length / 2; i++) {
            //采用中间变量进行值交换
            int t = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = t;

        }
    }

    private static void showArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
        }
    }


}

案例四:
需求:根据键盘录入索引, 查找对应星期

package org.westos.demo7;

import java.util.Scanner;

public class ArrayDemo8 {
    public static void main(String[] args) {

        String[] arr = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个整数 1----7");
        int index = scanner.nextInt();
        String str = getElementByArray(index, arr);
        System.out.println(str);
    }

    private static String getElementByArray(int index, String[] arr) {
        if (index >= 1 && index <= 7) {
            return arr[index - 1];
        } else {
            return "查无此元素";
        }
    }
}

案例五:
根据元素查索引

package org.westos.demo7;

import java.util.Scanner;

public class ArrayDemo9 {
    public static void main(String[] args) {
     
        String[] arr = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个星期");
        String str = scanner.nextLine();//获取用户输入的字符串
        int index = getIndex(str, arr);

        System.out.println("该元素的索引是" + index);
        
    }

    private static int getIndex(String str, String[] arr) {
        //遍历数组

        for (int i = 0; i < arr.length; i++) {
            if (str.equals(arr[i])) {
                return i;
            }

        }
        return -1; // 一般喜欢用 -1 代表没找到
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值