方法
一、方法的定义
方法是指一段用来完成特定功能的代码片段,在其他的语言里方法又被称为函数
1、为什么要有方法
1.用于处理程序中多次用到的功能
2.为了便于阅读程序
3.提高程序重用性
2、方法的声明和调用
声明
访问修饰符 返回值类型 方法名(参数类型 参数名); //此时这里的参数是形式参数
public void show(int parameter1,int parameter2){ //这里的两个参数是形式参数
System.out.println("这是一个带有两个参数的方法");
}
调用
方法名(参数 参数名); //这里所用的是实际参数
show(12,23); //这里的两个参数是实际参数
注:实参的个数和位置应当与形参的个数和位置保持一致才算调用了这个方法
3、实际参数和形式参数
1. 形式参数
在定义方法时方法名后面括号中的变量名称称为形式参数(简称形参),形参变量只有在被调用时才会为其分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在方法内部有效,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。
2. 实际参数
调用一个带参数的方法时,方法名后面括号中的参数称为实际参数(简称实参),即实参出现在调用的方法中。
实参可以是常量,变量,表达式,函数等,无论实参是何种类型的量,在进行方法调用时,它们都必须具有确定的值,以便把这些值传递给形参。因此应预先用赋值,输入等办法使实参获得确定值。
说明:在被定义的函数中,必须指定形参的类型。实参与形参的类型应相同或赋值兼容。实参和形参在数量上,类型上,顺序上应该严格一致,否则会发生类型不匹配的错误。
4、构造方法(Constructure)
构造方法只在创建对象的时候调用,所以即使你不写构造方法,系统也会默认生成一个的无参无返回值的构造方法,如果你写了构造方法,机器则不会生成默认的构造方法
1.构造方法的声明格式
- 无参构造方法
public class Constructure{
//名字,年龄属性
private String name;
private int age;
public Constructure(){} //这是一个无参的构造方法
}
- 有参构造方法
public class Constructure{
//名字,年龄属性
private String name;
private int age;
//这是一个有参的构造方法
public Constructure(String name , int age){
this.name = name;
this.age = age; //this代表当前对象
}
}
2.声明构造方法的注意事项
- 方法名与类名相同(大小写也必须一致);
- 不要返回类型(例如return、void等);
- 不能被static、final、native、abstract和synchronized修饰,不能被子类继承。
- 构造方法的重载和普通方法的重载是一样的
5、返回值return
返回值相当于此方法运行结束时后返回一个值来通知你,表示代码已经结束
返回值的两个作用
1.返回一个值
public int show(){
System.out.println("这是一个带有返回值的方法");
return 23; //返回一个23的值
}
2.结束方法的运行
public void show(){
return; //代码执行到return时就已经结束此方法运行了
System.out.println(); //此时这条输出语句会报错为:执行不到的代码
}
6、方法的递归
递归的基本思想:自己调自己,递归在使用的时候必须声明递归头和递归体,不然会造成溢出
- 递归头:什么时候不调用自己的方法,如果没有头的话,递归将陷入死循环,所以说递归头相当于递归的结束条件
- 递归体:什么时候开始调用自身的方法
递归的缺点:比较消耗性能,效率低
下面用递归方法来展示阶乘的求法:
public long factorial(int n){
if(n == 1){ //递归头
return 1;
}else{ //递归体
return n * factorial(n-1);
}
}
7、静态(Static)方法
- static修饰的成员变量和方法,从属于类,普通变量和方法从属于对象(所以又叫类方法和类变量)
- 在静态方法中是不能调用非静态方法和非静态属性的
- 而在非静态方法中是可以调用静态方法和静态属性的
public class TestStatic {
int id;
String name;
static String company = "这是静态变量";
public TestStatic(int id ,String name) {
this.id = id;
this.name = name;
}
public void login () {
System.out.println("登录"+name);
}
public static void printConpany() {
//login();//调用非静态方法,编译就会报错
System.out.println(company);
}
public static void main(String[] args) {
TestStatic ts = new TestStatic(101,"小米");
ts.printConpany();
ts.company = "这是新的值";
ts.printConpany();
}
}
static的优点: 任何被static修饰的方法和属性都将从属于类,而不再跟对象有关联,不会在对象销毁时销毁,所以生命周期较长,而且可以直接被调用或者访问。
static的缺点:被static修饰的内容会随着类的加载而加载,所以如果调用了多个静态方法时,则会影响到程序的运行速度
为什么main方法是静态方法:因为main方法是程序执行唯一入口,所以在程序执行开始,第一执行的是main方法,如果main方法不是静态方法的话,则还需要创建出main方法的对象,但是程序一开始执行的是main方法不是对象,所以main方法必须声明为静态方法
8、方法的重载(Overload)
注意:无论是构造方法还是普通方法,都可以重载
为什么需要重载:
- 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名的方法同时
存在,具有不同的参数个数/类型。重载Overload是一个类中多态性的一种表现 - Java的方法重载,就是在类中可以创建多个同名方法,给每个方法不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这也就是多态性
方法重载的要点:同名不同参
同名:
- 相同的方法名
不同参:
- 参数的个数不同
- 参数的位置不同
- 参数的类型不同
public class Overload {
public static void main(String[] args) {
//在使用了static的方法叫静态方法是不需要创建对象而可以直接使用的;
System.out.println(add(1,2,3));
System.out.println(add(2.0,2));
System.out.println(add(2,3.0));
}
//方法名相同,参数的个数不同,构成重载
public static int add(int a1,int a2,int a3) {
int sum = a1+a2+a3;
return sum;
}
//方法名相同,参数类型不同,构成重载
public static double add(double n1,int n2) {
double sum = n1+n2;
return sum;
}
//方法名相同,参数顺序不同,构成重载
public static double add(int n1,double n2) {
double sum = n1+n2;
return sum;
}
//不构成重载的方法
//这是原方法
// public static int add(int n1,int n2) {
// int sum = n1+n2;
// return sum;
// }
// //1、只有返回值不同不构成重载
// public static double add(int n1,int n2) {
// double sum = n1+n2;
// return sum;
// }
//
// //2、只有参数名称不同不构成重载
// public static int add(int n2,int n1) {
// double sum = n2+n1;
// return sum;
// }
}