手记

【JavaSE(二)】Java语法基础(下)

原文地址:https://www.cloudcrossing.xyz/post/34/

1 方法

1.1 方法的概述

方法,简单的说就是完成特定功能的代码块(注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法)。

格式:

修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
    方法体语句;    return 返回值;
}

格式解释:

  • 修饰符:目前就用 public static,后面再详细讲解其他修饰符

  • 返回值类型:就是功能结果的数据类型

  • 方法名:就是起了一个名字,方便调用该方法

  • 参数类型:就是参数的数据类型

  • 参数名:就是变量

  • 参数分类:

    • 实参:实际参与运算的数据

    • 形参:方法上定义的,用于接收实际参数的变量

  • 方法体语句:就是完成功能的代码块

  • return:结束方法

  • 返回值:就是功能的结果,由return带给调用者

注意:

  • 要明确返回值类型:结果的数据类型

  • 方法与方法是平级关系,不能嵌套定义

  • 参数列表:参数的个数及对应的数据类型,参数之间用逗号隔开

  • 如果方法有明确的返回值,一定要有return带回一个值

方法的调用:

class FunctionDemo {    public static void main(String[] args) {        int x = 10;        int y = 20;        
        //方式1:单独调用,没有意义(void类型的方法可以单独调用)
        //sum(x,y);
    
        //方式2:输出调用(void类型会报错:此处不允许使用 '空' 类型)
        //System.out.println(sum(x,y));
        //System.out.println(30);
    
        //方式3:赋值调用(void类型会报错:非法的表达式开始)
        int result = sum(x,y);        //result在这里可以进行操作
        System.out.println(result);
    }    
    public static int sum(int a,int b) {            //int c = a + b;
            //return c;
            return a + b;
    }
    
}

1.2 方法重载

在同一个类中,方法名相同,参数列表不同。与返回值类型无关

参数列表不同:

  • A:参数个数不同

  • B:参数类型不同

class FunctionDemo {    public static void main(String[] args) {        //jvm会根据不同的参数去调用不同的功能
        System.out.println(sum(10,20));
        System.out.println(sum(10,20,30));
        System.out.println(sum(10,20,30,40));
        System.out.println(sum(10.5f,20f));
    }    //需求1:求两个数的和
    public static int sum(int a,int b) {
        System.out.println("int");        return a + b;
    }    
    //需求2:求三数的和
    public static int sum(int a,int b,int c) {        return a + b + c;
    }    
    //需求3:求四个数的和
    public static int sum(int a,int b,int c,int d) {        return a + b + c + d;
    }    
    //需求3:求两个浮点数的和
    public static float sum(float a,float b) {
        System.out.println("float");        return a + b;
    }
}

2 数组

2.1 数组概述

数组是存储同一种数据类型的多个元素的容器。每一个元素都有索引,从0开始,最大索引是长度-1

数组既可以存储基本数据类型,也可以存储引用数据类型。

定义格式:

  • A:数据类型[] 数组名; (推荐)

  • B:数据类型 数组名[];

java中的数组必须先初始化然后才能使用。所谓的初始化即为数组中的数组元素分配内存空间,并为每个数组元素赋值。

数组的初始化:

  • java中的数组必须先初始化然后才能使用

  • A:动态初始化。只给长度,系统给出默认值

    • 举例:int[] arr = new int[3];

  • B:静态初始化。给出值,系统决定长度

    • 举例:int[] arr = new int[]{1,2,3}; 或者 int[] arr = {1,2,3};

2.2 数组内存分配

Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

  • A:栈,通常保存方法中的参数,局部变量。每一个线程包含一个栈区,只保存基本数据类型的对象和自定义对象的引用(不是对象),对象都存放在共享堆中;每个栈中的数据(基本数据类型和对象引用)都是私有的,其他栈不能访问;

  • B:堆,存储所有new出来的,即存储的全部是对象。每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令)。jvm只有一个堆区,被所有线程共享,不存放基本类型和对象引用,只存放对象本身。

  • C:方法区(面向对象部分详细讲解),又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。方法区中包含的都是在程序中永远的唯一的元素

  • D:本地方法区(系统相关)

  • E:寄存器(CPU使用)

注意:

  • a:局部变量 在方法定义中或者方法声明上定义的变量

  • b:栈内存和堆内存的区别

    • byte,short,int,long——0

    • float,double——0.0

    • char——'\u0000'

    • boolean——false

    • 引用类型——null

    • 栈:数据使用完毕,就消失。比如局部变量

    • 堆:每一个new出来的东西都有地址,每一个变量都有默认值

  • C:数据使用完毕后,在垃圾回收器空闲的时候回收

(1)定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素。

定义一个数组的内存图

(2)定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素。

定义两个数组的内存图

(3)定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。然后给第二个数组赋值,再次输出两个数组的名及元素。

三个数组(两个栈变量指向同一个堆内存)

2.3 数组常用操作

(1)遍历

public static void printArray(int[] arr) {    for(int x=0; x<arr.length; x++) {
        System.out.println(arr[x]);
}

注意:数组提供了一个属性length,用于获取数组的长度。格式:数组名.length

(2)最值

public static int getMax(int[] arr) {    //从数组中任意的找一个元素作为参照物
    int max = arr[0];    //然后遍历其他的元素
    for(int x=1; x<arr.length; x++) {    //依次获取和参照物进行比较,如果大就留下来,如果小,就离开。
        if(arr[x] > max) {
            max = arr[x];
        }
    }    //最后参照物里面保存的就是最大值。
    return max;
}    
public static int getMin(int[] arr) {    //从数组中任意的找一个元素作为参照物
    int min = arr[0];    //然后遍历其他的元素
    for(int x=1; x<arr.length; x++) {    //依次获取和参照物进行比较,如果小就留下来,如果大,就离开。
        if(arr[x] < min) {
            min = arr[x];
        }
    }    //最后参照物里面保存的就是最小值。
    return min;
}

(3)逆序

方式1:public static void reverse(int[] arr) {    for(int x=0; x<arr.length/2; x++) {        int temp = arr[x];
        arr[x] = arr[arr.length-1-x];
        arr[arr.length-1-x] = temp;
    }
}
                
方式2:public static void reverse(int[] arr) {    for(int start=0,end=arr.length-1; start<=end; start++,end--) {        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
    }
}

(4)查表

public static String getString(String[] strArray,int index) {    return strArray[index];
}

(5)基本查找

方式1:public static int getIndex(int[] arr,int value) {    for(int x=0; x<arr.length; x++) {        if(arr[x] == value) {            return x;
        }
    }    return -1;
}
                
方式2:public static int getIndex(int[] arr,int value) {    int index = -1;    for(int x=0; x<arr.length; x++) {        if(arr[x] == value) {
            index = x;            break;
        }
    }    return index;
}

2.4 二维数组

二维数组是一个元素是一位数组的数组。

格式:

  • A:数据类型[][] 数组名 = new 数据类型[m][n];

  • B:数据类型[][] 数组名 = new 数据类型[m][];

  • C:数据类型[][] 数组名 = new 数据类型[][]{{...},{...},{...}};

  • D:数据类型[][] 数组名 = {{...},{...},{...}};

PS:m表示这个二维数组有多少个一维数组。n表示每一个一维数组的元素有多少个。

二维数组格式A的内存图解

二维数组格式B的内存图解

二维数组格式D的内存图解

二维数组的遍历:外循环控制的是二维数组的长度,其实就是一维数组的个数。内循环控制的是一维数组的长度。

class Array2 {    public static void main(String[] args) {        int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};  //arr[0]就是第一个数组,arr[0] = {1,2,3};
        printArray2(arr);
        System.out.println("--------------");        int[][] arr2 = {{1,2,3},{4,5},{6}};
        printArray2(arr2);
    }    
    public static void printArray2(int[][] arr) {        for(int x=0; x<arr.length; x++) {            for(int y=0; y<arr[x].length; y++) {  //arr[x]就是第x-1个数组
                System.out.print(arr[x][y]+" ");
            }
            System.out.println();
        }
    }
}

举个二维数组的应用例子

/*

    需求:打印杨辉三角形(行数可以键盘录入)
    
    1
    1 1 
    1 2 1
    1 3 3 1
    1 4 6 4 1 
    1 5 10 10 5 1

    分析:看这种图像的规律
        A:任何一行的第一列和最后一列都是1
        B:从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
    
    步骤:
        A:首先定义一个二维数组。行数如果是n,我们把列数也先定义为n。
          这个n的数据来自于键盘录入。
        B:给这个二维数组任何一行的第一列和最后一列赋值为1
        C:按照规律给其他元素赋值
            从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
        D:遍历这个二维数组。
*/import java.util.Scanner;class Array2Test {    public static void main(String[] args) {        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);        
        //这个n的数据来自于键盘录入。
        System.out.println("请输入一个数据:");        int n = sc.nextInt();        
        //定义二维数组
        int[][] arr = new int[n][n];        
        //给这个二维数组任何一行的第一列和最后一列赋值为1
        for(int x=0; x<arr.length; x++) {
            arr[x][0] = 1; //任何一行第1列
            arr[x][x] = 1; //任何一行的最后1列
        }        
        //按照规律给其他元素赋值
        //从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
        for(int x=2; x<arr.length; x++) {            //这里如果y<=x是有个小问题的,就是最后一列的问题
            //所以这里要减去1
            //并且y也应该从1开始,因为第一列也是有值了
            for(int y=1; y<=x-1; y++) {                //每一个数据是它上一行的前一列和它上一行的本列之和。
                arr[x][y] = arr[x-1][y-1] + arr[x-1][y];
            }
        }        
        //遍历这个二维数组。
        for(int x=0; x<arr.length; x++) {            for(int y=0; y<=x; y++) {
                System.out.print(arr[x][y]+"\t");
            }
            System.out.println();
        }
    }
}

3 参数传递问题

Java中的参数传递问题:

  • 基本类型:形式参数的改变对实际参数没有影响

  • 引用类型:形式参数的改变直接影响实际参数

class ArgsDemo {    public static void main(String[] args) {        int a = 10;        int b = 20;
        System.out.println("a:"+a+",b:"+b); //输出:a:10,b:20
        change(a,b);
        System.out.println("a:"+a+",b:"+b); //输出:a:10,b:20

        int[] arr = {1,2,3,4,5}; 
        change(arr);
        System.out.println(arr[1]); //输出:4
    }    public static void change(int a,int b) { //a=10,b=20
        System.out.println("a:"+a+",b:"+b); //a:10,b:20
        a = b;  //a=20
        b = a + b; //b=40
        System.out.println("a:"+a+",b:"+b); //a:20,b:40
    }    public static void change(int[] arr) { //arr={1,2,3,4,5};
        for(int x=0; x<arr.length; x++) {            if(arr[x]%2==0) {
                arr[x]*=2;
            }
        }        //arr={1,4,3,8,5};
    }
}
#运行结果:a:10,b:20a:10,b:20a:20,b:40a:10,b:204


4 语言基础综合练习

某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:

  • 首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数,然后,把加密后的结果在控制台打印出来。

题目要求:
        A:数据是小于8位的整数
            定义一个int类型的数据            int number = 123456;
        B:加密规则
            a:首先将数据倒序
                结果 654321
            b:然后将每位数字都加上5,再用和除以10的余数代替该数字
                结果 109876
            c:最后将第一位和最后一位数字交换
                结果 609871
        C:把加密后的结果输出在控制台
        
        通过简单的分析,我们知道如果我们有办法把这个数据变成数组就好了。
        不是直接写成这个样子的:            int[] arr = {1,2,3,4,5,6};
            
        如何把数据转成数组呢?
            A:定义一个数据                int number = 123456;
            B:定义一个数组,这个时候问题就来了,数组的长度是多少呢?                int[] arr = new int[8]; //不可能超过8
                在赋值的时候,我用一个变量记录索引的变化。
                定义一个索引值是0
                int index = 0;
            C:获取每一个数据                int ge = number%10
                int shi = number/10%10
                int bai = number/10/10%10
                
                arr[index] = ge;
                index++;
                arr[index] = shi;
                index++;
                arr[index] = bai;
                ...
import java.util.Scanner;class JiaMiDemo2 {    public static void main(String[] args) {        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);        
        //请输入一个数据
        System.out.println("请输入一个数据(小于8位):");        int number = sc.nextInt();        
        //写功能实现把number进行加密
        //调用
        String result = jiaMi(number);
        System.out.println("加密后的结果是:"+result);
    }    
    /*
        需求:写一个功能,把数据number实现加密。
        两个明确:
            返回值类型:String 做一个字符串的拼接。
            参数列表:int number
    */
    public static String jiaMi(int number) {        //定义数组
        int[] arr = new int[8];        
        //定义索引
        int index = 0;        
        //把number中的数据想办法放到数组中
        while(number > 0) {
            arr[index] = number%10;
            index++;
            number /= 10;
        }        
        //把每个数据加5,然后对10取得余数
        for(int x=0; x<index; x++) {
            arr[x] += 5;
            arr[x] %= 10;
        }        
        //把第一位和最后一位交换
        int temp = arr[0];
        arr[0] = arr[index-1];
        arr[index-1] = temp;        
        //把数组的元素拼接成一个字符串返回
        //定义一个空内容字符串
        String s = "";        
        for(int x=0; x<index; x++) {
            s += arr[x];
        }        
        return s;
    }
}



作者:苍云横渡
链接:https://www.jianshu.com/p/b7d0963dee78
來源:简书


0人推荐
随时随地看视频
慕课网APP