一.方法
1.概念: 对重复且有效的代码进行提取,提取的形式—方法
2.格式:
修饰符 返回值类型 方法名(参数类型 参数名…){
方法体;
return 返回值;
}
修饰符:public static
返回值类型:返回值是什么类型就用什么类型来接
没有返回值---void
方法名:标识符
参数列表:参数类型、个数以及顺序共同作用
方法体:重复的代码
return:用于把返回值进行返回
package cn.tedu.method;
public class MethodDemo1 {
//Alt+?提示键
//在编写代码的时候就会进行编译
public static void main(String[] args) {
/*//打印3行4列的星星
for(int i=1;i<=3;i++){
for(int j=1;j<=4;j++){
System.out.print("*");
}
System.out.println();
}
//分割
System.out.println();
//打印5行6列星星
for(int i=1;i<=5;i++){
for(int j=1;j<=6;j++){
System.out.print("*");
}
System.out.println();
}
//打印10行11列
for(int i=1;i<=10;i++){
for(int j=1;j<=11;j++){
System.out.print("*");
}
System.out.println();
}*/
/*
//单独调用
printXing(3, 2);
//输出调用
System.out.println(sum(2, 3));
//赋值调用
//没有返回值的方法不能输出以及赋值调用
int result=sum(3, 5);*/
//
System.out.println(isOdd(17));
}
//打印星星的方法
public static void printXing(int n,int m){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j==2)
return;//结束方法
System.out.print("*");
}
System.out.println();
}
System.out.println(1);
}
//两个整数求和---方法
//两个明确---返回值类型 int 参数列表 int x, int y
public static int sum(int x,int y){
return x+y;
}
//判断一个整数是否是奇数---方法
//两个明确---返回值类型 boolean 参数列表 int a
public static boolean isOdd(int a){
//不正常的范围
if(a<=0){
return false;
}
//判断是否是奇数
if((a&1)==1){
return true;
}
//
return false;
}
//判断一个整数是否是质数
/*public static boolean isPrime(int n){
//不正常的范围
if(n<2){
return false;
}
//操作循环依次进行整除
for(int i=2;i<=n/2;i++){
//判断是否能被整除
if(n%i==0){
return false;
}
}
//
return true;
}*/
public static void isPrime(int n){
//不正常范围
if(n<2){
System.out.println("不是质数");
return;
}
//
for(int i=2;i<=n/2;i++){
//
if(n%i==0){
System.out.println("不是质数");
return;
}
}
//
System.out.println("是质数");
}
}
3.调用
(1) 单独调用---方法名(参数值)
(2) 输出调用
(3) 赋值调用
package cn.tedu.method;
//方法的调用由方法名和参数列表共同组成---方法签名
public class MethodDemo2 {
public static void main(String[] args) {
//如果重载方法提供了精确匹配的方法---精确匹配
//如果重载方法没有提供精确匹配的方法就要进行相对精确的匹配
//如果提供了多个相对精确匹配的方法就报错了
//System.out.println(sum(1,2));
}
//求和方法
//sum(int ,int)
/*public static int sum(int m,int n){
System.out.println("int int");
return m+n;
}*/
//sum(int,double)
public static double sum(int m,double n){
System.out.println("int double");
return m+n;
}
//sum(double,int)
public static double sum(double m,int n){
System.out.println("intdouble");
return m+n;
}
//sum(double,double)
public static double sum(double m,double n){
System.out.println("double double");
return m+n;
}
}
4.注意:
(1)方法被调用才能执行
(2)两个明确(返回值类型 参数列表)
(3)return适用于方法,用于结束方法以及返回返回值
(4)要保证所有的数据方法都有对应的返回值
(5)方法抽取的形式不固定,经验有关
5.方法的重载
(1) 在一个类中,出现了方法名一致,参数列表不一致的方法
(2) 如果提供了精确匹配的方法可以进行精确匹配,如果没有提供精确匹配
的方法就要进行相对精确的匹配,如果提供了多个相对精确匹配就会报错
6.方法的传值
(1) 如果实参是基本数据类型---传入的是值的拷贝
(2) 如果实参是引用数据类型---传入的是地址值的拷贝,如果拿到这个拷贝
的地址值找到了原堆内存改变了元素值就会影响结果,如果拿到的这个地址值
没有对原堆内存做任何改变就不会影响结果
package cn.tedu.method;
public class MethodDemo3 {
//方法的执行在栈中
public static void main(String[] args) {
//
int i=2;
//实参---实际传值的参数
//如果实参是基本数据类型,传递的就是值的拷贝
//m(i);
int[] arr={1,2,3,5};
//m(arr[0]);
//2
//如果实参是引用数据类型,是地址值的拷贝
//n(arr);
mn(arr);
System.out.println(arr[0]);
}
//形参---用于接收实参传过来的值
public static void m(int i){
i++;
}
public static void n(int[] arr){
arr[0]=10;
}
public static void mn(int[] arr){
arr=new int[4];
arr[0]=10;
}
}
二.递归
在方法执行过程中调用了本方法
sum(5)=1+2+3+4+5;
sum(5)=5+4+3+2+1;
5+sum(4);
4+sum(3)
3+sum(2)
2+sum(1)=1
StackOverflowError---栈溢出错误
package cn.tedu.method;
public class MethodDemo {
public static void main(String[] args) {
System.out.println(sum(100000));
System.out.println(jc(5));
}
//递归方法
public static int sum(int n){
//结束的标志
if(n==1){
return 1;
}
return n+sum(--n);
}
//递归方法---求阶乘
public static int jc(int n){
//
if(n==1){
return 1;
}
return n*jc(--n);
}
}