详谈?略谈?Java方法&重载
定义: Java方法是语句的集合,它们在一起执行一个功能。
1.方法是解决一类问题的步骤的有序组合
2.方法包含于类或对象中
3.方法在程序中被创建,在其他地方被引用
格式:
[修饰符[权限修饰符] [静态修饰符]] 返回值类型 方法名 ([形参列表]){
方法体.......
}
修饰符:
修饰符分为多种修饰符 , 有 权限修饰符 、 静态修饰符 、 final 修饰符等 ; 每种修饰符都有自己的作用
public : 意味公共的 公开的 , 这个方法在外界能够访问 ;
static : 标识方法是静态的 , 静态的方法可以被静态的方法调用 , 静态方法可以访问静态的成员变量 ;
返回值类型
很多语言都有函数 , java中没有函数 , java中用方法来代替函数;
可以把有返回值的方法称之为函数 , 没有返回值的方法称为过程 ;
方法是完成了一个具体的功能 , 是一条或多条的组合 , 在完成功能之后 , 方法可能会有一个值需要返回;
在定义方法的时候 , 返回值类型处必须定义 ;
定义方法时 , 根据方法的要求和完成的任务来定义返回值类型:
有值返回 , 则定义匹配的返回值类型 , 在方法体结束的地方使用 return + 值来返回结果(必须步骤)
没有值要返回 , 定义返回值类型为 void ;
返回值类型为 void , 可以单独使用 return 关键字 , 不可以使用 return + 值 ;
注意 : 返回值类型只能定义一个 , return返回值得时候 也只能返回一个结果 ;
return 关键字总结
return 有两种用法 :
1. 用在没有定义返回值的方法中 , 可以用来结束当前方法 , 此种行为不是必须的 , 使用return时 要注意防止出现不可访问的语句这种错误;
2. 用在定义了返回值的方法中可以用来结束方法并且返回一个值 , 值返回到方法的调用处 , 这是必须的行为 , 在有返回值的方法中 return 不可单独出现 , 后面必须跟一个符合返回值类型要求的值;
返回值的接收
如果调用了有定义返回值的方法 , 那么我们可以使用 该返回值类型(或大于该类型)的变量来接收这个值 , 可以选择不接收;
如果调用了没有定义返回值的方法 , 则不可以接收调用的结果 ;
如果调用的方法有返回值 , 则可以把 方法调用 放置输出语句小括号中 ;
方法名字
方法必须有一个名字 , 要符合标识符的规则 ,被调用时依靠方法的名字来调用;
同一个类中的方法 , 名字可以相同 , 但是要解决方法的调用问题 (方法的重载);
形参列表
形参列表可以让方法具有更好的重用性 , 可以满足更多的需求 ;
形参列表不是必须的 ;
如果存在就可以大大的提高方法的适用性 ;
定义形参列表格式
在方法的小括号里可以定义形参列表 ; 形参列表可以有多个形参 ;
格式 : 类型 名字 ; 多个形参用逗号隔开 ;
类型可以是任意类型 ; 形参之间的顺序也没有要求 ; 但形参名字不能相同;
形参的优势:
方法的功能本身不变,可以由调用者进行个性化定制 ;
方法定义形参后需注意的地方
1. 如果方法定义了形参 , 那么在该方法被调用时 , 必须传递实参 , 否则调用失败 ;
2. 方法定义了形参 相当于方法声明了局部变量 在方法体就不能够再度声明 同名的变量了
形参==局部变量 , 形参是特殊的局部变量 , 只需要声明 不需要赋值就可以在方法中使用 , 它的作用域是方法内 , 形参在被调用时赋值 , 赋值的就是实参
**形参的优势:**方法的功能本身不变,可以由调用者进行个性化定制 ;
.
== 参考代码 ==
public class FParameter {
/**
* 方法
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(add100());
welcome();
System.out.println(get(1));
abc(1,"1"); //1 是实际参数 叫 实参
addxy(100,200);
}
/**
* 完成任意范围的正数累加
* @param start 开始数字
* @param end 结束数字
* @return 累加之和
*/
private static int addxy(int start,int end) {
int sum;
if( start > end){
sum = start;
start = end;
end = sum;
}
sum = 0;
for(;start <= end ;start++)
sum += start;
return sum;
}
/**
* 方法调用时 实参和形参必须一一对应 规定了多少的形参 必须传递多少的实参
* 实参的顺序 必须和形参规定相同
* @param x
* @param str
*/
private static void abc(int x, String str) {
// x str 是形式参数 叫做 形参
// int x =1; //定义了形参 等价于声明了变量 再次定义会报错
System.out.println("FParameter.abc()");
}
/**
* 定义方法 功能:计算1-100的累加 并把结果返回
*/
public static int add100(){
int sum = 0;
for(int i= 1;i < 101; i++){
sum += i;
}
return sum; //返回规定好的值
}
/**
* 定义一个欢迎界面
*/
public static void welcome(){
System.out.println("Wlecome to xinxin shop");
System.out.println("======================");
System.out.println("**********************");
System.out.println("There is the flesh fruits");
}
/**
* 定义方法 可以计算半径为1.5的圆的面积和周长
* 输出周长结果
* 输出面积
* Math.PI 等价于 3.14~
*/
public static double get(double r){
System.out.println(2 * Math.PI * r);
return r * r * Math.PI;
}
}
方法的重载
在同一个类中 , 方法的名字相同 , 但是形参列表不同 , 这种行为就是方法的重载
方法同名报错原因是: 在调用时无法区分调用的是那个方法 ;
我们学了方法的形参列表之后 ; 发现调用方法不仅仅是名字 ; 还需要根据情况来提供 实参;
最终调用是那个方法 是由名字和实参 来共同决定的 ;
#####方法形参列表不同表现在三个方面
- 方法的形参个数不同
- 方法的形参类型不同
- 方法的形参的顺序不同 : 在这里要注意 形参的名字没有实际的意义 类型才是决定因素
递归
递归就是自己调用自己 , 来解决某些问题
方法可以被反复调用;
方法可以自己调用自己;
应用场景 : 需要效率而不在乎内存消耗的场景
有些特殊场景 使用循环无法解决,或编码十分复杂
案例分析:
/**
* 天龙八部
* 段正淳有多个女儿
* 假设有7个女儿
* 如果问老7 , 今年多大 ? 老7回答 , 我比老6小2岁
* 如果问老6 , 今年多大 ? 老6回答 , 我比老5小2岁
* 如果问老5 , 今年多大 ? 老5回答 , 我比老4小2岁
* 如果问老4 , 今年多大 ? 老4回答 , 我比老3小2岁
*
* 如果问老大 , 今年多大 ? 老大回答 , 我今年40岁
*
*/
public class Fac {
public static void main(String[] args) {
System.out.println(getAge(7));
}
/**
* 递归通用方法
* @param i
*/
public static int getAge(int i ){
if(i == 1)
return 30;
return getAge(i-1)-2;
//return i == 1 ? 30 : getAge(i - 1) - 2;
}
// 获得老七的年纪
public static int getAge7(){
return getAge6()-2;
}
// 获得老六的年纪
public static int getAge6(){
return getAge5()-2;
}
// 获得老五的年纪
public static int getAge5(){
return getAge4()-2;
}
// 获得老四的年纪
public static int getAge4(){
return getAge3()-2;
}
// 获得老三的年纪
public static int getAge3(){
return getAge2()-2;
}
// 获得老二的年纪
public static int getAge2(){
return getAge1()-2;
}
// 获得老大的年纪
public static int getAge1(){
return 30;
}
}
案例:
import java.util.Scanner;
public class WhileFac {
/**
* 录入用户名 必须123才是正确 如果不对你们录到对为止
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/*while (true) {
int i = (int)(Math.random()*150);
if (i == 123) {
System.out.println("录入正确");
}else{
System.out.println("现在随机的数字是" + i + ",即将开启随机");
}
}*/
// userInfo();
getUser();
}
private static void userInfo() {
// TODO Auto-generated method stub
int i = (int)(Math.random()*150);
if (i == 123) {
System.out.println("随机成功");
return;
}else {
System.out.println("现在随机的数字是" + i + ",即将开启随机");
userInfo();
}
}
private static int getUser(){
Scanner sc = new Scanner(System.in);
System.out.println("录入User");
int u = sc.nextInt();
if( u == 123)
return u;
return getUser();
}
}