先来说说什么是方法,生活中我们做事和工作中都要去解决事情,我们解决事情的时候都需要去找到一定的方式和手段去帮助我们完成某项工作和事情,我们解决事情的手段和方式就是方法.方法不经能帮我们很快的完成工作,也能帮我很容易的去解决一下毕竟麻烦的事情.在java中方法就是我们解决事情的方式,封装功能.在java中方法也就是method的定义分为有返回值类型的方法和无返回值类型的方法.这里我先说下有返回值类型的方法表达式如下:
修饰符 返回值类型 方法名(参数列表){//参数可有可无 并且可以有多个
方法体;
return 返回值;
}
修饰符:访问权限(这里面我们默认使用public static)
返回值类型: 方法运算后结果的数据类型(基本数据类型|引用数据类型)
方法名:标识符,满足标识符的命名规则和规范(方法是根据方法名调用和区分的)
():可以存在参数,也可以没有参数.参数和参数之间用,分隔.
参数: 在方法定义的时候,有没有未知的不确定的数据,如果有,定义在参数列表上
参数相当于局部变量的声明,数据类型 参数名,…(没有默认值)
注意 有参数的方法在调用方法时,必须赋值
public static int sum(int a){// public statci 是修饰符 int返回值类型 sum方法名 ()内的a是参数名可有可无
a*=a;// 方法体语句
return a;// return 结束方法 并且带回返回值a
}
方法的调用:方法名(参数);
public class Methodf{
public static void main(String[] args){
sum(5);//直接调用sum()方法 并且赋值5;又返回值不建议使用,无返回值的只能使用直接调用
int a = sum(5);//赋值调用适合又返回值类型的方法
System.out.println(sum(5));//输出调用适合有返回值类型的方法
}
public static int sum(int a){// public statci 是修饰符 int返回值类型 sum方法名 ()内的a是参数名可有可无
a*=a;// 方法体语句
return a;// return 结束方法 并且带回返回值a
}
}
注意:
参数分为
形参:形式参数;定义方法时()中的参数;
实参:实际参数;调用方法时()中的参数;
没有返回值类型的方法
修饰符 void 方法名 (参数列表){
方法体
return;(可有可无)
}
void:就是没有返回值类型
return:提前结束方法
因为没有返回值 所以只能直接调用,不能使用赋值调用和输出调用
/* 需求:打印一个乘法表,可以输入一个数字打印相应数字的乘法表
返回值: 不需要 参数:一个 int a
*/
public static void print(int a){
for(int i = 1;i<=a;i++){
for(int j = 1;j<=i;j++){
System.out.print(j+"*"+i+"="+i*j);
}
System.out.println();
}
}
return关键字
在有返回值类型的方法中:提前结束方法;把返回值返回给方法的调用处
在没有返回值类型的方法中:只是提前结束方法
顺便说下想return这些关键字后面紧跟的代码都叫做不可达语句,不可达语句目前有
1.一定会执行到的return后面的语句
2.一定会执行到的break后面的语句
3.死循环后的语句
4.一定会执行到的continue后面的语句
5.while(false)后
注意:程序可以被欺骗看如下的代码:
boolean flag = false;
while(flag){//编译的时候 语法不报错 但是执行不到System.out.println("你好java");
}
System.out.println("你好java");
了解了方法我们再说说为什么使用方法或者说是方法有哪儿有点:
1.隐藏方法内部的实现细节,安全
2.简化代码
3.提高代码的复用性
还有方法的唯一标识是方法签名:方法名+参数列表;所以我们在写方法的时候可以把很多功能相似的方法用同一个方法名,不同的参数列表来构成方法的重载;方法的重载可以减轻我们写方法的时候命名的麻烦而且相同功能的方法,方法名一样便于编写.好了我们看看在什么情况下方法名相同能构成重载:
1.参数列表不同
2.参数个数不同
3.参数类型不同
注意:方法的重载与放的修饰符无关 与方法有无返回值无关 与参数名无关 与返回值类型无关
重载方法的调用:
方法名(参数列表);根据调用方法时的实参类型|个数决定;
public class Methoda{
public static void main(String[] args){
// 输出调用 方法 根据参数数据类型不同 个数不同 数序不同调用
System.out.prinln(arr(10.0,1));
System.out.prinln(arr(10.0,1.0));
System.out.prinln(arr(10,1));
System.out.prinln(arr(10,1.0));
System.out.prinln(arr(10,1,2));
}
public static double arr(double a, int b){
a+=b;
return a;
}
public static double arr(double a, double b){
a+=b;
return a;
}
public static double arr(int a, int b){
a+=b;
return a;
}
public static double arr(int a, double b){
a+=b;
return a;
}
public static double arr(int a, int b,int c){
a=b+c;
return a;
}
}
其实方法也是可以调用方法的,其中最经典的就属于自己调用自己我们称之为递归
递归的构成:
1.递归头:临界条件
2.递归体:
1).递归前进段:从调用自己开始,到临界条件之间过程
2).递归后推段:从临界条件开始将结果返回到调用的一层
public class Methoda{
public static void main(String[] args){
// 输出调用 方法 根据参数数据类型不同 个数不同 数序不同调用
System.out.prinln(arr(5));
}
//求一个正数的阶乘
public static int arr(int a){
// 临界条件
if(a==1){
return 1;
}
return a*arr(a-1);
}
}
数组
方法就先聊那么多我们一起先稍微了解下数组,什么是数组,数组的特点是什么,为什么我们要用数组;什么是数组:数组就是存储多个数据的;数组有哪儿些特点:
1.数组是个引用数据类型;
2.数组是一个容器,长度一旦确定不能改变
3.说中的数据数据类型相同
4.数组中的数据是有序的
数组的定义与初始化
定义:
数组的声明方式:数据类型(基本|引用数据类型)[] 数组名;
初始化:静态初始化与动态初始化
静态初始化:创建的时候就赋值;列如:
数据类型[] 数组名 = new 数据类型[]{值1,值2,值3....};
数据类型[] 数组名 = {值1,值2,值3....};(推荐使用简化)
动态初始化:
数据类型[] 数组名 = new 数据类型[整数n];//n代表数组的长度;
在动态初始化中 数组没有赋值的话都是有默认值的整数:0 ;浮点数:0.0;boolean:false;char:" ";字符串:null;
数组的使用:
根据数组的索引,精确的定位到数组中的每一个位置,操作该位置的数据(添加|修改)
数组的第一个数据的索引|下标是0,最后一个是数组名.length-1;
//动态初始一个正数数组长度是10
int[] arr = new int[10];
// 循环 循环次数小于等于数组中的数据最大索引
for(int i = 0;i <= arr.length;i++){
arr[i] = 1+i;// i可以作为索引,也可以一次对从0到length-1的数组赋值
}
数组的遍历:
获取数组中的每一个数据,两种方法
1.普通 for 循环;
2.for…each|增强for循环(只能获取数据)
int[] arr = {0,1,2,3,4,5,6}
for(int i:arr){//增强for; for(数据类型 变量名:数据名)
System.out.println(i);//(i只是作为获取数组中数据的临时变量,不能对数组进行赋值)
}
for(int = arr.length;i >= 0;i--){
System.out.println(arr[i]);
}