Java-Python-Django社区程序员涨知识

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

2018-05-09  本文已影响183人  苍云横渡

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

1 方法

1.1 方法的概述

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

格式:

修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
    方法体语句;
    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 方法重载

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

参数列表不同:

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

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

定义格式:

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

数组的初始化:

2.2 数组内存分配

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

注意:

(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 二维数组

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

格式:

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:20
a:10,b:20
a:20,b:40
a:10,b:20
4

4 语言基础综合练习

某个公司采用公用电话传递数据信息,数据是小于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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读