Day01 P1-P10

/*
创建一个原始二维数组11*11
0:没有子 1:黑子 2:白子
*/

import java.util.Scanner;

public class SparseArray {
    public static void main(String[] args) {
    int chessArr1[][] = new int[11][11];
    chessArr1[1][2] = 1;
    chessArr1[2][3] = 2;

    System.out.println("原始二维数组:");
    for(int[] row : chessArr1){
        for(int data : row){
            System.out.printf("%d\t", data);
        }
        System.out.println();
    }

    //二维数组 转 稀疏数组
    //先遍历二维数组,得到非零数据个数
    int sum = 0;
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            if (chessArr1[i][j] != 0) {
                sum++;
            }
        }
    }
    System.out.println(sum);
    //创建对应稀疏数组
    int sparseArr[][] = new int[sum + 1][3];
    //给稀疏数组赋值
    sparseArr[0][0] = 11;
    sparseArr[0][1] = 11;
    sparseArr[0][2] = sum;

    //遍历二维数组,将非零值放入稀疏数组中
    int count = 0;//用于记录第几个非零数据
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            if (chessArr1[i][j] != 0) {
                count++;
                sparseArr[count][0] = i;
                sparseArr[count][1] = j;
                sparseArr[count][2] = chessArr1[i][j];
            }
        }
    }

    //输出稀疏数组
    System.out.println("稀疏数组:");
    for (int i = 0; i < sparseArr.length; i++) {
        System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
    }
    System.out.println();

    //稀疏数组恢复成二维数组
    int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
    System.out.println();
    //从稀疏数组的第二行开始
    for (int i = 1; i < sparseArr.length; i++) {
        chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
    }
    for(int[] row : chessArr2){
        for(int data : row){
            System.out.printf("%d\t", data);
        }
        System.out.println();
    }

    }
}

Day07

匿名对象:

​ 没有显时名称

​ 匿名对象只能调用一次

匿名对象的使用:

package day07;

/**
 * @author SunWenhao
 * @create 2021/8/14
 */
public class InstanceTest {
    public static void main(String[] args) {
        Phone p = new Phone();
        p.playGame();
        p.sendEmail();

        //匿名对象
        new Phone().sendEmail();
        new Phone().playGame();
        new Phone().price = 1999;
        new Phone().showPrice();//和上方的对象不一样

        PhoneMall mall = new PhoneMall();
        //mall.show(p);
        mall.show(new Phone());
    }
}

class Phone{
    double price;

    public void sendEmail(){
        System.out.println("看电影");
    }

    public void playGame(){
        System.out.println("玩游戏");
    }

    public void showPrice(){
        System.out.println("手机价格为:" + price);
    }
}

class PhoneMall{

    public void show(Phone phone){
        phone.sendEmail();
        phone.playGame();
    }
}

自定义数组工具类:

方法:

方法的重载

可变形参的方法

方法参数的值传递机制*

递归方法

重载:

定义:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

两同一不同:同一个类、同一个方法名、参数列表不同,参数个数不同

判断是否是重载:

跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系

总结:"两同一不同":同一个类、相同方法名
参数列表不同:参数个数不同,参数类型不同

在通过对象调用方法时,如何确定指定方法:

​ 方法名(可能有重载)---参数列表

package day07;

/**
 * @author SunWenhao
 * @create 2021/8/15
 */
public class OverLoadExer {
    public static void main(String[] args) {
    OverLoadExer test = new OverLoadExer();
    test.mOL(2);
    test.mOL(2,3);
    test.mOL("Hello");
    System.out.println(test.max(3.14,8.56,6.98));
    }

    public void mOL(int i){
        System.out.println(i * i);
    }

    public void mOL(int i,int j){
        System.out.println(i * j);
    }

    public void mOL(String s){
        System.out.println(s);
    }

    public int max(int i,int j){
        return (i > j)? i : j;
    }

    public double max(double d1,double d2){
        return (d1 > d2)? d1 : d2;
    }

    public double max(double d1,double d2,double d3){
        double max = (d1 > d2)? d1 : d2;
        return (max > d3)? max : d3;
    }
}

可变个数形参:(JDK5.0新增)

格式:数据类型 ... 变量名

  • 调用可变个数形参方法时,传入参数个数可以是0、1、2 ... ... 多个;

  • 可变个数形参方法与本类中同一个类、同一个方法名、参数列表不同,参数个数不同方法之间构成重载;

  • 可变个数形参方法必须声明在末尾

package day07;

/**
 * @author SunWenhao
 * @create 2021/8/15
 */
public class MethodArgsTest {

    public static void main(String[] args) {
        MethodArgsTest test = new MethodArgsTest();
        test.show(12);
        test.show("Hello");
        test.show("Hello1","Hello2");
    }

    public void show(int i){

    }

    public void show(String s){

    }

    public void show(String ... strs){
        for (int i = 0; i < strs.length; i++) {
            System.out.println(strs[i]);
        }
    }

//不可以共存
//    public void show(String[] strs){
//
//    }
}

方法参数的值传递机制:

如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值

如果参数时基本数据类型,此时实参赋给形参的时实参真实存储的数据值

方法形参传递机制:值传递

形参:方法定义时小括号内的参数

实参:给形参赋的值

值传递机制?:

package day07;

/**
 * @author SunWenhao
 * @create 2021/8/15
 */
//public class ValueTransferTest {
//    public static void main(String[] args) {
//        int m = 10;
//        int n = m;
//        System.out.println("m:"+ m + "," + "n:" + n);
//        n = 20;
//        System.out.println("m:"+ m + "," + "n:" + n);
//
//
//        System.out.println();
//        Order o1 = new Order();
//        o1.orderId = 1001;
//        Order o2 = o1;
//        System.out.println(o1.orderId + " " + o2.orderId);
//        o2.orderId = 1002;
//        System.out.println(o1.orderId + " " + o2.orderId);

        //方法形参传递机制:值传递
        //形参:方法定义时小括号内的参数
        //实参:给形参赋的值

public class ValueTransferTest {
        public static void main(String[] args) {
        ValueTransferTest test = new ValueTransferTest();

        int m = 10;
        int n = 20;
        System.out.println("m:"+ m + "," + "n:" + n);
        int temp = m;
        m = n;
        n = temp;
        System.out.println("m:"+ m + "," + "n:" + n);
        test.swap(m,n);

        System.out.println("m:"+ m + "," + "n:" + n);//这里的m、n仍然是main方法中的,所以不会变


    }
    public void swap(int m,int n){
        int temp = m;
        m = n;
        n = temp;
        System.out.println("m:"+ m + "," + "n:" + n);
    }
}

递归(了解):

在一个方法体中自己调自己

方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。

递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。

package day07;

/**
 * @author SunWenhao
 * @create 2021/8/15
 */

//计算1-100所有自然数的和
public class Recursion {
    public static void main(String[] args) {
        int sum = 0;
        Recursion test = new Recursion();
//        for (int i = 0; i < 100; i++) {
//            sum = sum + i;
//        }
        sum = test.getSum(20);
        System.out.println(sum);
    }
    public int getSum(int n){
        if (n == 1){
            return 1;
        }else {
            return n + getSum(n - 1);
        }
    }
}

斐波那契数列:

package day07;

/**
 * @author SunWenhao
 * @create 2021/8/15
 */
public class Fibonacci {
    public static void main(String[] args) {
        Fibonacci test = new Fibonacci();
        System.out.println(test.Calculate(10));
    }

    public int Calculate(int n){
        if (n == 1){
            return 1;
        }else if (n == 2){
            return 1;
        }else{
            int fibonacci;
            fibonacci = Calculate(n - 1) + Calculate(n -2);
            return fibonacci;
        }


    }
}