废话不多说,先看下我今天复习到了什么:
1.看了一天的thinking in java总算是把以前一直区分不了的static final和final给区分,当然static这不是光看下thinking in java就能了解的了,所以我还是会慢慢来研究一番JVM的.但是从一些字面我们知道static修饰的成员这是属于我们类本身的,不关对象半毛钱事哈,在加载我们的类的时候就已经是将我们的static修饰的成员给加载了,而且只加载一次,所以不能你new多少对象,static修饰的成员我们永远只有一份,好像跑题了,还是聊回咱今天学习的final吧.根据thinking in java记载final有三种修饰位置,修饰数据,修饰方法,修饰类.
1)这里的数据主要是成员变量以及我们方法中的入参,而这些数据我们又可以细分其类型有主类型和对象类型的,修饰主类型时代表这个主类型一旦被初始化就不能再变了,修饰对象的话,就表示我们这个句柄(引用)就没法再指向其他的对象了,但是对象本身还是可以被改变的,数组也是特殊的对象.入参也是这么区分的,所以同理得证哈.
2).修饰方法,表示我们的方法作者不想后来的使用者修改这个方法,当然按照书中所写在方法体内容不是特别多的时候用final可以提高性能哟.
3).修饰类,表示在该类的所有方法都已经加上了final了,所以同理了,final修饰的类是不可以被继承了,但是其自身还是可以集成其他类的,比如我们的String.
注意:我们private修饰的方法其实就相当于加上了final了呢.final在一些地方可以改善性能,但是这对于我们的扩展绝逼不是建利好消息,所以慎用final.
还有要补充的一点final和static final的一些小区别,一般final修饰的数据可以先声明后通过构造器等初始化,但是static fianl修饰的数据必须是声明同时初始化啊,这里初始化并不代表我们的数据就一定要大写,大写默认是常量,也就是在编译前就已经知道值了,但是像Math,random()给我们的static final修饰的数据赋值时是在编译后才能知道其值的.
后记:
回家后翻来方立勋的视频看看模拟的写了大概半个DButils的框架吧,先睹为快.只是为了记笔记,学习学习哈.老鸟飞过.上代码:
实体类
package com.imooc.domain; public class Account { private int id; private String name; private float money; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getMoney() { return money; } public void setMoney(float money) { this.money = money; } }
半个框架
package com.imooc; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import com.mchange.v2.c3p0.ComboPooledDataSource; /** * 使用DBCP数据源获取数据库连接 * @author pic * */ public class JdbcUtils_C3P0 { private static Connection conn=null; private static ComboPooledDataSource combo = null; static{ try{ combo=new ComboPooledDataSource(); }catch(Exception e){ e.printStackTrace(); throw new ExceptionInInitializerError("稍后重试!!"); } } public static Connection getConnection() throws SQLException { return combo.getConnection(); } public static void main(String[] args) throws SQLException { Connection conn = JdbcUtils_C3P0.getConnection(); System.out.println(conn); } //2.关闭连接等一些资源 public static void release(Connection conn,Statement st,ResultSet rs) { if(rs!=null){ try { rs.close(); } catch (SQLException e) { if(rs!=null){ rs=null; } e.printStackTrace(); } } if(st!=null){ try { st.close(); } catch (SQLException e) { if(st!=null){ st=null; } e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { if(conn!=null){ conn=null; } e.printStackTrace(); } } } public static void update(String sql,Object[] params){ Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtils_C3P0.getConnection(); ps = conn.prepareStatement(sql); for(int i=0;i<params.length;i++){ ps.setObject(i+1, params[i]); } ps.executeUpdate(); } catch (Exception e) { throw new RuntimeException(e); }finally{ JdbcUtils_C3P0.release(conn, ps, rs); } } /** * 我们可以自己实现提供这个handler的接口,只需要外界提供Class就好了 * @param sql:需要发送给数据库的sql语句 * @param params:占位符的参数 * @param handler 提供外界提供返回结果的类型的处理接口 * @return */ public static Object query(String sql,Object[] params,ResultSerHandler handler){ Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtils_C3P0.getConnection(); ps = conn.prepareStatement(sql); for(int i=0;i<params.length;i++){ ps.setObject(i+1, params[i]); } rs=ps.executeQuery(); Object bean = handler.handler(rs); return bean; } catch (Exception e) { throw new RuntimeException(e); }finally{ JdbcUtils_C3P0.release(conn, ps, rs); } } } interface ResultSerHandler{ public Object handler(ResultSet rs); } class BeanHandler implements ResultSerHandler{ private Class clazz; public BeanHandler(Class clazz){ this.clazz=clazz; } @Override public Object handler(ResultSet rs) { try { //如果没数据直接返回空 if(!rs.next()){ return null; } //创建封装结果的bean Object bean = clazz.newInstance(); ResultSetMetaData meta = rs.getMetaData(); int count = meta.getColumnCount(); for(int i=0;i<count;i++){ String name = meta.getColumnName(i+1); Object value = rs.getObject(name); //反射得到列明对应的属性 Field field = clazz.getDeclaredField(name); //暴力打开访问权限 field.setAccessible(true); //将列明对象的结果整到bean中返回即可 field.set(bean, value); } return bean; } catch (Exception e) { throw new RuntimeException(e); } } }
测试类:
package com.imooc; import org.junit.Test; import com.imooc.domain.Account; public class TestUtils { @Test public void testAdd(){ Account a = new Account(); a.setName("ggg"); a.setMoney(40000); add(a); } @Test public void testFindById(){ Account account = findById(1); System.out.println(account.getId()); System.out.println(account.getName()); System.out.println(account.getMoney()); } public void add(Account a){ String sql = "insert into account(name,money) values(?,?)"; Object[] params = {a.getName(),a.getMoney()}; JdbcUtils_C3P0.update(sql, params); } public Account findById(int id){ String sql = "select * from account where id=?"; Object[] params = {id}; Account account = (Account) JdbcUtils_C3P0.query(sql, params, new BeanHandler(Account.class)); return account; } }
打算复习完就换工作,学不到东西果断撤退,对于跳槽也是IT界的必争呀!!!