Java学习-详述main方法、可变参数、数组的工具类、二维数组

详述main方法

【1】main方法:程序的入口,在同一个类中,如果有多个方法,那么虚拟机就会识别main方法,从这个方法作为程序的入口

【2】main方法格式严格要求:

public static void main(String[] args){}

public static --->修饰符 ,暂时用这个 -->面向对象一章

void --->代表方法没有返回值 对应的类型void

main --->见名知意名字

String[] args --->形参 ---》不确定因素

【3】问题:程序中是否可以有其他的方法也叫main方法?

可以,构成了方法的重载。

  1. public class TestArray10{
  2. public static void main(String[] args){
  3. }
  4. public static void main(String str){
  5. }
  6. }

【4】形参为String[] 那么实参到底是什么?

  1. public class TestArray10{
  2. public static void main(String[] args){
  3. //从侧面验证:
  4. //int[] arr1; //如果对数组只声明,没有后续操作,那么相当于 白定义了。
  5. //int[] arr2 = null;
  6. //System.out.println(arr2.length);//Exception in thread "main" java.lang.NullPointerException
  7. //int[] arr3 = new int[0];
  8. //System.out.println(arr3.length);
  9. //int[] arr4 = new int[4];
  10. //System.out.println(arr4.length);
  11. //System.out.println(args.length);//0
  12. //从这个结果证明,参数是String[],实参是 new String[0]
  13. //默认情况下,虚拟机在调用main方法的时候就是传入了一个长度为0的数组
  14. System.out.println(args.length);
  15. for(String str:args){
  16. System.out.println(str);
  17. }
  18. }
  19. }

手动传入实参:

有特殊符号的时候可以加上""

没有特殊符号用空格隔开即可:

可变参数
  1. public class TestArray12{
  2. /*
  3. 1.可变参数:作用提供了一个方法,参数的个数是可变的 ,解决了部分方法的重载问题
  4. int...num
  5. double...num
  6. boolean...num
  7. 2.可变参数在JDK1.5之后加入的新特性
  8. 3.方法的内部对可变参数的处理跟数组是一样
  9. 4.可变参数和其他数据一起作为形参的时候,可变参数一定要放在最后
  10. 5.我们自己在写代码的时候,建议不要使用可变参数。
  11. */
  12. public static void main(String[] args){
  13. //method01(10);
  14. //method01();
  15. //method01(20,30,40);
  16. method01(30,40,50,60,70);
  17. //method01(new int[]{11,22,33,44});
  18. }
  19. public static void method01(int num2,int...num){
  20. System.out.println("-----1");
  21. for(int i:num){
  22. System.out.print(i+"\t");
  23. }
  24. System.out.println();
  25. System.out.println(num2);
  26. }
  27. }
Arrays工具类

为了方便我们对数组进行操作,系统提供一个类Arrays,我们将它当做工具类来使用。

  1. import java.util.Arrays;
  2. public class TestArray13{
  3. public static void main(String[] args){
  4. //给定一个数组:
  5. int[] arr = {1,3,7,2,4,8};
  6. //toString:对数组进行遍历查看的,返回的是一个字符串,这个字符串比较好看
  7. System.out.println(Arrays.toString(arr));
  8. //binarySearch:二分法查找:找出指定数组中的指定元素对应的索引:
  9. //这个方法的使用前提:一定要查看的是一个有序的数组:
  10. //sort:排序 -->升序
  11. Arrays.sort(arr);
  12. System.out.println(Arrays.toString(arr));
  13. System.out.println(Arrays.binarySearch(arr,4));
  14. int[] arr2 = {1,3,7,2,4,8};
  15. //copyOf:完成数组的复制:
  16. int[] newArr = Arrays.copyOf(arr2,4);
  17. System.out.println(Arrays.toString(newArr));
  18. //copyOfRange:区间复制:
  19. int[] newArr2 = Arrays.copyOfRange(arr2,1,4);//[1,4)-->1,2,3位置
  20. System.out.println(Arrays.toString(newArr2));
  21. //equals:比较两个数组的值是否一样:
  22. int[] arr3 = {1,3,7,2,4,8};
  23. int[] arr4 = {1,3,7,2,4,8};
  24. System.out.println(Arrays.equals(arr3,arr4));//true
  25. System.out.println(arr3==arr4);//false ==比较左右两侧的值是否相等,比较的是左右的地址值,返回结果一定是false
  26. //fill:数组的填充:
  27. int[] arr5 = {1,3,7,2,4,8};
  28. Arrays.fill(arr5,10);
  29. System.out.println(Arrays.toString(arr5));
  30. }
  31. }
数组的复制操作

原理:

代码:

  1. import java.util.Arrays;
  2. public class TestArray14{
  3. public static void main(String[] args){
  4. //给一个源数组:
  5. int[] srcArr = {11,22,33,44,55,66,77,88};
  6. //给一个目标数组:
  7. int[] destArr = new int[10];
  8. //复制:
  9. System.arraycopy(srcArr,1,destArr,3,3);
  10. //遍历查看目标数组:
  11. System.out.println(Arrays.toString(destArr));
  12. }
  13. }

结果:

二维数组

【1】引入:本质上全部都是一维数组:

【2】基本代码:

  1. public class TestArray15{
  2. public static void main(String[] args){
  3. //定义一个二维数组:
  4. int[][] arr = new int[3][];//本质上定义了一个一维数组,长度为3
  5. int[] a1 = {1,2,3};
  6. arr[0] = a1;
  7. arr[1] = new int[]{4,5,6,7};
  8. arr[2] = new int[]{9,10};
  9. }
  10. }

对应内存:

【3】四种遍历方式:

  1. public class TestArray15{
  2. public static void main(String[] args){
  3. //定义一个二维数组:
  4. int[][] arr = new int[3][];//本质上定义了一个一维数组,长度为3
  5. int[] a1 = {1,2,3};
  6. arr[0] = a1;
  7. arr[1] = new int[]{4,5,6,7};
  8. arr[2] = new int[]{9,10};
  9. //读取6这个元素:
  10. //System.out.println(arr[1][2]);
  11. //对二维数组遍历:
  12. //方式1:外层普通for循环+内层普通for循环:
  13. for(int i=0;i<arr.length;i++){
  14. for(int j=0;j<arr[i].length;j++){
  15. System.out.print(arr[i][j]+"\t");
  16. }
  17. System.out.println();
  18. }
  19. //方式2:外层普通for循环+内层增强for循环:
  20. for(int i=0;i<arr.length;i++){
  21. for(int num:arr[i]){
  22. System.out.print(num+"\t");
  23. }
  24. System.out.println();
  25. }
  26. //方式3:外层增强for循环+内层增强for循环:
  27. for(int[] a:arr){
  28. for(int num:a){
  29. System.out.print(num+"\t");
  30. }
  31. System.out.println();
  32. }
  33. //方式4:外层增强for循环+内层普通for循环:
  34. for(int[] a:arr){
  35. for(int i=0;i<a.length;i++){
  36. System.out.print(a[i]+"\t");
  37. }
  38. System.out.println();
  39. }
  40. }
  41. }
二维数组的初始化方式

数组的初始化方式总共有三种:静态初始化、动态初始化、默认初始化。

  • 静态初始化

除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。

eg:

int[][] arr = {{1,2},{4,5,6},{4,5,6,7,8,9,9}};

int[][] arr =new int[][] {{1,2},{4,5,6},{4,5,6,7,8,9,9}};

  • 动态初始化

数组定义与为数组元素分配空间并赋值的操作分开进行。

eg:

int[][] arr = new int[3][]; //本质上定义了一维数组长度为3,每个"格子"中放入的是一个数组

arr[0] = new int[]{1,2};

arr[1] = new int[]{3,4,5,6};

arr[2] = new int[]{34,45,56};

eg:

int[][] arr = new int[3][2];

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| public class TestArray16{ public static void main(String[] args){ int[][] arr = new int[3][2]; //本质上:定义一维数组,长度为3,每个数组"格子"中,有一个默认的长度为2的数组: arr[1] = new int[]{1,2,3,4}; //数组遍历: for(int[] a:arr){ for(int num:a){ System.out.print(num+"\t"); } System.out.println(); } } } |

  • 默认初始化

数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

相关推荐
yuanpan1 分钟前
C#如何正确的停止一个多线程Task?CancellationTokenSource 的用法。
开发语言·c#
绵绵细雨中的乡音3 分钟前
Linux进程学习【环境变量】&&进程优先级
linux·运维·学习
程高兴3 分钟前
单相交直交变频电路设计——matlab仿真+4500字word报告
开发语言·matlab
中国lanwp5 分钟前
springboot logback 默认加载配置文件顺序
java·spring boot·logback
贺函不是涵8 分钟前
【沉浸式求职学习day27】
学习
努力奋斗的小杨8 分钟前
学习MySQL的第十二天
数据库·笔记·学习·mysql·navicat
苹果酱056737 分钟前
【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
java·vue.js·spring boot·mysql·课程设计
我真的不会C1 小时前
QT中的事件及其属性
开发语言·qt
枫叶20001 小时前
OceanBase数据库-学习笔记1-概论
数据库·笔记·学习·oceanbase
Java致死1 小时前
单例设计模式
java·单例模式·设计模式