概念:特定功能的代码块。
优点:减少了代码的冗余。
方法的分类:静态方法、成员方法、构造方法(此节主要在静态方法的基础上使用)
注意:
- 方法编写的位置:类里,与main方法并立。
- 方法与方法之间是平级关系(不能在一个方法中声明另一个方法)。
- 方法不被调用,永远不会主动执行。
注:只能使用类名调用,无法使用类对象调用。
8.1.1 无返回值无参数的方法
语法结构:
访问修饰符 static void 方法名(){
…代码块… }
示例:
在main方法中可以直接通过方法名调用------ hello();
8.1.2.带有参数的方法
语法结构:
访问修饰符 static void 方法名(参数类型 变量名){
…代码块…
}示例:
main()方法中调用printStar方法时,需要传递实参给printStar方法。
输出:
注意:
- 形参:形式参数,方法声明时,规定调用时要传入的数据类型及接收数据的变量
- 实参:实际参数,调用方法时传入的具体数据
- 实参与形参类型必须兼容
- 多个参数用逗号分隔
8.1.3.带有返回值的方法
语法结构:
public static 返回值类型 方法名([参数]){
…代码块…
return 返回数据;
}示例:
注意:
- return下面不能接执行语句,因为return表示结束当前方法(如果存在分支,不是每个分支都存在return时,主干函数必须需要一个return语句。)。
- 声明方法时规定返回值类型,return后面接的是要返回的具体数据,返回的数据类型和定的返回值类型必须兼容。
- 方法中的变量为局部变量,作用域在该方法内,不影响其他方法中的变量。
8.1.4.方法的重载
含义:方法与方法之间的关系
好处:系统会根据实参类型自动匹配到对应方法
条件:
1.在同一个类里
2.方法名一致
3.参数列表的个数或者类型不一致
4.与访问修饰符,返回值无关
应用场景:
在同一个类里,有多个方法功能一致,细节实现不一样,就可以考虑使用重载(例如:多个整数求最大值。)示例:
8.1.5 递归的使用
概念:方法调用方法自身。
要点:
- 找规律(找出联系)。
- 找出口(结束的标志)。
示例:
Fibonacci 数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,
找出规律和联系: a1=1,a2=1,an=a(n-1)+a(n-2)(n>=3,n∈N*)
找出结束的标志: a1=1,a2=1。
注意:
方法没有出口就会导致死循环,直到栈内存溢出报错(调用方法时,会在栈内存中开辟空间,用于存放该方法的局部变量,死循环的调用方法,栈内存就会满载并溢出)。
含义:表示对象所具有的功能。
作用:
调用时与静态方法不同,需要使用类的对象来调用。
对象可以多次调用成员函数,
可以有返回值,也可以为void类型。
方法名可以和类名相同,但当此成员函数没有返回类型时为构造函数。
格式:
构造方法和类名相同,并且没有返回类型和返回值。
一个类可以有多个构造函数,但要求他们满足方法的重载。
构造函数与其他方法一样可以有0个、1个、或多个参数。
作用:
构造方法在创建对象时被调用,一个对象的建立只能调用一个构造函数,可用于初始化对象。
注:编译程序如果类中没有构造函数,系统会自动加入构造函数,为此类的默认构造函数。
- 格式:
- 含义:
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法。
这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数。
main方法中的args参数:
main方法中还有一个输入参数,类型为String[],这个是java的规范,main()方法中必须有一个入参,类型必须String[],命名为args,则是多数人的习惯。
使用示例:
拓展:
由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不会实例化这个类的对象,而是通过类名直接调用因此main方法需要是限制为public static。(类名.main()) ,且不能有返回值,所以返回类型为void。
概念:一组数据的容器(数组可以存放多个数据)
注意:
1.数组是引用数据类型
2.数组中的数据又叫做元素
3.每个元素都有编号叫做下标/索引(index)
4.下标从0开始
5.数组初始化后,会在内存中开辟一连串连续的空间
6.数组一旦初始化后长度不可以改变(数组没有扩容和删除)
7.数组的操作:添加、修改、查询声明: 数据类型[] 数组名;
9.1.1 静态初始化
数据由程序员指定,长度由系统分配。
静态初始化的三种方式:
示例:
9.1.2 动态初始化
数据由系统指定,长度由程序员分配。
注:
默认指定类型:
整数类型:0
浮点类型:0.0
字符类型:’ ’
布尔类型:false
引用类型:null示例:
动态初始化和静态初始化:
一开始就知道数据,采用静态初始化,反之,只知道数据长度(个数)就采用动态初始化。
9.1.3 数组相关操作
9.1.3.1 获取和修改数组内容
- 通过索引能够指定获取数组元素和修改数组元素。
示例(参照动态初始化化的str):
通过length获取数组元素个数。
for循环遍历
增强for循环遍历(foreach)
注:
遍历是如果需要使用下标,通过for循环遍历,如果不需要使用下标就采用foreach遍历数组。
9.1.3.2 数组的排序(数值型)
冒泡排序:
使用Arrays工具类方法排序(后续9.1.6详细介绍Arrays工具类)
9.1.3.3 数组的查找
顺序查找(遍历查找)
二分法查找(使用对象:有序的数组)
9.1.3.4 数组的扩充
9.1.3.5 数组的复制
直接复制。
注意:当采用这种方式复制字符数组时,修改原数组,新的数组内容也随之改变。(当names赋值给newNames时,只是将字符数组的地址传递给新数组,所以两个数组操作的其实是一片空间。)
只复制内容。
当复制一个数组只是为了获取其中的数据时,就可以采取动态初始化,对新建的字符数组单个赋值,从而避免了多个数组操作同样的一组数据。
原数组的变化,不会对新数组产生影响。
9.1.3.6 删除数组内容
数据外部迁移(将需要删除的数据舍弃,获得新数组。)
注:这种方法会使原本的数组空间减小
数据内部迁移(在数组内部将需要删除的数据覆盖。)
注:数组的长度不会经历变化。
9.1.4 数组作为参数和返回值
示例:长传一组数据,返回最大值和最小值。
9.1.5 可变参数
示例:设计方法,传入任意个int值,求和。
由此可见:可变参数的底层就是数组。
注意:
可变参数后不能接其他参数,但之前可以。
例:
一个方法的参数中,不能同时出现两个可变参数(即便类型不同)。
9.1.6 Arrays工具类
Arrays: java 给我们提供的专门操作数组的工具类。(其中的方法定义和使用详见API-----java类使用说明书)
常见示例:
注:二维数组整体学习和一维数组类似,可参照学习。
含义:包含了多个一维数组
声明:数据类型 [ ] [ ] 数组名;
9.2.1 二维数组的初始化
静态初始化:数据由程序员指定,长度由系统自动分配
动态初始化:长度由程序员指定,数据由系统自动分配(默认分配方式见9.1.2)
二维数组的循环遍历(采用循环嵌套)