题目要求:
1.定义一个静态方法double getFactorial1(int n) , 用for循环实现阶乘的计算(n!=1*2……)
2.定义一个非静态方法double getFactorial2(int n) , 用递归实现阶乘的计算(n! =n*(n-1)! ,0! =1)
3.在main方法中测试两个方法是否正确
具体代码如下:
public class Factorial {
public static void main(String[] args) {
int a=5;
double b=Factorial.getFactorial1(a);//通过类名调用静态方法
System.out.println(b);//输出运行结果
Factorial f=new Factorial();//实例化一个对象
System.out.print(f.getFactorial2(a));//通过对象名调用非静态方法并输出
}
//定义一个静态方法
public static double getFactorial1(int n) {
double sum=1;
for(int i=1;i<=n;i++) {//采用for循环计算阶乘
sum*=i;
}
return sum;
}
//定义一个非静态方法
public double getFactorial2(int n) {
if(n==1)//采用递归方法计算阶乘
return n;
else
return n*getFactorial2(n-1);
}
}
难点:主要在于对静态方法和非静态方法的调用。
区别:
1、静态方法:是使用static关键字修饰的方法,又叫类方法.属于类的,不属于对象, 在实例化对象之前就可以通过类名.方法名调用静态方法。 (静态属性,静态方法都是属于类的,可以直接通过类名调用)。
class Factorial{
//主方法
public static void main(String[] args){
Factorial.getFactorial1;//通过类名可直接调用静态方法
Factorial f=new Factorial();//实例化一个对象f
f.getfactorial1();//通过对象名来调用静态方法
}
//静态方法,用static修饰
public static double getFactorial1(int n){
System.out.println("静态方法");//仅作示范,运算结果非本题内容
}
}
2.非静态方法:是不含有static关键字修饰的普通方法,又称为实例方法,成员方法。属于对象的,不属于类的。(成员属性,成员方法是属于对象的,必须通过new关键字创建对象后,再通过对象调用)。
class Factorial{
//主方法
public static void main(String[] args){
Factorial f=new Factorial();//实例化一个新对象f
f.getFactorial2();//通过对象名来调用方法
}
//非静态方法
public double getFactorial2(int n){
System.out.println("非静态方法");
}
}
3.两者生命周期不同:静态方法的生命周期跟相应的类一样长,静态方法和静态变量会随着类的定义而被分配和装载入内存中。一直到线程结束,静态属性和方法才会被销毁。非静态方法的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法才会被创建,而当这个对象被销毁时,非静态方法也马上被销毁。