Java学习笔记MyDay06

本文介绍了Java编程中静态方法的使用,包括无参数无返回值、带参数和带返回值的方法,以及方法的重载概念和应用。同时,展示了递归在计算阶乘和解决不死神兔问题中的实现。最后,提供了一个方法版本的万年历程序,涉及日期计算和星期获取等知识。
摘要由CSDN通过智能技术生成

一、eclipse的使用

 

 

 

 

 

二、静态方法

含义

特定功能的代码块

优点

代码复用,解决了代码的冗余问题

语法结构

访问修饰符 static 返回值类型 方法名(方法参数){
 ...代码块... 
}

分类

按有无参数返回值划分

1.无参数无返回值的方法

含义

调用方法时,不用传入数据,方法执行完毕后也不会有数据返回

语法结构

访问修饰符 static void 方法名(){
         ...代码块... 
}

注意事项

1.void:关键字,表示该方法没有返回值

2.方法不能嵌套,方法时写在类里

3.方法与方法之间是平级关系

4.方法不被调用,永远是个摆设

5.main方法被jvm调用

需求1

设计一个方法,打印5遍“用良心做教育”

public class Test01{
public static void main(String[] args){
    method();
}
public static void method(){
     for(int i=1;i<=5;i++){
         System.out.println("用良心做教育");
        }
    }
}

需求2

设计两个个方法run、play,模拟LOL

public class Test01{
public static void main(String[] args){
    run();
     play();
     run();
     run();
     play();
}
  public static void run(){
      System.out.println("风骚的走位--1500行");
  }
  public static void play(){
      System.out.println("发技能--500行");
  }
}

需求3

设计一个方法printStar,打印三角形

public class Test01{
public static void main(String[] args){
   printStar();
}
  public static void printStar(){
     for(int i = 0;i<5;i++){
         for( int j =0;j<=i;j++){
             System.out.print("*");
         }
         System.out.println();
     }
 }
}

2.带参数的方法

为什么要带参?

使方法适应各种使用场景

含义

调用方法时,一定要传入数据

语法结构

访问修饰符 static void 方法名(参数列表){ 
        ...代码块... 
}

注意事项

1.方法声明时规定的参数叫做形式参数/形参 ​

2.形参必须规定类型 ​

3.调用方法时,传入的具体参数叫做实际参数/实参,形参和实参要一一对应(类型和意义一一对应) ​

4.形参之间使用逗号分隔 ​

5.实参之间使用逗号分隔 ​

6.实参类型必须和形参类型兼容(即数据类型的转型) ​

7.参数的作用:调用时将外界的数据传入到方法内部

简单理解:把相同的东西写成方法,把不同的东西写成参数

需求4

设计一个方法printStar01,打印三角形,打印的图形由调用方确定

public class Test01{
public static void main(String[] args){
    printStar01("@");
     printStar01("$");
}
    public static void printStar01(String str){
     for(int i = 0;i<5;i++){
         for( int j =0;j<=i;j++){
             System.out.print(str);
         }
         System.out.println();
     }
 }
 
}

需求5

设计一个方法printStar02,打印三角形,打印的图形和行数由调用方确定

public class Test01{
public static void main(String[] args){
    printStar02("@",5);
     printStar02("$",4);
}
   public static void printStar02(String str,int num){
     for(int i = 0;i<num;i++){
         for( int j =0;j<=i;j++){
             System.out.print(str);
         }
         System.out.println();
     }
 }
 
}

需求6

设计一个方法getMax,传入两个int值,判断最大值

public class Test01{
public static void main(String[] args){
    getMax(5,6);
}
    public static void getMax(int num1,int num2){
        
        int max = (num1>num2)?num1:num2;
        System.out.println("最大值为" + max);
 }
 
}

3.带返回值的方法

含义

调用方法时,方法执行完毕后会有数据返回

语法结构

访问修饰符 static 返回值类型 方法名([参数列表]){//[  ]代表参数可要可不要

        ...代码块...

return 返回数据;

}

值的传递分析

注意事项

1.方法功能的单一性(一个方法的功能不用过于强大)
2.方法声明时,规定返回值类型

3.return后接的是返回的具体数据

4.return后接的值必须和方法声明是返回值的类型兼容

5.方法中的变量称之为局部变量,其作用域在该方法的内部

需求7

设计一个方法getMax,传入两个int值,判断最大值

public class Test02{
public static void main(String[] args){
    //需求7:
     
     int max = getMax(10,20);
     max = getMax(max,30);
     System.out.println("最大值为" + max); 
 }
 
​
 
    public static int getMax(int num1,int num2){
        
        int max = (num1>num2)?num1:num2;
        return max;// 1.结束当前方法 2.将数据返回给调用方法
        
 }
 
 
 }

需求8

输入三角形的三条边,判断这个三角形 是什么三角形?

public class TestTriangle {
	public static void main(String[] args) {
		// 定义一个方法,传入三条边,返回String代表三角形类型

		String str = triangle(3, 5, 3);
		System.out.println(str);
	}

	public static String triangle(int a, int b, int c) {
		String str = "";
		if (a + b > c && a + c > b && b + c > a) {
			if (a * a + b * b == c * c||a * a + c * c == b * b||b * b + c * c == a * a) {
				str = "这是一个直角三角形";
			} else if (a * a + b * b - c * c > 0&&a * a + c * c - b * b > 0&&b * b + c * c - a * a > 0) {
				str = "这是一个锐角三角形";
			} else {
				str = "这是一个钝角三角形";
			}
		} else {
			str = "这不是一个三角形";
		}
		return str;
	}
}

三、方法的重载

什么叫重载?

在同一个类中,方法名相同,参数列表不相同(个数,类型)。

含义

方法之间的关系

注意

1.在同一个类中

2.方法名相同

3.参数列表的个数或者类型不一致

4.与返回值无关(这个方法是否有返回值,返回什么类型,跟重载的关系无关)

5.与形参名无关

好处

系统根据具体实参类型自动匹配到对应的方法中

应用场景

在编写多个方法时,发现多个方法的功能大体一致,细节实现不一致,命名也不好命名,就可以考虑使用重载,也解决了命名的问题

如何设计一个方法

1.确定需求 
2.确定方法名 
3.确定参数类型及个数 
4.确定返回值类型

需求

需求:设计一个方法,比较两个int类型的最大值,返回最大值 需求:设计一个方法,比较三个int类型的最大值,返回最大值 需求:设计一个方法,比较两个double类型的最大值,返回最大值 需求:设计一个方法,比较三个double类型的最大值,返回最大值

public class Test03{

 public static void main(String[] args){
		
		System.out.println(getMax(10,20.2,30));
 
 }
 public static int getMax(int a,int b){
	 int max = (a>b)?a:b;
	 return max;
 }
 public static int getMax(int a,int b,int c){
	 int max = getMax(a,b);
	 max = getMax(max,c);
	 return max;
 }
 
  public static int getMax(double a,double b){
	 double max = (a>b)?a:b;
	 return max;
 }
 
   public static int getMax(double a,double b,double c){
	 int max = getMax(a,b);
	 max = getMax(max,c);
	 return max;
 }

四、方法的递归

含义

方法调用方法自身

错误示范

会报错 -- StackOverflowError(栈内存溢出错误)

报错原因:死循环的调用方法,栈内存装载满了就报错

栈内存的概念

调用方法就会开辟空间,用于存放该方法中的局部变量,方法执行完毕gc(垃圾回收器)会立刻回收该部分空间

public class Test03{

 public static void main(String[] args){
		
		method();
 
 }

 public static void method(){
	 String str = "用良心做教育";
	 System.out.println(str);
	 
	 method();
 }
}

经验

1.找规律

2.找出口

需求1

设计一个方法,传入int数字,求n的阶乘

	//5! = 1*2*3*4*5-->	5! = 4!*5
	//4! = 1*2*3*4	--> 4! = 3!*4
	//3! = 1*2*3	-->	3! = 2!*3
	//2! = 1*2		--> 2! = 1!*2
	//1! = 1		--> 1! = 1
			
	//找规律:n! = (n-1)! * n
	//找出口:1! = 1

public class Test06{
    	public static void main(String[] args){
		
		int num = getFactorial(5);
		System.out.println(num);//120
	}
	
	public static int getFactorial(int n){
		if(n == 1){
			return 1;
		}else{
			return getFactorial(n-1)*n;
		}
	}

}

需求2

不死神兔

有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一只兔子,假如兔子都不死,问第n月的兔子对数为多少。

扩展:不死神兔->斐波那契数(黄金分割数)

public class Test07{

	public static void main(String[] args){
		
		int num = getRabbit(9);
		System.out.println(num);
	}
	
	public static int getRabbit(int month){
		if(month == 1 || month == 2){
			return 1;
		}else{
			return getRabbit(month-1) + getRabbit(month-2);
		}
	}
	
}

五、方法版本的万年历

import java.util.Scanner;
public class Test08{
	/**
		知识点:方法版本的万年历
		
		难点:
			1.梳理需要封装的方法(先写谁,后写谁)
			2.考虑方法名、方法参数、是否需要返回值
			
		如何看懂代码?
			1.切记不要从头看到尾
			2.先看主方法的业务流程
			3.主方法里调用的方法(哪个不懂看哪个)
	*/
	
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		
		System.out.println("请输入年份:");//2022
		int year = scan.nextInt();
		System.out.println("请输入月份:");//11
		int month = scan.nextInt();
		
		//计算总天数
		int allDay = getAllDayOfYear(year) + getAllDayOfMonth(year,month) + 1;
		
		//获取星期
		int week = getWeek(allDay);
		
		//获取当月天数
		int day = getDay(year,month);
		
		//打印日历的方法
		printCalendar(year,month,day,week);
	}
	
	//判断是否是闰年的方法
	public static boolean isLeapYear(int year){
		if(year%4==0&&year%100!=0 || year%400==0){
			return true;
		}
		return false;
	}
	
	//获取当月天数的方法
	public static int getDay(int year,int month){
		int day = 0;
		switch(month){
			case 1:case 3:case 5:case 7:case 8:case 10:case 12:
				day = 31;
			break;
			case 4:case 6:case 9:case 11:
				day = 30;
			break;
			case 2:
				if(isLeapYear(year)){
					day = 29;
				}else{
					day = 28;
				}
			break;
		}
		return day;
	}
	
	//获取1900年到输入年的总天数的方法
	public static int getAllDayOfYear(int year){
		int allDayOfYear = 0;
		for(int i = 1900;i<year;i++){
			if(isLeapYear(i)){
				allDayOfYear += 366;
			}else{
				allDayOfYear += 365;
			}
		}
		return allDayOfYear;
	}
	
	//获取1月到输入月的总天数的方法
	public static int getAllDayOfMonth(int year,int month){
		int allDayOfMonth = 0;
		for(int i = 1;i<month;i++){
			allDayOfMonth += getDay(year,i);
		}
		return allDayOfMonth;
	}
	
	//获取星期的方法
	public static int getWeek(int allDay){
		int week = allDay%7;
		if(week == 0){
			week = 7;
		}
		return week;
	}
	
	//打印日历的方法
	public static void printCalendar(int year,int month,int day,int week){
		int num = 0;
		System.out.println(" ---" + year + "年" + month + "月--- ");
		System.out.println("一\t二\t三\t四\t五\t六\t日");
		for(int i = 1;i<week;i++){
			System.out.print("\t");
			num++;
		}
		for(int i = 1;i<=day;i++){
			if(num%7==0){
				System.out.println();//换行
			}
			System.out.print(i + "\t");
			num++;
		}
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值