方法 Method
方法的本质就是一段可以重复使用的代码,而且每个方法都是独立的,可以独立的完成某项任务;
-
注意:方法只定义不调用是不会执行的;
-
方法的定义与调用:
-
- 方法的定义。
1.1 语法格式:
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
//[ ]中的修饰符列表不是必须存在的!
1.2 修饰符列表:目前修饰符列表这一块,统一编写public static。后面讲。
1.3 返回值类型
可以是java语言中任何一种数据类型。包括基本数据类型,引用数据类型。
例如:byte short int long float double boolean char String…
如果方法执行结束的时候没有返回任何数据给调用者,返回值类型写:void。
切记:不能空着不写。
返回值类型是String表示:方法结束的时候会返回一个字符串给调用者。
返回值类型是void表示:方法结束的时候不返回任何数据给调用者。
1.4 当返回值类型不是void的时候,方法在结束的时候必须使用“return 值;”语句来完成数据的返回。
1.5 return语句有两种写法:
第一种:return 值;
第二种:return;
不管是哪一种,只要return语句执行,方法必然结束。
1.6 当返回值类型是void的时候:
不能编写"return 值;" 这样的语句。
但是可以编写"return;"语句,主要是用来终止方法的执行。也可以不编写“return;”,这个要看具体的业务。
1.7 当调用一个返回值类型不是void的方法时,方法结束的时候会返回值,这个值可以采用变量接收。注意变量的类型。
变量的类型一定要和返回值类型一致。或者能够自动类型转换,或者强制类型转换。
1.8 方法执行结束有返回值,但是对于调用者来说,可以选择接收,也可以选择不接收。
1.9 方法名:只要是合法的标识符即可。首字母小写,后面每个单词首字母大写。(一般方法都是一个行为,所以方法名一般都是动词。)
方法名最好是反映了这个方法所实现的功能。
deleteUser
saveUser
login
logout
…
1.10 形式参数列表一般简称为:形参。形参个数是:0-N个。多个的话,使用逗号隔开。
形参是局部变量。形参中起决定性作用的是:形参的类型。形参名随意。1.11 方法体:任何一个方法都有一个方法体。方法体用大括号括起来:
在大括号中编写“java语句;”
并且方法体中的代码有执行顺序,遵循自上而下。 - 方法的定义。
-
- 方法的调用。
当这个方法修饰符列表有static关键字的时候:
调用的语法格式:
类名.方法名(实际参数列表);
实际参数列表简称为:实参。
实参和形参列表必须一一对应:
类型要一一对应。
个数要一一对应。
当调用函数和被调用函数在同一个方法中时,可以省略类名,反之不可以。
return 语句不是写了就可以,还要保证100%的执行,也就是一定能够完成值的返回!
在同一个域(就是有效范围)中:return语句后面的代码是无法执行的。请不要写。 - 方法的调用。
public static int m1(){
int i = 100;
if(i > 99){//i的域就是m1函数内!
return 1;
}else{
return 0;
}
}
变量的分类:
- 局部变量 方法中的变量就是局部变量,注意形参列表里的变量作用域就是其所在方法,所以形参是局部变量
- 成员变量 类体中,方法外的变量叫成员变量。
通过运用方法思想编写一个登陆方法。
import java.util.Scanner;
public class LoginTest{
public static void main(String[] args){
login();
}
//下面要写一个登陆方法,通过判断用户名和密码来确定是否能够登陆。用户名:张三 密码:1234
/**
*@param 无参数,只要被调用即可;
*@author zcw
*/
public static void login(){
while(true){
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.next();
System.out.println("请输入,密码:");
String password = sc.next();
boolean res = check(username,password);
if(res){
System.out.println("登陆成功");
return;
}
}
}
/*核对用户名和密码是否正确,因为可能多次输入错误,为了简化判
断流程,所以给登陆密码检查也写了个代码。
*/
public static boolean check(String username,String password){
if(username.equals("张三")&&password.equals("1234")){
return true;
}else{
return false;
}
}
}
执行结果
方法重载Overload
当一个程序满足怎样的条件时,代码就构成了方法重载呢?
条件1:在同一个类中。
条件2:方法名一致。
条件3:形式参数列表不同:
类型不同算不同
顺序不同算不同说的是数据类型的顺序不同。
个数不同算不同
注意:形参中重要的是形参的数据类型,因此
// 以下这两个方法没有构成方法重载,属于方法重复定义了。语法错误,编译器报错。
public static void doSome(int a, int b){
}
public static void doSome(int x, int y){
}
方法重载是编译阶段的机制还是运行阶段的机制?
方法重载机制是编译阶段的机制。
在编译阶段已经完成了方法的绑定。
在编译阶段已经确定了要调用哪个方法了。
什么情况下我们考虑使用方法重载呢?
在以后的开发中,在一个类中,如果两个方法的功能相似,建议将方法名定义为同一个名字。
此时就使用了方法重载机制。
运算器的实现就可以借助方法重载机制,比如实现加法:
public class OverloadTest02{
public static void main(String[] args){
// 调用方法
sum(10, 20);
sum(10L, 20L);
sum(3.0, 2.0);
}
public static void sum(int a, int b){
int c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
public static void sum(long a, long b){
long c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
public static void sum(double a, double b){
double c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
}
方法递归 Recursion
方法的递归调用:
-
什么是方法的递归调用?
方法自己调用自己。 -
递归调用如果没有结束条件的话,会出现栈内存溢出错误:
java.lang.StackOverflowError -
所有的递归调用必须要有结束条件。
-
在实际开发中,使用递归调用的时候,即使有的时候,结束条件是存在的,并且结束条件也是合法的。但仍然会发生栈内存溢出错误,这可能是因为递归太深,栈内存不够了导致的。所以递归调用一般是不建议使用的。只有在不使用递归调用时这个问题解决不了的情况下,才建议使用递归调用。
原则:能用循环尽量使用循环。
因为递归调用太耗费栈内存。 -
在实际开发中,如果因为递归调用发生了栈内存溢出错误,你该怎么办?
首先可以调整栈内存的大小。扩大栈内存。
如果扩大之后,运行一段时间还是出现了栈内存溢出错误。
可能是因为递归结束条件不对。需要进行代码的修改。
兔子繁殖问题又称为斐波那契数列:
分析过程:
代码如下:
/*加入有一对兔子,从出生后第三个月起,每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,请问第n个月后的兔子有多少对。*/
import java.util.Scanner;
public class RecursionTest{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入月份:");
int month = sc.nextInt();
int sum = sum(month);
System.out.println("第" + month + "月一共有" + sum + "对兔子");
}
//sum方法,用来求n月后兔子的总对数
public static int sum(int month){
if(month == 1||month ==2){
return 1;
}else{
return sum(month-1)+sum(month-2);
}
}
}
package
package只能在代码第一行的含义:所有被编译器执行的代码中,排首行。如果有注释的话,注释在第一行也没关系。
package语法:
-
package是包机制,有什么用?
便于管理。不同的类放在不同的包下。好维护。 -
package语句只能写1行,并且只能写在java源码的第一行。
-
怎么定义包?
package 包名; -
定义了包之后,怎么带包编译?
javac -d . PackageTest01.java
语法:javac -d 生成目录 源文件路径当然,也可以不带包编译,编译之后,可以手动创建目录,这种方式比较麻烦。
-
一旦定义了package之后,有了包之后,怎么运行java程序呢?
重点强调:有了package之后,完整的类名是带包名的。所以运行的时候一定要添加包名:
java org.apache.struts.PackageTest02 -
package命名规范:
- 所有的包名都是小写。
- 包名的命名规范:
公司域名倒序 + 项目名 + 模块名 + 功能名; - 例如:com.powernode.oa.empmgt.service;
-
import语句只能出现在package和class定义之间。
-
import语句可以编写多个。
-
什么时候必须使用import语句?
A类中使用B类,当A和B类不在同一个包下。并且B类也不属于java.lang包,必须使用import引入。 -
import支持模糊导入。
-
import还支持静态导入:
不常用。了解即可。
IDEA安装视频链接IDEA安装视频链接