Java从菜鸟到高手②

目录

1.输入输出

1.1输出

1.2.输入

1.3.scan.nextLine()和scan.next()的区别

2.方法的使用

2.1.方法的定义

2.2.形参和实参的关系

2.3.方法的重载

2.4.方法签名

3.递归

3.1.递归有递和归两个部分组成

4.数组

4.1.数组的定义

4.2.将数组转化为字符串

[4.3深入理解int[ ] arr = {1, 2, 3, 4}](#4.3深入理解int[ ] arr = {1, 2, 3, 4})

4.4.总结

4.5.数组的传参与返回

4.6.数组的销毁

5.二维数组

5.1.二维数组的定义

5.2.深度理解arr[2][3]

5.3.不规则数组


1.输入输出

1.1输出
int a = 10;
String arr = "hello bit";
//输出并换行
System.out.println(a);
System.out.println(arr);
System.out.println(arr + a);
//输出不换行
System.out.print(a);
//格式化输出
System.out.printf("%d\n", a);
1.2.输入
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
double b = scan.nextDouble();
1.3.scan.nextLine()和scan.next()的区别
Scanner scan = new Scanner(System.in);
String arr1 = scan.nextLine();
String arr = scan.next();

1.scan.next():读取字符串,遇到空格即停

2.scan.nextLine():读取一行字符串,但会读取上一个输入的回车,所以当你输入的数据有很多不同类型的时候,优先去处理字符串的输入,或在使用前加:scan.next();

3.Scanner scan = new Scanner(System.in);

String arr1 = scan.nextLine();

4.Scanner:类型 scan:变量名(任取) = new Scanner(System.in);

String arr1 = scan(已取好的变量名).nextLine();

2.方法的使用

2.1.方法的定义
public static void func(int a) {
        //方法体
}

public static:固定搭配+void:函数返回值+func:函数名(参数列表){函数体

}

2.1.1.方法的命名采用小驼峰,类名采用大驼峰

2.1.2.Java没有方法声明这一说,方法定义在main函数的前面后面都可以

2.2.形参和实参的关系

形参是实参的临时拷贝,形参的改变不会影响实参,Java不能获取栈上的地址

2.3.方法的重载

①:方法名必须一样 ②:参数列表必须不一样(参数个数,参数类型,顺序)③:与返回值无关(若仅返回值不同,编译报错)

好处:不用记那么多的方法名

2.4.方法签名

2.4.1.方法签名即经编译器修改后方法最终的名字,正是因为方法签名,所以在同一个类中可以定义多个方法名相同的方法

2.4.2.方法签名的方法:方法全名路径+参数列表+返回值类型

3.递归

3.1.递归有递和归两个部分组成

3.2.特点:①.每次递的时候这个方法只执行了一部分 ②:归的时候,会把当前方法未执行的部分执行完毕 ③:递的次数和归的次数一样

3.3.如何递归:①.寻找递推公式 ②:找起始条件(终止条件)

4.数组

4.1.数组的定义

数组的三种定义方法:

java 复制代码
int[] arr = {1, 2, 3};
int[] arr1 = new int[]{1, 2, 3};//静态初始化
//动态初始化,没有本质上的区别,只有写法上的不同,内存分配位置都为堆区
int[] arr2 = new int[5];//没有赋初始值,Java默认为0
arr2 = new int[]{1, 2, 3, 4, 5};


int[] arr3 = new int[5];
//错误
arr3 = {1, 2, 3, 4, 5};
//正确
arr3 = new int[]{1, 2, 3, 4, 5};

4.1.1.若数组未初始化时,默认值即为初始值,int类型默认值是0,boolen默认值是false

4.1.2.数组是在堆区保存的

java 复制代码
int a = 10;
double b = 5.2;
int[] arr = {1, 2, 3}

a,b是基本数据类型定义的变量,因此其空间中保存的就是其初始化的值

arr是引用数据类型定义的变量/数组类型的引用变量,其内部保存的是对象在堆空间中的地址

4.2.将数组转化为字符串
java 复制代码
int[] arr = {1, 2, 3, 4};
String array = Arrays.toString(arr);
System.out.println(array);
4.3深入理解int[ ] arr = {1, 2, 3, 4}
java 复制代码
int[] arr1 = {1, 2, 3 4};
int[] arr2 = {1, 2, 3, 4, 5};
arr2 = arr1;//此时arr2也指向arr1指向的对象{1,2,3,4}
//{1, 2, 3, 4, 5}没有人指向了,此时就被JVM自动回收了,虽在堆区,但无需手动free

1.一个引用不能同时指向多个对象

2.一个对象可以同时被多个引用指向

3.int[ ] arr = null,代表这个引用不指向任何对象,null在Java中表示空引用,和0号地址没有任何关系

4.若一个数组没有引用变量指向了,此时就被JVM自动回收了,虽在堆区,但无需手动free

4.4.总结

所谓的引用,本质上只是存了一个地址,Java将数组设定为引用类型这样的话后续数组传参只是将数组的地址传入到函数形参中,避免对整个数组的拷贝(若数组较长,拷贝开销大)

4.5.数组的传参与返回

4.5.1.数组的传参

1.Java中,数组传参实际穿的是地址(即数组的引用),通过修改形参可以达到改变实参的效果

java 复制代码
public static void fun(int[] arr) {
    arr[0] = 99;//arr = {99, 2, 3}
}
public static void main(String[] args) {
    int[] arr = {1, 2, 3};
    fun(arr);
    System.out.println(Arrays.toString(arr));
}
java 复制代码
public static void fun(int[] arr) {
    arr = new int[]{4, 5, 6};
}
public static void main(String[] args) {
    int[] arr = {1, 2, 3};
    fun(arr);
    System.out.println(Arrays.toString(arr));
}

此时,修改形参arr = new int[ ] = {4, 5, 6}并不会修改实参的值,而是相当于在堆区重新开辟了一块空间来保存4,5,6,,并将地址给arr保存

2.Java中数组可以作为返回值,实际返回的是数组在堆区的地址

4.6.数组的销毁

1.在Java中,堆空间的数据是自动销毁的,当没有变量引用对象时,这个对象就会被自动释放

2.堆是随着程序开始时而创建,不一定随着程序的退出而销毁,堆中的数据只要有变量引用,就不会被销毁

5.二维数组

5.1.二维数组的定义
java 复制代码
int[][] arr = {{1,2,3},{4,5,6}};
int[][] arr1 = new int[][]{{1,2,3},{4,5,6}};
int[][] arr3;
arr3 = new int[][]{{1,2,3},{4,5,6}};

行:arr.lenth    列:arr[1].lenth
5.2.深度理解arr[2][3]
5.3.不规则数组

不规则的数组:列可以省略,行不能省略

java 复制代码
int[][] arr = new int[2][];
arr[0] = new int[3];
arr[1] = new int[4];

//可以指定每一行几个元素
相关推荐
CopyLower23 分钟前
设计高并发系统:从理论到实践
java·系统架构
小怡努力学编程1 小时前
小怡分享之Java数组小练习
java
idealzouhu1 小时前
如何自定义异常
java
Ordinary~1 小时前
char类型和int类型
java·开发语言
岳轩子1 小时前
springboot给类进行赋初值的四种方式
java·spring boot·后端
kjl5365661 小时前
Lambda 表达式(也称为匿名函数)-在java,javascript,python
java·javascript·python
诸葛博仌1 小时前
java操作ElasticSearch(包含聚合查询)
java·elasticsearch·jenkins
on the way 1232 小时前
SpringBoot发送QQ邮箱
java·spring boot·后端
冬天vs不冷2 小时前
Hibernate Validator 数据校验框架
java·python·hibernate
Lullaby—2 小时前
JavaEE-多线程编程&阻塞队列
java·java-ee