java方法
方法是什么
java方法是语句的集合,它们在一起执行一个功能
方法是解决一类问题的步骤的有序集合
方法包含于类或对象中
方法在程序中被创建,在其他地方被引用
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是1个方法只完成1个功能,这样利于我们后期的扩展
方法的定义
首先方法包含一个方法头和方法体:
-
修饰符:这是可选的,告诉编译器如何调用该方法,定义该方法的访问类型(public、private等)
-
返回值类型:方法可能会返回一个值,returnValueType是方法返回值的数据类型,但是有些方法执行所需要的操作,没有返回值的时候,那么返回值类型为void
-
方法名字:是方法的实际名称,方法名和参数表共同构成方法签名
-
参数类型:参数就像是一个占位符。当方法调用时,传递值给参数。这个值被称为实参或者变量。参数列表式指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何的参数
-
形式参数:在方法被调用时用于接受外界输入的数据
-
实参:调用方法时实际传递给方法的数据
-
-
方法体:方法体包含具体的语句,定义该方法的功能
//修饰符 返回值类型 方法名字 形式参数
public int getSum(int i,int j){
return i+j; //方法体
}
方法的调用
java支持两种调用方式,根据方法是否有返回值来选择
-
当方法返回一个值的时候,方法调用通常被当做一个值:例如
int larger= max(30,40);
-
当方法返回值是void,方法调用一定是一条语句
System.out.println("Hello world");
方法重载
重载就是在一个类中有相同的函数名称,但形参不同的函数。
方法的重载的规则:
-
方法名称必须相同。
-
参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)方法的返回类型可以相同也可以不相同。
-
仅仅返回类型不同不足以成为方法的重载。
实现理论:方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
//方法重载
public static int add(int a,int b ){
return a+b;
}
public static int add(int a,int b,int c ){
return a+b;
}
public static double add(int a,int b,double c ){
return a+b;
}
命令行传参
有时候需要再运行一个程序的时候再传递给它消息。这就要靠传递命令行参数给mian() 函数实现
public class CommandLine{
public static void main(String [] args){
for(int i=0;i<args.length;i++){
System.out.println("args["+i+"]:"+args[i]);
}
}
}
可变参数
JDK 1.5开始,Java支持传递同类型的可变参数给一个方法。在方法声明中,在指定参数类型后加一个省略号(.…)。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
//可变传参
public static double add( int a,double ... number){ //其他普通参数必须在可变参数前面
double result=0;
for (int i = 0; i < number.length; i++) {
result+=number[i] ;
}
return result;
}
递归
A方法调用B方法,我们很容易理解!
递归就是:A方法调用A方法!就是自己调用自己
利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合
递归结构包括两个部分:
-
递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。就是啥时候结束调用自己的循环
-
递归体:什么时候需要调用自身方法。
public static int f(int i){ //递归调用解决阶乘问题
if(i==1){
return 1; //定义一个边界
}
return i*f(i-1); //返回阶段,一层一层往回边界调用
}
// 例如 i=5
方法的种类
构造方法
也称构造器,构造函数,构造方法的名称和类名一样,并且没有返回值,通过new加上构造方法可以创建一个对象,每个类都有一个默认的构造方法,如果重新声明了构造方法,则系统默认的构造方法将不再使用。
Text1 t1 = new Text1();//引用无参构造函数创建对象
Text1 t2 = new Text1("张三",18);//引用有参构造函数创建对象
12
静态方法
-
关键字static修饰的方法称为静态方法,也叫类方法,静态方法不属于对象,而是属于类,随着类的加载而加载,优先于构造方法执行。
-
静态方法可以直接使用类名.方法直接调用,如果静态方法位于本类中可以直接省略类名直接调用
-
在静态方法中,可以访问静态方法,可以引用类变量(被static修饰的变量),不能访问非静态方法与变量,不能使用super和this关键字
非静态方法
-
是不含有static关键字修饰的普通方法,又称为实例方法,成员方法。属于对象的,不属于类的。(成员属性,成员方法是属于对象的,必须通过new关键字创建对象后,再通过对象调用)。
-
在非静态方法中,即可以调用非静态方法,也可以调用静态方法,可以引用类变量和成员变量,可以使用关键字super和this
public class Text3 {
int age = 18;//成员变量
static String name = "迪丽热巴";//类变量
public static void main(String[] args) {
Text3 t1 = new Text3();
method();//本类中调用静态方法,直接省略类名
t1.method1();//调用成员方法
}
//静态方法
static void method() {
System.out.println("静态方法");
//访问属性
System.out.println(name);
//System.out.println(age);//报错,静态不能访问非静态
//t1.method();//报错
}
//非静态方法,也叫成员方法
void method1() {
System.out.println("非静态方法1");
method();//既可以调用静态方法
new Text3().method2();//又可以调用非静态方法
System.out.println(name);//既可以访问静态属性
System.out.println(age);//又可以访问非静态属性
}
void method2() {
System.out.println("非静态方法2");
}
}
//运行结果
/*
迪丽热巴
非静态方法1
静态方法
非静态方法2
迪丽热巴
18
*/
注:静态方法和非静态方法的区别(生命周期不同)
-
静态方法的生命周期跟相应的类一样长,静态方法和静态变量会随着类的定义而被分配和装载入内存中。一直到线程结束,静态属性和方法才会被销毁。(也就是静态方法属于类)
-
非静态方法的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法才会被创建,而当这个对象被销毁时,非静态方法也马上被销毁。(也就是非静态方法属于对象)
抽象方法
关键字abstract修饰的方法称为抽象方法,抽象方法必须定义在抽象类(abstract修饰的类称为抽象类)中,抽象类中既有抽象方法,也有非抽象方法,但是抽象方法必须定义在抽象类中,并且抽象方法没有方法体
public class Text3 {
public static void main(String[] args) {
Cat cat = new Cat();
cat.cry();
}
}
// 定义一个抽象类
abstract class Animal {
String name;
int age;
// 抽象方法
public abstract void cry(); // 不确定动物怎么叫的。定义成抽象方法,来解决父类方法的不确定性。
//抽象方法在父类中不能实现,所以没有方法体。但在后续在继承时,要具体实现此方法。
}
// 抽象类可以被继承
// 当继承的父类是抽象类时,需要将抽象类中的所有抽象方法全部实现。
class Cat extends Animal {
// 实现父类的cry抽象方法
public void cry() {
System.out.println("猫叫:喵喵");
}
}