Java入门——方法
1.静态方法
1.含义
具有特定功能的代码块
2.好处
减少代码的冗余(减少了重复性的代码)
3.语法结构
访问修饰符(四种) 返回值类型 方法名(参数){
…代码块…
}
4.注意:
(1).方法是声明在类里,其他方法外;
(2).方法与方法之间是平级关系;
(3).运行类,JVM只会调用主方法;
(4).方法不被调用就是摆设;
(5).静态方法用类名调用; 如:Test01.run();
(6).在本类之间,静态方法可以不用类名,直接调用. 如:run();
2.无返回值无参数的静态方法
1.语法结构
public static void 方法名(){
…代码块…
}
void:无返回值
方法中的小括号里没有任何内容,表示没有任何参数
3.有参数的静态方法
1.语法结构
public static void 方法名(参数类型 参数名){
…代码块…
}
2.注意:
(1).方法声明时,可以指定参数,这种参数叫做形参;
(2).调用方法时,传入的数据叫做实参;
(3).形参必须指定类型;
(4).实参必须和形参的类型兼容;
(5).多个形参之间用**逗号(,)**隔开;
(6).形参的作用域是整个方法内.
3.练习代码
public class Test02{
public static void main(String[] args){
//练习1:设计一个方法,打印5行的直角三角形
rightAngledTriangle(5);
//练习2:三角形的内容由调用方指定
printStar("*");
printStar("$");
//练习3:三角形的内容和行数都由调用方指定
printStar2("#",6);
}
public static void rightAngledTriangle(int num){
for(int i = 0;i < num;i++){
for(int j = 0;j <= i;j++){
System.out.print("*");
}
System.out.println();
}
}
public static void printStar(String str){
for(int i = 0;i < 5;i++){
for(int j = 0;j <= i;j++){
System.out.print(str);
}
System.out.println();
}
}
public static void printStar2(String str1,int length){
for(int i = 0;i < length;i++){
for(int j = 0;j <= i;j++){
System.out.print(str1);
}
System.out.println();
}
}
}
4.有返回值的静态方法
1.语法结构
public static void 方法名(参数类型 参数名){
…代码块…
return 返回的具体数据;
}
2.注意:
(1).方法功能的单一性(一个方法不要做多个功能);
(2).方法声明时,指定返回值类型;
(3).return后面跟的是返回的具体数据,返回的具体数据必须和返回值类型兼容;
(4).返回值是返回给调用方;
(5).返回值只能有一个(要想返回多个数据,可以返回数组或者集合的对象)。
3.练习代码
public class Test03{
public static void main(String[] args){
//练习1:设计一个方法,计算两个int类型变量之和
int num = add(10,20);
num = add(num,30);
System.out.println("和为" + num);
//练习2:设计一个方法,获取两个int类型变量的最大值
int max = getMax(12,14);
System.out.println("最大值为" + max);
}
public static int add(int a,int b){
int result = a+b;
return result;
}
public static int getMax(int a,int b){
int max = (a>b)?a:b;
return max;
}
}
5.三种方法的应用场景
不需要从外界传入数据到方法内部和不需要将方法内部的数据返回给外界,就用无参数无返回值的方法;
需要从外界传入数据到方法内部,就用有参数的方法;
需要将方法内部的数据返回给外界,就用有返回值的方法。
6.方法的重载
1.含义
方法与方法之间的关系
2.需要满足的条件:
(1).方法与方法之间必须在同一个类里;
(2).方法名必须一致;
(3).参数列表的个数或者类型不一致
(4).与返回值无关
3.好处:
根据传入的实参数据,自动匹配到对应的方法
4.应用场景
在同一类中,方法的大致功能一样,细节实现不一样,就可以考虑使用重载
5.代码练习
public static void main(String[] args){
System.out.println(getMax(1,2));
System.out.println(getMax(1.2,2.4));
System.out.println(getMax(1,2,3));
System.out.println(getMax(1.2,2.3,3.4));
System.out.println(getMax(1,2.2));
//注意:方法有返回值才可以打印
}
public static int getMax(int a,int b){
return (a>b)?a:b;
}
public static int getMax(int a,int b,int c){
int max = (a>b)?a:b;
max = (max>c)?max:c;
return max;
}
public static double getMax(double a,double b){
return (a>b)?a:b;
}
public static double getMax(double a,double b,double c){
double max = (a>b)?a:b;
max = (max>c)?max:c;
return max;
}
7.万年历改造
//利用方法的重载来改造万年历
import java.util.Scanner;
public class Test07{
//利用方法把冗余的代码解决掉(改造万年历)
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入年:");
int year = scan.nextInt();
System.out.println("请输入月:");
int month = scan.nextInt();
//计算总天数
int allDay = getAllDayOfYear(1990,year) + getAllDayOfMonth(year,1,month);
//获取星期
int week = getWeek(allDay);
//获取当月的天数
int day = getDay(year,month);
//打印日历
printDate(year,month,day,week);
}
//打印日历
public static void printDate(int year,int month,int day,int week){
System.out.println("---" + year + "年" + month + "月---");
System.out.println("日\t一\t二\t三\t四\t五\t六");
int num = 0;
for(int i =0;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++;
}
}
//计算星期
public static int getWeek(int allDay){
return allDay%7;
}
//获取开始年到结束年的总天数
public static int getAllDayOfYear(int startYear,int endYear){
int allDayOfYear = 0;
for(int i = startYear;i < endYear;i++){
if(isLeapYear(i)){
allDayOfYear = 366;
}else{
allDayOfYear = 365;
}
}
return allDayOfYear;
}
//获取开始月到结束月的总天数
public static int getAllDayOfMonth(int year,int startMonth,int endMonth){
int allDayOfMonth = 0;
for(int i = startMonth;i < endMonth;i++){
allDayOfMonth += getDay(year,i);
}
return allDayOfMonth;
}
//获取当月天数
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;
}
//判断闰年
public static boolean isLeapYear(int year){
if(year%4 == 0 && year%100 != 0 || year%400 == 0){
return true;
}
return false;
}
}
8 .递归
1.含义
方法调用方法自身
要想用好递归,就要找规律、找出口;
调用一次方法,就会在栈内存中开辟空间,用于存放该方法的局部变量,如果死循环的调用方法,栈内存就会装满,从而报出栈内存溢出的错误。
2.练习代码
public static void main(String[] args){
System.out.println(method(5));
System.out.println(method(4));
System.out.println(method(6));
}
/*练习1:设计一个方法,求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 static int method(int n){
if(n != 1){
return method(n-1)*n;
}else{
return 1;
}
}
/*方法的递归经典题目:不死神兔*/
public static void main(String[] args){
System.out.println(getRabbit(6));
System.out.println(getRabbit(12));
System.out.println(getRabbit(2));
System.out.println(getRabbit(8));
}
/*
面试题1:有一对兔子,从出生后第3个月起每个月都生1对兔子,小兔子第三个月后也可以
生一对兔子,假如兔子不死,在指定月份时刻一共可以有多少对兔子
*/
public static int getRabbit(int month){
if(month ==1 || month == 2){
return 1;
}else{
return getRabbit(month - 1)+getRabbit(month - 2);
}
}