2014年1月27日星期一

递归(Recursion)

递归调用:

例子:阶乘

public class Test {
          public static void main(String args[]) {
             System.out.println(method(5));
}
          public static int method (int n) {
             if (n==1)  return 1;
             else return n*method(n-1);
}
}

注意在else return n*method(n-1); 是调用方法的自身,所以如果method(3) 那么当执行method(3)的时候,那就会返回3×method(2),此时这个新的式子会等待method(2)的返回,而method(2)= 2*method(1),等待method(1)的返回,所以递归就是这样形成的。

例子二:Fibonacci 数列
public class Test{
   public static void main(String args[]) {
    System.out.println(f(5));
   }
 
   public static int f(int n) {
    if(n==1 || n==2) return 1;
else return f(n-1)+f(n-2);
   }
}

运用递归的关键:找到调用自身的方法, 并且设置返回值

运用非递归的方法(for loop)的方法写Fibonacci 数列:
public class test {
     public static void main(String args[]){

float f1=1;
float f2=1;
float f=0;
int i;

Scanner scanner=new Scanner(System.in);
System.out.println("Enter the Fibonacci number:");
float number=scanner.nextFloat();
if(number==1 || number==2)
   return 0;
else
       for(i=0;i<number-2;i++) {
f=f1+f2;
f1=f2;
f2=f;
   }

return f;


}





2014年1月26日星期日

Java 学习笔记--接口与内部类

接口(Interface):
接口并不是类,而是对类的一种需求的描述,而在类的方法,在实现Implement的时候都是要实现接口里面的方法。

在接口可以实现的:
(1) 包含一个或者多个方法

接口不可以实现的:
(1)在接口里面实现方法。
(2) 不能写入实例

接口的一些特性:
(1)接口不是类,不能使用new去实例化一个接口。
例如 对于object money 来说,不能Money money= new Money();
(2) 可以声明接口变量,接口变量必须引用了实现接口的类对象。
(3)接口可以接入接口(Interface 可以被Interface 接入)
 e.g public interface Moveable {
      void move(double x, double y);
}
      public interface Powered extends Moveable {
      double milePerGallon();
}

(4)接口中的方法将会被自动标记为public
(5)一个类,可以同时实现两个接口:
例如 Class Empolyee implements Cloneable, Comparable;

抽象类和接口的分别:
抽象类只能扩展一次,而接口可以被多次的扩展
在abstract class方式中,Demo可以有自己的数据成员,也可以有非 abstract的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final 的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的 abstract class。

这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其 实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。

接口和继承的分别:
接口的类要执行(implement)接口所有的方法,但是可以写自己的新参数和方法。而继承是继承所有的非private 的方法和参数,并且可以有自己的新方法和参数,但是如果要修改父类的方法,则是要重写(override)。