目录
1.1 方法是什么
方法是具有某种特定功能的代码段。某段代码功能经常使用,因此使用{}花括号,将这段代码包起来,
起个名字,以后就使用这个名字来代替这段代码。
面向对象语言的三大特性:封装,继承,多态。方法就是对实现某一功能的重复的代码的封装。
1.2 方法的核心内容:代码段,参数,返回值。
第一个核心:代码段。 实现某一功能的一段程序。 --- 方法
第二个核心:输入的数据:代码段实现功能时需要用的数据。外部程序将这个数据提供给代码段。 --- 参数
第三个核心:输出的数据:代码段实现功能后,都会形成新的数据。外部程序也需要接收到这个新的数据。--- 返回值
1.3 方法的声明格式
[public static] 返回值类型 方法名(参数列表){
代码段;方法体;
}
① 返回值类型:用来描述一个方法执行完成之后,提供给调用者的数据的类型。
int,String,…:返回值的类型描述。
void : 表示当前方法没有返回值。
② 参数列表 : 用来描述一个方法执行时,需要的数据个数和类型。
不需要参数: void 方法名( ){…}
需要一个参数: void 方法名(数据类型 参数名){…}
需要二个参数: void 方法名(数据类型 参数名, 数据类型 参数名){…}
在方法中每一个参数就是一个临时变量。
作用域: 就只有这个方法的方法体。
生命周期:方法调用时创建,方法调用完销毁。
作用域看局部变量和全局变量:http://c.biancheng.net/view/1858.html
③ 方法名:按命名规范编写就行。见名知意,驼峰命名,第一个字母小写。
④ 方法体:实现方法功能的代码段。
使用return 关键字确定返回值。
格式: return 值;
1.4 方法调用格式
调用一次方法,就表示执行一次方法。方法的调用就是按方法名调用。
① 无参无返回值: 方法名();
② 有参无返回值: 方法名(参数值,参数值)
声明:void print(int i){…} int i--形参
调用:print(10); 10--实参
形参与实参:https://blog.csdn.net/qq_53350943/article/details/128942833?spm=1001.2014.3001.5502
调用时型参与实参实际操作是 int i = 10; 使用实参为型参赋值。
③ 有返回值:在调用方法时,就需要使用一个变量来接收这个返回值。
类型 变量 = 方法调用();
例如:声明:int add(int i , int j ){…}
调用:int x = add(10,20);
1.5值传递与引用传递
在Java中数据类型分为 基本数据类型 和 引用数据类型 二个大类。
① 基本数据类型做为参数时----值传递
基本数据类型做参数时,参用值传递,只是将变量的值,做一个副本传递给方法的参数。
形参与实参 实际上是没什么关系的。形参与实参是二个不同的变量。
② 引用数据类型做为参数时---引用传递
int[] a = new int[3];
a是数组名,是一个引用。
new是实例化关键字。实例化就是在内存中开辟空间的过程。
1.6 注释(方法主用文档注释)
① 单行注释://
② 多行注释:/* */
单行和多行是为了读源文件编写的注释。给编写当前源文件的程序员使用的。
③ 文档注释:/** */
文档注释是为使用当前编写的方法写的注释。是给方法的调用者使用的。
/**
* 这是一个计算二个数相加的方法
* @param i 操作数1
* @param j 操作数2
* @return 返回二个数的和
*/
public static int add(int i ,int j){
//表示当前方法的返回值,返回值是二个数的和。方法遇到return方法执行结束。
return i+j;
}
1.7 练习
① 给定一个数组,删除数组中指定一个元素。
/**
* 在数组中找到指定数值索引的方法
* @param a 被查询的数组
* @param x 指定要查询的数值
* @return 数值在数组中的第一次出现的索引位置。如果没有找到返回-1
*/
public static int findIndex(int[] a ,int x){
int index = -1;
for (int i = 0;i<a.length;i++) {
if(a[i]==-1){
break;
}
if(x == a[i]){
index = i;
break;
}
}
return index;
}
/**
* 删除数组中指定索引位的数值。空位使用-1补
* @param index 要删除数据的索引
* @param a 要删除数据的数组
*/
public static void delByIndex(int[] a,int index){
//使用 a[i] = a[i+1] 这个公式
for(int i = index ;i< a.length - 1 ; i++){
a[i] = a[i+1];
}
//第三步:将最后一位赋值为-1。
a[a.length-1] = -1;
}
/**
* 输出数组的内容
* @param a 数组
*/
public static void println(int[] a){
for (int x : a ) {
System.out.print(x+"\t");
}
System.out.println();
}
public static void main(String[] args) {
int x = 20;
int [] a = {100,50,20,10,20,-1,-1};
int index = findIndex(a,x) ;//调用方法获取索引
if(index == -1){
System.out.println("没找到!");
}else {
delByIndex(a,index);
}
println(a);
}
② 计算阶乘的累加:1!+2!+3!+……+n!
/**
* 这是一个计算阶乘的方法
* @param n 参数,指定计算几的阶乘
* @return n!
*/
public static int factorial(int n) {
int f=1;
for (int i=1;i<=n;i++){
f*=i;
}
return f;
}
public static void main(String[] args) {
//计算5的阶乘
// int a=factorial(5);
// System.out.println(a);
//计算1-5的阶乘和
int sum=0;
int n=5;
for (int i=1;i<=n;i++){
sum+=factorial(i);
}
System.out.println(sum);
}
③ 图形的打印
/**
* 在一行上打印图形的方法
*
* @param s 打印的内容
* @param n 打印的个数
*/
public static void print(String s, int n) {
for (int i = 1; i <= n; i++) {
System.out.print(s + " ");
}
}
public static void main(String[] args) {
//打印三角形
for (int i = 1; i <= 5; i++) {
print("*", i);
System.out.println();
}
System.out.println("--------------");
//打????
for (int i = 1; i <= 5; i++) {
print(" ", 5 - i);
print("^", 2 * i - 1);
System.out.println();
}
}
1.8 方法的可变长参数
语法格式:
public static void add(int… a); //其中 int… a 就是一个可变长参数。
调用时:可变长参数的实参个数是可以随意的。
add();
add(10);
add(10,20);
可变长参数在Java方法中是以数组方式存在的。
例:[I@4554617c
只有左边[号,说明是一个数组。 如果[ ]都有,说明是一个集合。
I 表示当前数组元素类型是一个int类型。
注意:一个方法中只能有一个可变长参数。可变长参数的位置必须是形参的最后一个。
1.9 方法的递归调用
递归调用:在方法体中调用自身方法的一种调用方式。
调用案例:声明一个方法
public static void dis(){
dis();
}
案例:计算n!
利用n! = n * (n-1)! 这个公式来计算阶乘。
递归调用是先根据公式进行递归,到达源点时,必须有一个明确的返回值。
从源点开始向上递推操作。递推就是向上给明确的取值。