教材学习内容总结

第八章 异常处理

8.1语法与继承架构

•使用 try、catch

•Java中所有信息都会被打包为对象,如果愿意,可以尝试(try)捕捉(catch)代表错误的对象后做一些处理

•JVM 会尝试执行 try 区块中的程序代码。如果发生错误,执行流程会跳离错误发生点,然后比较 catch 括号中声明的类型,是否符合被抛出的错误对象类型,如果是的话,就执行catch 区块中的程序代码

•try、catch 用法举例:

  1. import java.util.*;
  2. public class Average2
  3. {
  4. public static void main(String[] args)
  5. {
  6. try
  7. {
  8. Scanner console = new Scanner(System.in);
  9. double sum = 0;
  10. int count = 0;
  11. while (true)
  12. {
  13. int number = console.nextInt();
  14. if (number ==0)
  15. {
  16. break;
  17. }
  18. sum += number;
  19. count++;
  20. }
  21. System.out.printf("平均 %.2f%n",sum / count);
  22. }
  23. catch (InputMismatchException ex)
  24. {
  25. System.out.println("必须输入整数");
  26. }
  27. }
  28. }

•有时错误可以在捕捉处理之后,尝试恢复程序正常执行流程,例如:

  1. import java.util.*;
  2. public class Average3
  3. {
  4. public static void main(String[] args)
  5. {
  6. Scanner console = new Scanner(System.in);
  7. double sum = 0;
  8. int count = 0;
  9. while (true)
  10. {
  11. try
  12. {
  13. int number = console.nextInt();
  14. if (number == 0)
  15. {
  16. break;
  17. }
  18. sum += number;
  19. count++;
  20. }
  21. catch (InputMismatchException ex)
  22. {
  23. System.out.printf("略过非整数输入:%s%n", console.next());
  24. }
  25. }
  26. System.out.printf("平均 %.2f%n", sum / count);
  27. }
  28. }

•异常继承架构

•Throwable 定义了取得错误信息、堆栈追踪等方法,有两个子类:java.lang.Error 与 java.lang.Exception

•异常处理:程序设计本身的错误,建议使用 Exception 或其子类实例来表现,所以通常称错误处理为异常处理

•单就语法与继承架构上来说,如果某个方法声明会抛出 Throwable 或子类实例,只要不是属于 Error、ava.lang.RuntimeException 或其子类实例,你就必须明确使用 try、catch语法加以处理,或者用 throws 声明这个方法会抛出异常,否则会编译失败

•受检异常:Exception 或其子对象,但非属于 RuntimeException 或其子对象,称为受检异常

•执行期异常(非受检异常):因为编译程序不会强迫一定得在语法上加以处理,亦称为非受检异常

•规则表达式:String 的 matches() 方法中设定了 "\d*",这是规则表示式,表示检查字符串中的字符是不是数字,若是则 matches() 返回 true

•如果父类异常对象在子类异常对象前被捕捉,则 catch 子类异常对象的区块将永远不不会被执行

•多重捕捉语法:

  1. try{
  2. 做一些事...
  3. }catch(IOException | InterruptedException | ClassCastException e){
  4. //catch 区块会在发生 IOException、InterruptedException、ClassCastException 时执行
  5. e.printStackTrace();
  6. }

•catch 括号中列出的异常不得有继承关系,否则会发生编译错误

•catch or throw?

•如果方法设计流程中发生异常,而设计时没有充足的信息知道该如何处理,那么可以抛出异常,让调用方法的客户端来处理。为了告诉编译程序这个事实,必须用 throws 声明此方法会抛出的异常类型或父类型,编译程序才会让你通过编译。例如:

  1. public class FileUtil {
  2. public static String readFile(String name)
  3. throws FileNotFoundException{
  4. StringBuilder text = new StringBuilder();
  5. Scanner console = new Scanner(new FileInputStream(name));
  6. while(console.hasNext()){
  7. text.append(console.nextLine())
  8. .apend('\n');
  9. }
  10. return text.toString();
  11. }
  12. }

•在catch区块进行完部分错误处理之后,可以使用throw(注意不是throws)将异常再抛出。如:

  1. import java.io.*;
  2. import java.util.Scanner;
  3. public class FileUtil
  4. {
  5. public static String readFile(String name) throws FileNotFoundException
  6. {
  7. StringBuilder text = new StringBuilder();
  8. try
  9. {
  10. Scanner console = new Scanner(new FileInputStream(name));
  11. while (console.hasNext())
  12. {
  13. text.append(console.nextLine())
  14. .append('\n');
  15. }
  16. }
  17. catch (FileNotFoundException ex)
  18. {
  19. ex.printStackTrace();
  20. throw ex;
  21. }
  22. return text.toString();
  23. }
  24. }

•如果抛出的是受检异常,表示你认为客户端有能力且应处理异常,此时必须在方法上使用 throws 声明;

•如果抛出的异常是非受检异常,表示你认为客户端调用方法的时机出错了,抛出异常是要求客户修正这个漏洞再来调用方法,此时也就不使用 throws 声明

•如果使用继承时,父类某个方法声明 throws 某些异常,子类重新定义该方法时可以:

  1. •不声明 throws 任何异常
  2. throws 父类该方法中声明的某些异常
  3. throws父类该方法中声明异常的子类

但是不可以:

  1. throws父类方法中未声明的其他异常
  2. throws父类方法中声明异常的父类

•自定义异常

•自定义异常类别时,可以继承 Throw、Error 或 Exception 或其子类,如果不是继承自 Error 或 RuntimeException,那么就会是受检异常

•自定义受检异常:

  1. public class CustomizedException extends Exception{
  2. ...
  3. }

•错误发生时:

  1. •无足够信息处理异常:就现有信息处理完异常后,重新抛出异常
  2. •已针对错误做了某些处理:考虑自定义异常,用以更精确地表示出未处理的错误
  3. •客户端有能力处理未处理的错误:自定义受检异常、填入适当错误信息并重新抛出,并在方法上使用 throws 加以声明
  4. •客户端没有准备好就调了方法造成未处理错误:自定义受检异常、填入适当错误信息并重新抛出

•异常堆栈

•在多重方法调用下,异常发生点可能是在某个方法之中,若想得知异常发生的根源,以及多重方法调用下的堆栈传播,可以利用异常对象自动收集的堆栈追踪来取得相关信息

•查看堆栈追踪最简单的方法,就是直接调用异常对象的 printStackTrace(),例如:

  1. public class StackTraceDemo1
  2. {
  3. public static void main(String[] args)
  4. {
  5. try
  6. {
  7. c();
  8. }
  9. catch (NullPointerException ex)
  10. {
  11. ex.printStackTrace();
  12. }
  13. }
  14. static void c()
  15. {
  16. b();
  17. }
  18. static void b()
  19. {
  20. a();
  21. }
  22. static String a()
  23. {
  24. String text = null;
  25. return text.toUpperCase();
  26. }
  27. }

•如果并不知道调用的顺序,当异常发生而被捕捉后,可以调用 printStackTrace() 在控制台显示堆栈追踪

•如果想要取得个别的堆栈元素进行处理,则可以使用 getStackTrace(),这会返回 StackTraceElement 数组,数组中索引0为异常根源的相关信息,之后为各方法调用中的信息,可以使用 StrackTraceElement 的 getClassName()、getFileName()、getLineNumber()、getMethodName() 等方法取得对应的信息

•要善用堆栈追踪,前提是程序代码中不可有私吞异常的行为

•在使用 throw 重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,而不是重抛异常的地方,例如:

  1. public class StackTraceDemo2
  2. {
  3. public static void main(String[] args)
  4. {
  5. try
  6. {
  7. c();
  8. }
  9. catch (NullPointerException ex)
  10. {
  11. ex.printStackTrace();
  12. }
  13. }
  14. static void c()
  15. {
  16. try
  17. {
  18. b();
  19. }
  20. catch (NullPointerException ex)
  21. {
  22. ex.printStackTrace();
  23. throw ex;
  24. }
  25. }
  26. static void b()
  27. {
  28. a();
  29. }
  30. static String a()
  31. {
  32. String text = null;
  33. return text.toUpperCase();
  34. }
  35. }

•如果想要异常堆栈起点为重抛异常的地方,可以使用 fillInStackTrace() 方法,这个方法会重新装填异常堆栈,将起点设为重抛异常的地方,并返回 Throwable 对象,例如:

  1. public class StackTraceDemo3 {
  2. public static void main(String[] args) {
  3. try{
  4. c();
  5. }catch(NullPointerException ex){
  6. ex.printStackTrace();
  7. }
  8. }
  9. static void c(){
  10. try{
  11. b();
  12. }catch(NullPointerException ex) {
  13. ex.printStackTrace();
  14. Throwable t = ex.fillInStackTrace();
  15. throw(NullPointerException) t;
  16. }
  17. }
  18. static void b(){
  19. a();
  20. }
  21. static String a(){
  22. String text = null;
  23. return text.toUpperCase();
  24. }
  25. }

•assert

•assert 语法:

  1. assert boolean_expression;
  2. assert boolean_expression : detail_expression;

•boolean_expression 若为 true,则什么事都不会发生,如果为 false,则会发生 java.lang.AssertionError,此时若采取的是第二个语法,则会将 detail_expression 的结果显示出来,如果当中是个对象,则调用 toString() 显示文字描述结果

•断言:程序执行的某个时间点或某个情况下,必然处于或不处于何种状态,这是一种断言

•使用断言的几个建议:

  1. •断言客户端调用方法前,已经准备好某些前置条件(通常在private方法之中)
  2. •断言客户端调用方法前,已经准备好某些前置条件(通常在private方法之中)
  3. •断言客户端调用方法后,具有方法承诺的结果。
  4. •断言对象某个时间点下的状态。
  5. •使用断言取代批注。
  6. •断言程序流程中绝对不会执行到的程序代码部分。

•checkGreaterThanZero() 是一种前置条件检查,如果程序上线后就不再需要这种检查的话,可以将之以 assert 取代,并在开发阶段使用 -ea 选项,而程序上线后取消该选项

•使用断言的时机:一定不能有 default 的状况,也可以使用 assert 来取代

8.2异常与资源管理

•使用 finally

•如果最后一定要执行关闭资源的动作,try、catch语法可以搭配finally,无论try区块中有无发生异常,若撰写有finally区块,则finally区块一定会被执行。如:

  1. import java.io.*;
  2. import java.util.Scanner;
  3. public class FileUtil
  4. {
  5. public static String readFile(String name) throws FileNotFoundException
  6. {
  7. StringBuilder text = new StringBuilder();
  8. Scanner console = null;
  9. try
  10. {
  11. console = new Scanner(new FileInputStream(name));
  12. while (console.hasNext())
  13. {
  14. text.append(console.nextLine())
  15. .append('\n');
  16. }
  17. }
  18. finally
  19. {
  20. if(console != null)
  21. {
  22. console.close();
  23. }
  24. }
  25. return text.toString();
  26. }
  27. }

•如果程序撰写的流程中先 return 了,而且也有 finally 区块,那 finally 区块会先执行完后,再将值返回,例如:

  1. public class FinallyDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println(test(true));
  6. }
  7. static int test(boolean flag)
  8. {
  9. try
  10. {
  11. if(flag)
  12. {
  13. return 1;
  14. }
  15. }
  16. finally
  17. {
  18. System.out.println("finally...");
  19. }
  20. return 0;
  21. }
  22. }

•try with resources

•尝试关闭资源语法:想要尝试自动关闭资源的对象,是在撰写在 try 之后的括号中,如果无须 catch 处理任何异常,可以不用撰写,也不用撰写 finally 自行尝试关闭资源,例如:

  1. import java.io.FileInputStream;
  2. import java.io.FileNotFoundException;
  3. import java.util.Scanner;
  4. public class FileUtil2
  5. {
  6. public static String readFile(String name) throws FileNotFoundException
  7. {
  8. StringBuilder text = new StringBuilder();
  9. try(Scanner console = new Scanner(new FileInputStream(name)))
  10. {
  11. while (console.hasNext())
  12. {
  13. text.append(console.nextLine())
  14. .append('\n');
  15. }
  16. }
  17. return text.toString();
  18. }
  19. }

•若一个异常被 catch 后的处理过程引发另一个异常,通常会抛出第一个异常作为响应,addSupperessed() 方法可将第二个异常记录在第一个异常中,JDK7 中与之对应的是getSuppressed() 方法,可返回 Throwable[],代表先前被 addSupperessed() 记录的各个异常对象

•使用自动尝试关闭资源语法时,也可搭配 catch

•java.lang.AutoCloseable

•JDK的尝试关闭资源语法可套用的对象,必须操作java.lang.AutoCloseable接口。如:

  1. public class AutoClosableDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. try(Resource res = new Resource())
  6. {
  7. res.doSome();
  8. }
  9. catch(Exception ex)
  10. {
  11. ex.printStackTrace();
  12. }
  13. }
  14. }
  15. class Resource implements AutoCloseable
  16. {
  17. void doSome()
  18. {
  19. System.out.println("做一些事");
  20. }
  21. @Override
  22. public void close() throws Exception
  23. {
  24. System.out.println("资源被关闭");
  25. }
  26. }

•尝试关闭资源语法也可以同时关闭两个以上的对象资源,只要中间以分号分隔

•在 try 的括号中,越后面撰写的对象资源会越早被关闭

第九章 Collection 与 Map

9.1 使用 Collection 收集对象

•认识 collection 架构

•收集对象的行为,像是新增对象的 add()方法、移除对象的 remove()方法等,都是定义在 java.util.Collection 中

•既然可以收集对象,也要能逐一取得对象,这就是 java.lang.Iterable 定义的行为,它定义了 iterator() 方法返回 java.lang.Iterable 操作对象,可以让你逐一取得收集的对象

•收集对象的共同行为定义在 Collection 中,然而收集对象会有不同的需求

  1. java.util.List:收集时记录每个对象的索引顺序,并可依索引取回对象
  2. java.util.Set:收集的对象不重复,具有集合的行为
  3. java.util.Queue:收集对象时以队列方式,收集的对象加入至尾端,取得对象时从前端
  4. java.util.Deque:可对Queue的两端进行加入、移除等操作
  5. java.util.ArrayList:以数组操作 List(想要收集对象时具有索引顺序,操作方法之一是使用数组)

•List

•List 是一种Collection,作用是收集对象,并以索引方式保留收集的对象顺序,其操作类之一是java.util.ArrayList

•ArrayList 特性

  1. •考虑是否使用 ArrayList,就等于考虑是否要使用到数组的特性
  2. •数组在内存中会是连续的线性空间,根据索引随机存取时速度快,如果操作上有这类需求时,像是排序,就可使用ArrayList,可得到较好的速度表现

•LinedList 特性

  1. LinkedList在操作List接口时,采用了链接(Link)结构
  2. •在 SimpleLinkedList 内部使用 Node 封装新增的对象,每次 add() 新增对象之后,将会形成链状结构
  3. •若收集的对象经常会有变动索引的情况,也许考虑链接方式操作的List会比较好,像是随时会有客户端登录或注销的客户端List,使用LinkedList会有比较好的效率

•Set

•使用 Set 接口操作对象:在收集对象的过程中若有相同的对象,则不再重复收集,若有这类需求,可以使用 Set 接口的操作对象,例如:

  1. import java.util.*;
  2. public class WordCount
  3. {
  4. public static void main(String[] args)
  5. {
  6. Scanner console = new Scanner(System.in);
  7. System.out.print("請輸入英文:");
  8. Set words = tokenSet(console.nextLine());
  9. System.out.printf("不重複單字有 %d 個:%s%n", words.size(), words);
  10. //显示收集的个数与字符串
  11. }
  12. static Set tokenSet(String line)
  13. {
  14. String[] tokens = line.split(" ");
  15. //String 的 split() 方法,可以指定切割字符串的方式,在这里指定以空格切割,split()会返回 String[],包括切割的每个字符串
  16. return new HashSet(Arrays.asList(tokens));
  17. //将 String[] 中的每个字符串加入 Set 的操作 HashSet 中
  18. }
  19. }

•HashSet的操作概念是,在内存中开设空间,每个空间会有个哈希编码

•如果对象要加入 HashSet,则会调用对象的 hashCode() 取得哈希码,并尝试放入对应号码的哈希桶中。如果哈希桶中没对象,则直接放入;如果哈希桶中有对象,会再调用对象的 equals() 进行比较,如果比较结果为 false,则表示两个对象非重复对象,可以收集,如果比较结果为 true,表示两个对象是重复对象,则不予收集

•Queue

•Queue继承自Collection,所以也具有Collection的add()、remove()、element()等方法,然而Queue定义了自己的offer()、poll()与peek()等方法,最主要的差别之一在于:add()、remove()、element()等方法操作失败时会抛出异常,而offer()、poll()与peek()等方法操作失败时会返回特定值。

•如果对象有操作 Queue,并打算以队列方式使用,且队列长度受限,通常建议使用offer()、poll()与peek()等方法

•offer():offer() 方法用来在队列后端加入对象,成功返回 true ,失败则返回 false

•poll():poll() 方法用来取出队列前端对象,若队列为空则返回 null

•peek():peek() 用来取得(但不取出)队列前端对象,若队列为空则返回 null

•LinkeedList 不仅操作了 List 接口,也操作了 Queue 的行为,所以可将 LinkedList 当作队列来使用,例如:

  1. import java.util.*;
  2. interface Request{
  3. void execute();
  4. }
  5. public class RequestQueue {
  6. public static void main(String[] args) {
  7. Queue requests = new LinkedList();
  8. offerRequestTo(requests);
  9. process(requests);
  10. }
  11. static void offerRequestTo(Queue requests){
  12. for(int i=1;i<6;i++){
  13. Request request = new Request(){
  14. public void execute(){
  15. System.out.printf("处理数据%f%n",Math.random());
  16. }
  17. };
  18. requests.offer(request);
  19. }
  20. }
  21. static void process(Queue requests){
  22. while(requests.peek()!=null){
  23. Request rquest = (Request) request.poll();
  24. request.execute();
  25. }
  26. }
  27. }

•对队列的前端和尾端进行操作:在前端加入对象与取出对象,在尾端加入对象与取出对象,Queue的子接口Deque就定义了这类行为

•操作失败时抛出异常:addFiret()、removeFirst()、getFirst()、addLast()、removeLast()、getLast()

•操作失败时返回特定值:offerFirst()、pollFirst()、peekFirst()、offerLast()、pollLast()、peekLast()

•java.util.ArrayDeque操作了Deque接口,可以使用ArrayDeque来操作容量有限的堆栈

•使用泛型

•泛型语法使用样例:

  1. import java.util.Arrays;
  2. public class ArrayList<E>
  3. //类名称旁有角括号<>,这表示此类支持泛型
  4. {
  5. Object[] elems;
  6. private int next;
  7. public ArrayList(int capacity)
  8. {
  9. elems = new Object[capacity];
  10. }
  11. public ArrayList()
  12. {
  13. this(16);
  14. }
  15. public void add(E e)
  16. {
  17. if(next == elems.length)
  18. {
  19. elems = Arrays.copyOf(elems, elems.length * 2);
  20. }
  21. elems[next++] = e;
  22. }
  23. public E get(int index)
  24. {
  25. return (E) elems[index];
  26. }
  27. public int size()
  28. {
  29. return next;
  30. }
  31. }

•只要声明参考时有指定类型,那么创建对象时就不用再写类型时了

•Lambda

•Lambda 表达式:

  1. Request request = () -> out.printf("处理数据 %f%n",Math.random());

•相对于匿名类语法来说,Lambda表达式的语法省略了接口类型与方法名称,->左边是参数列,而右边是方法本体

•在使用 Lambda 表达式,编译程序在推断类型时,还可以用泛型声明的类型作为信息来源

•虽然不鼓励使用Lambda表达式来写复杂的演算,不过若流程较为复杂,无法在一行的Lambda表达式中写完时,可以使用区块{}符号包括演算流程

•在Lambda表达式中使用区块时,如果方法必须返回值,在区块中就必须使用return

•Iterable与Iterator

•iterator() 方法会返回 java.util.Iterator 接口的操作对象,这个对象包括了Collection 收集的所有对象,可以使用Iterator 的 hasNext() 看看有无下一个对象,若有,再使用 next() 取得下一个对象

  1. static void forEach(Collection collection) {
  2. Iterator iterator = colleciton.iterator();
  3. while(iterator.hasNext()){
  4. System.out.println(iterator.next());
  5. }
  6. }

•interator()方法提升至新的java.util.Iterable父接口

•在JDK5之后有了增强式for循环,除了运用在数组上,还可运用在操作Iterable接口的对象上

  1. static void forEach(Iterable iterator) {
  2. for(Object o: iterable){
  3. System.out.println(o);
  4. }
  5. }

•Iterable 新增了 forEach() 方法,可以让你对迭代对象进行指定处理

•Comparable与Comparator

•Collections的sort()方法要求被排序的对象必须操作java.lang.Comparable接口,这个接口有个compareTo()方法必须返回大于0、等于0或小于0的数

•Collections的sort()方法有另一个重载版本,可接受java.util.Comparator接口的操作对象,如果使用这个版本,排序方式将根据Comparator的compare()定义来决定,例如:

  1. import java.util.*;
  2. class StringComparator implements Comparator<String>
  3. {
  4. @Override
  5. public int compare(String s1, String s2)
  6. {
  7. return -s1.compareTo(s2);
  8. }
  9. }
  10. public class Sort5
  11. {
  12. public static void main(String[] args)
  13. {
  14. List<String> words = Arrays.asList("B", "X", "A", "M", "F", "W", "O");
  15. Collections.sort(words, new StringComparator());
  16. System.out.println(words);
  17. }
  18. }

•在Java的规范中,跟顺序有关的行为,通常要不对象本身是Comparable,要不就是另行指定Comparator对象告知如何排序

•JDK8在List上增加了sort()方法,可接受Comparator实例来指定排序方式

9.2 键值对应的Map

•常用 Map 操作类

•若要根据某个键来取得对应的值,可以事先利用java.util.Map接口的操作对象来建立键值对应数据,之后若要取得值,只要用对应的键就可以迅速取得

•建立 Map 操作对象时,可以使用泛型语法指定键与值的类型

•要建立键值对应,可以使用 put() 方法,第一个自变量是键,第二个自变量是值

•对于 Map 而言,键不会重复,判断键是否重复是根据 hashCode() 与 equals(),所以作为键的对象必须操作 hashCode() 与 equals()。若要指定键取回对应的值,则使用 get() 方法

•如果想要键是有序的,可以使用 TreeMap。如果使用 TreeMap 建立键值对应,则键的部分将会排序,条件是作为键的对象必须操作 Comparable 接口,或者是在创建 TreeMap 时指定操作 Comparator 接口的对象,例如:

  1. import java.util.*;
  2. public class Messages2
  3. {
  4. public static void main(String[] args)
  5. {
  6. Map<String, String> messages = new TreeMap<>();
  7. messages.put("Justin", "Hello!Justin的信息!");
  8. messages.put("Monica", "給Monica的悄悄话!");
  9. messages.put("Irene", "Irene的可爱猫喵喵叫!");
  10. System.out.println(messages);
  11. }
  12. }

•Properties类继承自Hashtable,HashTable操作了Map接口,Properties自然也有Map的行为。虽然也可以使用put()设定键值对应、get()方法指定键取回值,不过一般常用Properties的setProperty()指定字符串类型的键值,getProperty()指定字符串类型的键,取回字符串类型的值,通常称为属性名称与属性值。

•可以使用 Properties 的 load() 方法指定 InputStream 的实例

•如果想取得Map中所有的键,可以调用Map的keySet()返回Set对象。由于键是不重复的,所以用Set操作返回是理所当然的做法,如果想取得Map中所有的值,则可以使用values()返回Collection对象。例如:

  1. import java.util.*;
  2. import static java.lang.System.out;
  3. public class MapKeyValue
  4. {
  5. public static void main(String[] args)
  6. {
  7. Map<String, String> map = new HashMap<>();
  8. map.put("one", "一");
  9. map.put("two", "二");
  10. map.put("three", "三");
  11. out.println("显示鍵");
  12. map.keySet().forEach(key -> out.println(key));
  13. out.println("显示值");
  14. map.values().forEach(key -> out.println(key));
  15. }
  16. }

•如果想同时取得Map的键与值,可以使用entrySet()方法,这会返回一个Set对象,每个元素都是Map.Entry实例。可以调用getKey()取得键,调用getValue()取得值。

教材学习中的问题和解决过程

本周对之前学习的内容进行了总结,感觉对之前学习的“行为、函数、方法”分不太清,现将这三者的异同总结如下:

方法和函数是一个意思,是某一个对象的一种行为。一般把类里的函数叫方法、服务或操作,主要强调这个类的对象封装了一些属性和方法(变量和函数)并向外提供服务

行为可被接口定义,类可以操作两种以上的行为。

代码调试中的问题和解决过程

本周的代码是按照书上的代码进行练习的,代码运行基本没有什么问题,经过这几周不断地敲代码不断地练习,现在名称打错、标点没注意中英文的情况已经明显少了,但是觉得这周学习的有些代码比较难理解,还需要继续学习。

本周代码托管截图

其他(感悟、思考等,可选)

通过这几周的学习,我越来越真切地感受到实践的重要性,把课本上的内容看懂了之后想要自己编一个程序还是有困难的,所以还是要多敲、多练。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 1/3 18/38
第三周 500/1000 1/4 22/60
第四周 300/1300 1/5 30/90
第五周 800/2100 1/6 30/120

参考资料

# 20145210 《Java程序设计》第05周学习总结的更多相关文章

  1. 20155335 俞昆 2016-2017-2 《Java程序设计》第九周学习总结

    学号 2016-2017-2 <Java程序设计>第九周学习总结 ##JDBC入门 在正式介绍JDBC前,已知JDBC是用来执行SQL的解决方案,开发人员使用JDBC的标准接口,开发人员不 ...

  2. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  3. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  4. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  5. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  6. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  7. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  8. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  9. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  10. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

随机推荐

  1. hdu-----(1507)Uncle Tom's Inherited Land*(二分匹配)

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  2. oracle序列为什么不是从1开始

    问题原因: ·当我们使用序列作为插入数据时,如果使用了“延迟段”技术,则跳过序列的第一个值 ·Oracle从 11.2.0.1版本开始,提供了一个“延迟段创建”特性: 即 当我们创建了新的表(tabl ...

  3. Java script基础

    Java script基础 Js的每个语句后面都要有分号. <script  type="text/java script">所有JS内容</script> ...

  4. Snappy压缩

    Snappy压缩时,碰到不能解压问题,所用服务器Tomcat8.经验证,降低Tomcat版本为7,才可正常解压文件. 若碰到偶尔不能解压的问题,试着换个浏览器试试.

  5. 推荐cms

    推荐cms : 国外:drupal  joomla wordpress 国内:phpcms

  6. jar转dll

    IKVM http://www.cnblogs.com/luckeryin/archive/2012/03/28/2421274.html

  7. BZOJ1584 [Usaco2009 Mar]Cleaning Up 打扫卫生

    令$f[i]$表示以i为结尾的答案最小值,则$f[i] = min \{f[j] + cnt[j + 1][i]^2\}_{1 \leq j < i}$,其中$cnt[j + 1][i]$表示$ ...

  8. c#获取系统时间的方法(转)

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  9. apache rewrite设置 禁止某个文件夹执行php文件

    RewriteRule (data|templates)/(.*).(php)$ – [F]

  10. Mac android 开发 sdk配置和手机连接

    本文适合已经很熟悉android开发的人员: 首先安装Mac版的eclipse 其次是android sdk的准备: 由于android sdk在线更新很不方便,所以可以选择复制:准备好Mac下的an ...