Java基础加强 (三)

2014-11-24 09:56:18 · 作者: · 浏览: 3

(3)存取HashMap中的元素。

(4)使用泛形时的几个常见问题:

使用泛形时,泛形类型须为引用类型,不能是基本数据类型

ArrayList list = new ArrayList();

ArrayList list = new ArrayList();

ArrayList list = new ArrayList ();// 兼容老程序

ArrayList list = new ArrayList();

18、自定义泛形——泛型方法

(1)Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法: ,T可以是任意字母,但通常必须要大写。通常需放在方法的返回值声明之前。例如:

public static void doxx(T t);

(2)练习:

编写一个泛形方法,实现指定位置数组元素的交换。

编写一个泛形方法,接收一个任意数组,并颠倒数组中的所有元素。

(3)注意:

只有对象类型才能作为泛型方法的实际参数。

在泛型中可以同时有多个类型,例如:

public static V getValue(K key) { return map.get(key);}


/点到任意数组中的指定位置上的两个元素

//[1,2,3] 0 2 [3,2,1]

public static void m1(T[] t,int index1,int index2){

//缓冲区

T temp = t[index1];

t[index1] = t[index2];

t[index2] = temp;

}

//颠倒任意数组中的元素顺序

//[1,2,3] [3,2,1]

public static void reverse(T[] t){

int startIndex = 0;

int endIndex = t.length -1;

while(startIndex

T temp = t[startIndex];

t[startIndex] = t[endIndex];

t[endIndex] = temp;

startIndex++;

endIndex--;

}

}

package com.itheima.base;

//把泛型定义在了类上面。但是只对实例方法有效

public class Demo2 {

//泛型的定义,后面的T就是使用了

//必须先定义才能使用。定义的语法就是(字符随便),但是必须放在返回值的前面

public T findOne(){

return null;

}

public void get(Class clazz){


}

//静态方法总是需要单独定义泛型类型

public static void get1(Class clazz){


}

}

19、自定义泛形——泛型类和反射泛形

(1)如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如下:

public class GenericDao {

private T field1;

public void save(T obj){}

public T getId(int id){}

}

(2)注意,静态方法不能使用类定义的泛形,而应单独定义泛形。

(3)泛形的典型应用:BaseDao和反射泛型

package com.itheima.dao;


import java.io.Serializable;

import java.lang.reflect.ParameterizedType;


import org.hibernate.Session;


public class BaseDao implements Dao {

private Session session;

private Class clazz;


// public void setClazz(Class clazz) {//注入

// this.clazz = clazz;

// }


public BaseDao(){//注入

//给clazz赋值,知道具体子类的操作对象到底是什么类型的

Class cz = this.getClass();//当前实例对象

//System.out.println(cz.getName());

//得到参数化的类型

ParameterizedType type = (ParameterizedType)cz.getGenericSuperclass();// BaseDao BaseDao

clazz = (Class)type.getActualTypeArguments()[0];//得到第一个实际的泛型参数类型

}

public void add(T t) {

session.save(t);

}


public void update(T t) {

session.update(t);

}


public void delete(Serializable id) {

T t = findOne(id);

session.delete(t);

}


public T findOne(Serializable id) {

return (T)session.get(clazz, id);

}


}

package com.itheima.dao;


public class Book {


}


package com.itheima.dao;


public interface BookDao extends Dao{


}


package com.itheima.dao;

public class BookDaoImpl extends BaseDao implements BookDao {


}

package com.itheima.dao;


public class Client {


public static void main(String[] args) {

//ProductDao pDao = new ProductDaoImpl();

BookDao bDao = new BookDaoImpl();

}


}


package com.itheima.dao;


import java.io.Serializable;


public interface Dao {

/**

* 执行添加实体的功能

* @param t

*/

void add(T t);

/**

* 更新记录

* @param t

*/

void update(T t);

/**

* 按照主键删除记录

* @param id

*/

void delete(Serializable id);

/**

* 按照主键查询一条记录

* @param id

* @return

*/

T findOne(Serializable id);

}


package com.itheima.dao;


public class Product {


}


package com.itheima.dao;


import java.util.List;


//操作产品的dao

public interface ProductDao extends Dao {

//根据条件进行查询

List findByCondition(String where);

}


package com.itheima.dao;


import java.util.List;


public class ProductDaoImpl extends BaseDao implements ProductDao {

/