20155302 2016-2017-2 《Java程序设计》第九周学习总结
20155302 2016-2017-2 《Java程序设计》第九周学习总结
教材学习内容总结
-
基本数据库操作相关的JDBC接口或类是位于java.sql包中。在程序中要取得数据库联机,我们必须有几个动作:
注册Driver操作对象;
取得Connection操作对象;
关闭Connection操作对象。
- 除了协议是以jdbc开始之外,JDBC URL格式各家都不相同,必须查询数据库产品的使用手册。下面以MySQL为例,“子协议”是桥接的驱动程序,数据库产品名称或联机机制,MySQL的子协议就是mysql。
- 关闭Connection操作对象
取得Connection对象之后,可以使用isClosed方法测试与数据库的连接是否关闭。在操作完数据库之后,若确定不在需要连接,则必须使用close来关闭与数据库的连接,以释放连接时相关的必要资源,像是联机相关对象,授权资源等。
对于上面代码中的try…catch…finally部分,由于JDK7之后,JDBC的Connection,Statemet,ResultSet等接口都是java.lang.AutoClosable的子接口,所以我们可以尝试自动关闭语法来简化程序的攥写。
那么在底层,DriverManager使如何进行联机的呢?DriverManager会在循环中逐一取出注册的每个driver实例,使用指定的JDBC URL来调用Driver的connect方法,尝试取得Connection实例。对于底层的实现,有兴趣的伙伴可以看看DriverManager中相关的原始码。
-
PreparedStatement可以重复使用,它可以减少生成对象的负担;
因为可以将SQL描述预编译为数据库的执行指令,所以执行速度就快了许多;
使用这种写法,写出来的代码也会更加安全,有兴趣的同学可以了解SQL Injection,相信你会对安全方面有一些了解,在这里我就不细说了;
使用前面留言板代码中的写法会造成效能上的负担,因为串接或格式化字符串会产生新的String对象,如果串接字符串动作经常进行,那么将会是效能上的隐忧。 -
1、类加载:指的是将类的class文件读入JVM,并为之创建一个Class对象。
2、类连接:指的是把类的二进制数据合并到JRE中,这又分为3个阶段:
a)、校验:检查载入Class文件数据的正确性。
b)、准备:给类的静态变量分配存储空间,并进行默认初始化。
c)、解析:将类的二进制数据中的符号引用替换成直接引用。
3、初始化:对类的静态变量、静态初始化块进行初始化。
- 1、全盘负责:当一个类加载器负责加载某个Class的时候,该Class所依赖的和引用的其他Class也将由该类加载器负责载入。
2、父类委托:先委托父加载器试图加载该类,只有在父加载器无法加载该类时才从自己的类路径中查找并装载该类。
3、缓存机制:缓存机制保证所有被家加载过的类都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存中搜寻。缓存中搜寻不到,才会重新读取该类对应的二进制数据,并创建对应的Class对象。
- 操作数组:
Object arr = Array.newInstance(String.class,10);//创建一个简单的String数组。
Array.set(arr,5,”abc”);//给该数组下标为5的元素赋值
Object name = Array.get(arr,5);//获取该元素
- 访问属性:
Field f = clazz.getDeclaredField(属性名);//根据属性名获取Field对象
f.get(对象);//根据对象得到属性值。
- 调用方法:
Method m = clazz.getMethod(方法名,参数类型);//根据方法名和参数类型创建Method对象。
m.invokej(对象,属性值);//根据对象和方法参数调用方法。
若需调用private方法,先调用Method对象的setAccessible(true);
- 通过Class对象创建对象:
例如有一个Apple类。Class clazz = Class.forName(“com.stopTalking.crazy.Apple”);
该Apple类有一个默认构造器、一个String类型参数的构造器、一个String类型、int类型的构造器。
- 获得Apple对象有2种方式:
a)、用Apple类默认构造器:Object o1 = clazz.newInstance();
b)、用一个String类型参数的构造器:Object 02 = clazz.getConstructor(String.class).newInstance(“apple”);
c)、用一个String类型、int类型的构造器:Object 02 = clazz.getConstructor(String.class,int.class).newInstance(“apple”,”3”);
- 获得Class对象有3种方式:
a)、Class类的forName方法,传入全限定类名。需要抛出异常ClassNotFoundException
b)、调用该类的class属性。
c)、调用某对象的getClass()方法。
- ClassLoader对象。
可以通过2种方式获得当前ClassLoader对象,一种是通过当前线程:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
若已经有了Class对象,那么可以通过Class对象的getClassLoader()方法:
ClassLoader loader2 = Xxx.class.getClassLoader();
- 泛型定义:
(1)仅定义在方法上的泛型语法
(2)用来限制泛型可用类型的extends与super关键字
(3)?类型通配字符的使用
- 1、如果B是A的子类,而Node< A>可视为一种Node< B>,则称为Node具有逆变性。Java泛型不具有逆变性,可以使用类型通配字符?与super来声明,使其达到类似的逆变性的效果。
2、若泛型类或接口不具共变性或逆变性,则称为不可变的或严谨的。
教材学习中的问题和解决过程
- 问题1:方式一:反射加载
Class cl = Class.forName("classname");
方式二
使用ClassLoader
URLClassLoader loader = new URLClassLoader(urls);
Class cl = loader.loadClass("classname);
这两种方式加载类 有什么区别吗? 或者说有什么联系?
- 问题1解决方案:一样的,没有区别,类装载器装载是指定装载器,forname是使用当前类装载器装载。
代码调试中的问题和解决过程
-
问题1:
class MyClass<E> { public <T> MyClass(T t) { System.out.println("t参数的值为:" + t); } } public class GenericDiamondTest { public static void main(String[] args) { MyClass<String> mc1 = new MyClass<>(5); MyClass<String> mc2 = new <Integer> MyClass<String>(5); 2 // MyClass<String> mc3 = new <Integer> MyClass<>(5); 3 } }
2处MyClass到底是String还是Integer ,这么表示怎么理解?3处的代码为什么不对啊?
- 问题1解决方案:2处,MyClass当然是String,只不过它的构造函数参数Integer。
3处,错误是,当调用new时,不能用来显示指定类型信息,这个由编译器推导。
代码托管
上周考试错题总结
- Linux中使用cp命令拷贝目录时要加上()选项。
A .-r
B .-directory
C .-all
D .-R
正确答案: A D
-
NIO2中,可以使用()中的方法取出文件系统根目录信息。
A .Path
B .DirectoryStream
C .FileStore
D .FileSystem
正确答案: D -
正则表达式”(‘|”)(.*?)\1”匹配 “'Hello',"World””的结果是()
A .不匹配
B .'Hello'
C ."World"
D .'Hello',"World"
正确答案: B C -
abc? 匹配( )
A .ab
B .abc
C .abcc
D .abccc
正确答案: A B -
正则表达式 zo* 匹配()
A .z
B .zo
C .zoo
D .zooooooooooooooooooooooooooo
正确答案: A B C D -
正则表达式“r.t”匹配字符串“rat”的Java 代码表达式是()
A ."rat".matcher("r.t")
B ."r.t".matcher("rat")
C .Pattern.compile("rat").matcher("r.t")
D .Pattern.compile("r.t").matcher("rat")
正确答案: D
结对及互评
评分标准
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
-
扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
-
博客中值得学习的或问题:
- xxx
- xxx
- ...
-
代码中值得学习的或问题:
- xxx
- xxx
- ...
-
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
点评过的同学博客和代码
其他(感悟、思考等,可选)
本周学习的三章知识较为简单,但需要和之前学习的内容基础结合起来,所以前面的基础很重要,在学习过程中我不断翻阅前面知识,结合起来学习会使效率提高。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 20/20 | 2/2 | 20/20 | |
第二周 | 140/160 | 2/4 | 18/38 | |
第三周 | 113/273 | 1/5 | 20/58 | |
第四周 | 335/608 | 1/6 | 20/78 | |
第五周 | 1159/1408 | 1/7 | 30/108 | |
第六周 | 452/1860 | 1/8 | 20/128 | |
第七周 | 343/2203 | 1/9 | 30/158 | |
第八周 | 448/2651 | 1/10 | 20/178 | |
第九周 | 516/3167 | 1/11 | 20/198 |