方法
一、方法的概念和使用
1.什么是方法
在java中方法就是一个代码片段.。几乎相当于c语言的函数。
2.方法定义
相比C语言多了个修饰符。
现在看下其注意事项:
1. 修饰符:现阶段直接使用public static 固定搭配
2返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成 void。而且返回一个值所有情况都要考虑,否则会报错,看下面代码
3. 方法名字:采用小驼峰命名
4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
5. 方法体:方法内部要执行的语句
6. 在java当中,方法必须写在类当中
7. 在java当中,方法不能嵌套定义。
8. 在java当中,没有方法声明一说,而在c语言是有函数声明的。这是因为c语言编译是自上而下,而java编译是全局的
9.跟c语言一样,在Java中main方法也作为程序的入口从而运行,其有且只能有一个,如果缺少main方法则不能运行该程序。之后随着学习更多的知识会对其有更清晰的认识,现在对其的认知还是太模糊了。 比如我们不清楚是一个类中只能有一个main函数还是一个文件中只能有一个main函数。
3.方法调用
例题:计算两个整数相加
例题:计算5的阶乘
4.方法中实参和形参的关系
跟c语言一样,也有传值调用和传址调用。
4.1传值调用
注意传值调用没有改变实参的值,只是将实参的值拷贝到形参中去
例题:交换两个整型变量的值
通过以上代码可以看到改变x,y的值并没有影响a,b的值。传值调用不影响函数外部的值,如果要影响,则要传址调用。
4.2传址调用
在c语言里传址调用是用了指针,而在java中没有指针这种语法,所以java需要用到引用。 而这些东西我们现在还没学,所以等到学习数组再详细解释吧
二、方法的重载
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。
1.为什么要方法重载
现在定义一个方法public static int add(int x, int y), 我们调用这个方法时有多种形式,如:double ret2 = add(a2, b2); int ret1 = add(a, b); 此时第一种形式是错误的,因为类型不匹配。为了使编译器能正常运行且不需要提供许多不同的方法名,因为名字取多了自己都会烦并且取名字也是个技术活,这时我们要用到方法重载。
该代码只提供了一个方法名add,代码变得更加美观,可读性也增加了呢。
方法的重载注意事项:
1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序不同,其中有一个不同参数列表就不同了)
3. 与返回值类型是否相同无关
// 注意:两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的,两个条件都要满足。
这么大的红色波浪线提示异常了呢。
如果发生了方法的重载,编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法。
2.方法签名
经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字即方法签名。(这才是方法真的名字名),方法签名解释了为什么方法重载可以存在,而两个相同的变量不能存在。方法签名这个知识点知道就好,不需要过度讲述。
三、递归
递归在c语言里就学过了,在java中递归跟c语言的是完全一样的。这里就不过多讲述了。
数组
一、 数组的基本概念
1.数组的创建和初始化
1.1数组的声明
注意:java的声明不会分配内存空间,声明时[]里面不能填数字。
1.2数组的创建和初始化
java中使用new关键字进行实例化对象,即创建一个对象(数组)。
关于new的作用:
1. 分配内存 :当你使用new关键字时,Java虚拟机会为对象分配内存。
2. 默认初始化:new初始化数组。基本类型默认初始化为0,引用类型为null。(Java中局部变量一定要初始化,因为没有New来赋初始值)。
3. 调用构造函数来赋值(后面介绍)。
数组初始化主要分为动态初始化以及静态初始化。
![](https://i-blog.csdnimg.cn/blog_migrate/8a80d07a0f7d45c22a90ea2b49e8a5ec.png)
注意:java中不能同时指定大小与赋值
静态初始化可以简写,省去后面的new []。 本质还是一样的
但是简写在一些时候也是用不了的, 如我们数组的创建和初始化可以分成两步,在分为两步时,静态初始化的简写就用不了了。
数组也可以按照依照C语言创建数组的方法去创建,但不推荐,不要这么写
2.数组的使用
2.1遍历数组
![](https://i-blog.csdnimg.cn/blog_migrate/42d6156cc6625cd7a95a097292c16325.png)
![](https://i-blog.csdnimg.cn/blog_migrate/60fcfebab312967cdedec9d39be44934.png)
for-each能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错. 而循环可以访问特定元素,for-each不能。
二、数组是引用类型
1.基本类型变量与引用类型变量的区别
基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
![](https://i-blog.csdnimg.cn/blog_migrate/8d77c32c246b8bb69cba0a0fa7a06773.png)
![](https://i-blog.csdnimg.cn/blog_migrate/68c52d9ecb9603ebed85442e75562354.png)
2.认识null
null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用。
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 Null Pointer Exception,
三、数组的应用场景
1.作为函数的参数
1.1参数传基本数据类型
![](https://i-blog.csdnimg.cn/blog_migrate/639cbcad702cd8a50b34fdd703eca799.png)
1.2参数传数组数据类型
![](https://i-blog.csdnimg.cn/blog_migrate/a2cf95ec08dfb6eac2b399493156ba70.png)
发现在func方法内部修改数组的内容, 方法外部的数组内容也发生改变.
在这里有没有可能参数传的是数组但是也改变不了方法外部的数组内容呢(以下代码便没改变)
2.作为函数的返回值
在C语言中不能将数组类型当返回值,但Java 可以,返回值为引用(地址),可以通过将返回值赋值给数组来访问元素,见以下代码。
四、常见方便数组的方法
1.tostring方法:将数组按字符串输出。即将数组元素打印出来,以后可不用循环了。注意二维数组使用deepToString。
2.copyof方法:复制数组。copyofRange可以控制赋值的元素。
1. equals 方法:用于比较两个数组是否相等。它逐个比较两个数组中的元素,如果两个数组具有相同的长度,并且对应位置的元素都相等,则返回 `true`;否则返回 `false`。
2. fill方法:用于将数组中的所有元素·替换为一个指定的值。这个方法对于所有类型的数组都是可用的。
3. binarySearch 方法:用于在已经排序的数组中搜索一个特定的元素。如果元素存在于数组中,则返回元素的索引(下标);如果元素不存在,则返回一个负数。
五、二维数组
二维数组本质是由多个一维数组组成的。
在Java中,当你使用语句 int[][] array = new int[3][3]; 创建一个二维数组时,你实际上是在创建一个由3个一维数组组成的数组,每个一维数组都有3个元素。这个语句初始化了第一维的大小(即有3个一维数组),并且为每个一维数组分配了空间,使得它们各自也有3个元素。然而,尽管每个一维数组都有空间,但是它们的元素都是默认值,对于整数类型来说,默认值是0。如果你想要为这些一维数组赋予特定的值,你需要单独为每个一维数组赋值,当你使用 array[0] = new int[]{1, 2, 3}; 这样的语句时,你实际上是在替换第一个一维数组(即array[0])的引用,使其指向一个新创建的、包含特定值的一维数组。见以下代码
1.二维数组的创建和初始化
注意:以下代码是不规则的初始化创建,即省略了列(java里不能省略行),至于为什么可以省略列,上面红字部分解释的很清楚了。
同理, 还存在 "三维数组", "四维数组" 等更复杂的数组, 只不过出现频率都很低. 其道理跟二维数组是一样的(用二维数组可以推出来)