1.递归简论
递归是不是循环推理机制:
答:不是,递归是方法调用方法本身,但我们并没有利用方法本身定义方法的一个实例,例如循环是利用f(5)得到f(5)的值,而递归是利用f(4)得到f(5)的值;
递归的四条基本准则:
(1)要有基准情况,不然递归无法结束;
(2)要不断递进;
(3)设计法则:所有的递归调用都能运行
(4)合成效益法则:对于一个问题的同一实例时,切勿在递归调用中重复调用;(所以说在计算简单的数值问题时最好不用递归,利用斐波那契数之类的数学函数)
2.实现泛型特性构件(代码重用的支持)
(1)使用object表示泛型
public class FanXin{
private object canshu;
private void write(object x){
canshu=x;
}
private object read(){
return canshu;
}
}
public class Exp{
public static void main(String []args){
FanXin f=newFanXIn();
f.write("20");
String val=(String)f.read();
System.out.println(val);
}
}
2.基本类型的封装
每一个引用类型都和object类型相容,但是8种基本类型却不能;
public class FanXin{
private object canshu;
private void write(object x){
canshu=x;
}
public class Exp1{
public static void main(String []args){
Fanxin f=new FanXIn();
f.write(new Interger(37): //不能用基本数据类型,因为基本数据类型不能与object相容
int val=(Integer)f.read().intValue(); //使用intValue将包装类转换成基本数据类型
System.out.println(val);
}
}
3.使用接口类表示泛型(只用在object类中已有的方法能表示执行的操作时,采用object表示泛型)
找出一个数组中最大的项:
class FanXin{
public static Comparator FanXin(Comparable arr[]){
int index=0;
for(int i=i;i<arr.length.i++){
if(arr[i].compareTo(arr[index]>0){
index=i;
}
}
return arr[index];
}
public static void main(String args[]){
Shape [ ]shape={new Circle(2.0),new Square(3.0),new Rectangle(3.0,4.0)};
String []st1={"ava","jiaj","akjl"};
System.out.println(FanXIn(shape));
System.out.println(FanXin(String));
}
}
4.数组类型的兼容性
数组类型的兼容性是指假设 某个函数接收参数Person[],而Student[]继承Person[],那么Student[]就可以同样作为函数的参数;
java中数组是类型兼容的,这叫做协变数组类型;
5.利用java5泛性实现泛型
简单的泛型类:
public class FanXin<AnyType>{
public AnyType canshu;
public AnyType write(AnyType x){
canshu=x;
}
public AnyType read(){
return canshu;
}
}
class Exp3{
public static void main(String []args){
FanXin<String> f=new FanXin<String>();
f.write("37");
String val=f.read().intValue();
System.out.println(val);
// 使用自动拆箱装箱
/*
FanXIn<Integer> f=new FanXIn<Integer>();
f.write(37);
int val=f.read();
System.out.println(val);
*/
}
6.带有限制的通配符
java中数组是协变的,但集合不是协变的;这时候可以用限制通配符
计算集合中的面积和:
public static double totalArea(Collection<shape> arr){
double totalarea=0.0;
for(Shape s:arr){
totalarea+=a.area();
}
return totalarea;
}
这个代码如果传入参数Collection<square>则会出错,因为collection不是协变的
所以要用通配符:public static double totalarea(Collection<?extends shape>)arr)
7.函数对象
例如当要对进行比较时,不想按照Comparable中的CompareTo()方法进行比较,就可以将一个函数(需要的比较方法)放在一个对象内部而被传递,这样的对象通常叫做函数对象;
Class Exp4{
public static<AnyType> Comparable findMax(AnyType[]arr,Comparator <?super AnyType>cmp){
int index=0;
for(int i=1;i<arr.length;i++)
{
if(compare(arr[i],arr[index])>0)
index=i;
}
return arr[index];
}
class MyCompare impletments Comparator<String>{
public void compare(String str1,String str2){
return str1.compareToIgnoreCase(str2);
}
}
public static void main(String[]args){
String x1[]={"ABCVD","akhkfj","bjbjk"};
System.out.println(findMax(x1,new MyCompare()));
}