Java-day07研究ノート

2021-01-06

day06レビュー

ここに画像の説明を挿入

1.方法

1.1メソッドのオーバーロード

同じクラスで、メソッド名は同じで、パラメーターリストは異なり、戻り値の型とは関係ありません。

参数列表不同的三种情况:
1. 个数不同
2. 类型不同
3. 个数相同,类型也相同,但是前后位置不同
public class Demo {
    
    

    public static void main(String[] args) {
    
    

        System.out.println(sum(3, 5));
        System.out.println(sum(3.0, 5.0));
        System.out.println(sum(3, 5, 8));
        System.out.println(sum(3, 5, 8, 10));
    }

    /*
        求两个整数的和

        两个明确:
            返回值类型: int
            参数列表: int a, int b
     */
    public static int sum(int a, int b){
    
    

        System.out.println("int...int...");
        return a + b;
    }

    /*
        求两个小数的和

        两个明确:
            返回值类型: double
            参数列表: double a, double b
     */
    public static double sum(double a, double b){
    
    

        System.out.println("double...double...");
        return a + b;
    }

    /*
        求三个整数的和

        两个明确:
            返回值类型: int
            参数列表: int a, int b, int c
     */
    public static int sum(int a, int b, int c){
    
    

        System.out.println("int...int...int...");
        return a + b + c;
    }

    /*
        求四个整数的和

        两个明确:
            返回值类型: String
            参数列表: int a, int b, int c, int d
     */
    public static String sum(int a, int b, int c, int d){
    
    

        System.out.println("int...int...int...int...");
        return "" + (a + b + c + d);
    }

}

以前に見られたメソッドのオーバーロード:

print
println

1.2ネストされたメソッド呼び出し

1つのメソッドで、他のメソッドを呼び出すことができます

public class Demo3 {
    
    

    public static void main(String[] args) {
    
    

        System.out.println("进入了main...");
        fun1();
        System.out.println("出去了main...");
    }

    private static void fun1() {
    
    

        System.out.println("进入了fun1...");
        fun2();
        System.out.println("出去了fun1...");
    }

    private static void fun2() {
    
    

        System.out.println("进入了fun2...");
        System.out.println("出去了fun2...");
    }
}
/*
结果:
    进入了main...
    进入了fun1...
    进入了fun2...
    出去了fun2...
    出去了fun1...
    出去了main...
  */

1.3メソッドの再帰

メソッドはそれ自体を呼び出します

注:再帰には出口が必要です(そうでない場合、再帰は停止せずに相互に呼び出し続けます)

练习:
	求5的阶乘
/*
    求5的阶乘
    1! = 1
    2! = 2*1
    3! = 3*2*1
    4! = 4*3*2*1
    5! = 5*4*3*2*1
 */
public class Test {
    
    

    public static void main(String[] args) {
    
    

        //方式一:for循环
        /*
        int jc = 1;
        for(int i = 1; i <= 5; i++){

            jc *= i;
        }

        System.out.println("5的阶乘结果为:" + jc);
        */

        //方式二:递归
        System.out.println(jc(5));

    }

    /*
           两个明确:
                返回值类型:int
                参数列表:int x
     */
    public static int jc(int x){
    
      //x = 2

        if(x == 1){
    
    
            return 1;
        }

        return x * jc(x-1);
    }

}

ここに画像の説明を挿入

ここに画像の説明を挿入

第二に、配列

配列はコンテナです。配列コンテナは、同じデータ型の複数の要素を格納できます。

2.1配列宣言

数据类型[] 数组名 = new 数据类型[数组的长度];
补充格式:数据类型 数组名[] = new 数据类型[数组的长度];

解释:
	数据类型:存放元素的类型,这个类型可以是基本数据类型,也可以是引用数据类型
	[]:表明了这是一个一维数组
	数组名:  就是一个变量名,符合命名规范即可(第一个单词全部小写,从第二个单词开始首字母大写)
	=:将创建好的数组的地址赋值给数组名
	new:是一个关键字,用来在堆内存上创建对象
	数据类型:同上
	数组的长度:数组中能存放多少元素(一旦定义好,就不能再次修改)

2.2アレイの初期化

配列の初期化は、初期化値を配列に割り当てることです

方式一:动态初始化(先声明一个数组,然后赋值)
		格式:
		数据类型[] 数组名 = new 数据类型[数组的长度];
		数组名[索引] = 数据;

方式二:静态初始化(在声明一个数组的同时就赋值)
		格式:
		数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3, ...};
		简化格式:
		数据类型[] 数组名 = {元素1, 元素2, 元素3, ...};
		
补充:索引是什么?
	索引就是数组存放数据的位置,这个位置一般是从0开始计数的。索引又被称为下标、角标

2.3配列データの取得

数组名[索引]
public class Demo {
    
    

    public static void main(String[] args) {
    
    

        //数组的声明:数据类型[] 数组名 = new 数据类型[数组的长度];
        int[] arr = new int[3];   //创建了一个能存放3个int类型的元素

        System.out.println(arr);  //[I@1b6d3586

        //方式一:动态初始化
        arr[0] = 11;
        arr[1] = 22;
        arr[2] = 33;

        //从数组中获取元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }

}
public class Demo2 {
    
    

    public static void main(String[] args) {
    
    

        //方式二:静态初始化
//        int[] arr = new int[]{11, 22, 33};

        //简化格式:
        int[] arr = {
    
    11, 22, 33};

        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

    }
}

2.4配列名の印刷内容

int[] arr = new int[3];
System.out.println(arr);   //[I@1b6d3586

[I@1b6d3586

解释:
[:表明这是一个一维数组
I:表明这是一个int类型的数组
@:就是一个连接符,'@'
1b6d3586:实际上是真正地址的hashCode值的十六进制表示形式(相当于是地址)

2.5JVMのメモリ分割

栈:存放局部变量以及方法执行的地方
堆:存放的都是对象(也就是new出来的内容)
方法区:存放的有静态的变量、常量、方法、字节码文件
本地方法区:存放的由C或C++等组成的本地方法
程序计数器:控制程序的执行顺序的

补充:什么是局部变量?
	局部变量就是定义在方法上或者方法内部的变量

2.6配列のメモリマップ

①配列のメモリマップ

public class PicDemo {
    
    

    public static void main(String[] args) {
    
    

        int[] arr = new int[3];

        System.out.println(arr);      //[I@1b6d3586
        System.out.println(arr[0]);   //0
        System.out.println(arr[1]);   //0
        System.out.println(arr[2]);   //0
        System.out.println("----------------");

        arr[0] = 11;
        arr[1] = 22;
        arr[2] = 33;

        System.out.println(arr);     //[I@1b6d3586
        System.out.println(arr[0]);  //11
        System.out.println(arr[1]);  //22
        System.out.println(arr[2]);  //33

    }
}

ここに画像の説明を挿入

②2つのアレイのメモリマップ

public class PicDemo2 {
    
    

    public static void main(String[] args) {
    
    

        //第一个数组
        int[] arr = new int[3];

        arr[0] = 11;
        arr[1] = 22;
        arr[2] = 33;

        System.out.println(arr);    //[I@1b6d3586
        System.out.println(arr[0]); //11
        System.out.println(arr[1]); //22
        System.out.println(arr[2]); //33
        System.out.println("----------------");

        //第二个数组
        int[] arr2 = new int[3];    //每new一次,都会在堆上开辟一个新的空间

        arr2[0] = 77;
        arr2[1] = 88;
        arr2[2] = 99;

        System.out.println(arr2);    //[I@4554617c
        System.out.println(arr2[0]); //77
        System.out.println(arr2[1]); //88
        System.out.println(arr2[2]); //99

    }
}

③2つの参照が同じ配列を指している

public class PicDemo3 {
    
    

    public static void main(String[] args) {
    
    

        int[] arr = new int[3];

        System.out.println(arr);    //[I@1b6d3586
        System.out.println(arr[0]); //0
        System.out.println(arr[1]); //0
        System.out.println(arr[2]); //0
        System.out.println("----------------");

        arr[0] = 11;
        arr[1] = 22;
        arr[2] = 33;

        //将引用arr赋值给引用arr2
        int[] arr2 = arr;
        System.out.println(arr2[0]);  //11
        System.out.println(arr2[1]);  //22
        System.out.println(arr2[2]);  //33
        System.out.println("----------------");

        arr2[1] = 99;

        System.out.println(arr[0]);  //11
        System.out.println(arr[1]);  //99
        System.out.println(arr[2]);  //33
        System.out.println("----------------");

        System.out.println(arr2[0]); //11
        System.out.println(arr2[1]); //99
        System.out.println(arr2[2]); //33

    }
}

ここに画像の説明を挿入

2.7アレイの拡張

例:array int [] arr = new int [3]; 3つの要素しか格納できませんが、この配列に4つの要素を格納するにはどうすればよいですか?

import java.util.Arrays;

/**
 * 数组的扩容
 */
public class Demo {
    
    

    public static void main(String[] args) {
    
    

        int[] arr = {
    
    11, 22, 33};

        //方式一:新建一个数组,然后将新数组的地址赋值给原数组
        /*
        //1. 新建一个数组,比原数组的长度大1
        int[] arr_xin = new int[4];
        //2. 遍历原数组将原数组中的内容,赋值给新数组
        for(int i = 0; i < 3; i++){
            arr_xin[i] = arr[i];
        }
        //3. 将新数组的地址赋值给原数组
        arr = arr_xin;
        */

        /*
            方式二:通过Arrays中提供的copyOf方法

            copyOf(int[] arr, int newLength)
                参数arr:是要被扩容的原数组
                参数newLength:是要扩容后的长度
         */
         
        /*
        //1. 通过Arrays的copyOf方法产生一个指定长度的新数组
        int[] arr_xin = Arrays.copyOf(arr, 4);
        //2. 将新数组的地址赋值给原数组
        arr = arr_xin;
        */

        /*
            方式三:通过System类中提供的arraycopy方法

            arraycopy(int[] src, int srcPos, int[] dest, int destPos, int length)
                参数src:是原数组
                参数srcPos:是从原数组哪个索引开始复制(starting position in the source array.)
                参数dest:是新数组
                参数destPos:从新数组哪个索引开始(starting position in the destination data.)
                参数length:是复制多个长度
         */
         
        int[] arr_xin = new int[4];
        System.arraycopy(arr, 0, arr_xin, 0, 3);

        arr = arr_xin;

        //访问
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println(arr[3]);
    }
}

おすすめ

転載: blog.csdn.net/ChangeNone/article/details/112282422