一、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++;
}
}
}