Java koan学习总结。

1、对象的类型转换
    子类对象可以自动转换成父类,而父类转换成子类必须使用强制转换。一个基类的引用类型变量可以指向其子类的对象,一个基类的引用不可以访问其子类对象新增的成员(属性和方法)。可以使用 引用变量 instance of 类名来判断该引用变量所指向的对象是否属于该类或该类的子类。子类的对象可以当作基类的对象来使用,称作向上转型(upcasting),反之称为向下转型(downcasting)。

2、把子类的对象让父类的对象变量引用即为向上转型,这样会导致该对象无法访问其子对象的新增的成员。

3、注意switch-case中关于贯穿特性的理解。

4、构造函数会先去调用其父类的构造函数,在调用子类的构造函数。如果子类构造器没有显式地调用父类的构造器,则将自动调用父类的默认(没有参数)的构造器。如果父类没有不带参数的构造器(默认的构造器),并且在子类的构造器中又没有显式地调用父类的构造器,则java编译器将报告错误。

5.java中代码执行的顺序:

我们以下面的类来说明一个基本的Java类的运行顺序:

第1行 public class Test {
第2行 private String name = "Java私塾";
第3行 private int age = 2;
第4行 public Test(){
第5行 age = 1000;//期望能到1000年,呵呵
第6行 }
第7行 public static void main(String[] args) {
第8行 Test t = new Test();
第9行 System.out.println(t.name+”的年龄是”+t.age+”年”);
第10行 }
第11行 }
运行的基本顺序是:
(1):先运行到第7行,这是程序的入口
(2):然后运行到第8行,这里要new一个Test,就要调用Test的构造方法
(3):就运行到第4行,注意:可能很多人觉得接下来就应该运行第5行了,错!初始化一个类,必须先初始化它的属性
(4):因此运行到第2行,然后是第3行
(5):属性初始化完过后,才回到构造方法,执行里面的代码,也就是第5行
(6):然后是第6行,表示new一个Test实例完成
(7):然后回到main方法中执行第9行
(8):然后是第10行
运行的结果是:Java私塾的年龄是1000年
说明:这里只是说明一个基本的运行过程,没有考虑更多复杂的情况。
继承中:初始化子类必先初始化父类
有继承的类在运行的时候,一定要记得:初始化子类必先初始化父类,这是Java程序的一个基本运行过程。比如:

 

6.枚举类型

私有构造方式,使得外部无法动态地去创建一个枚举类对象

  1. public class LightTest {
  2. // 1.定义枚举类型
  3. public enum Light {
  4. // 利用构造函数传参
  5. RED(1), GREEN(3), YELLOW(2);
  6. // 定义私有变量
  7. private int nCode;
  8. // 构造函数,枚举类型只能为私有
  9. private Light(int _nCode) {
  10. this.nCode = _nCode;
  11. }
  12. @Override
  13. public String toString() {
  14. return String.valueOf(this.nCode);
  15. }
  16. }



7.异常处理
  1. private void tryCatchFinallyWithVoidReturn(StringBuilder whatHappened) {
  2. try {
  3. whatHappened.append("did something dangerous");
  4. doStuff();
  5. } catch(IOException e) {
  6. whatHappened.append("; the catch block executed");
  7. return;
  8. } finally {
  9. whatHappened.append(", but so did the finally!");
  10. }
  11. }
即使在cath中加入了return,还是会执行finally。

注意Java中return和异常抛出的区别。

 需要注意的是,一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配和捕获异常类型的机会。

http://blog.csdn.net/hguisu/article/details/6155636 该博客关于异常的分析写得非常清楚。



8. 操作符(operator)
  1. @Koan
  2. public void shortCircuit() {
  3. int i = 1;
  4. int a = 6; // Why did we use a variable here?
  5. // What happens if you replace 'a' with '6' below?
  6. // Try this with an IDE like Eclipse...
  7. if ( (a < 9 ) || (++i < 8) ) i = i + 1;
  8. // replace 'a' with '6' have no difference.
  9. // because if is combine with "||" and the (a<9) is true,the whole is true,
  10. // so the (++i < 8 ) does not execute. right?
  11. assertEquals(i, 2);
  12. }

&& 和 || 是逻辑操作符,&和| 是位操作符。

9自动装箱和拆箱

 Java 1.5中引入了自动装箱和拆箱机制:

       (1)自动装箱把基本类型用它们对应的引用类型包装起来,使它们具有对象的特质,可以调用toString()hashCode()getClass()equals()等方法。

        如下:

        Integer a=3;//这是自动装箱

        其实编译器调用的是static Integer valueOf(int i)这个方法,valueOf(int i)返回一个表示指定int值的Integer对象,那么就变成这样: 

        Integer a=3;   =>    Integer a=Integer.valueOf(3);

        (2)拆箱:自动装箱的方向相反,将IntegerDouble这样的引用类型的对象重新简化为基本类型的数据。

         如下:

         int i = new Integer(2);//这是拆箱

         编译器内部会调用int intValue()返回该Integer对象的int值

         注意:自动装箱和拆箱是由编译器来完成的,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。


 


注意:自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,

如果超出了这个值的范围就不会被重用的,所以每次new出来的都是一个新的对象,结果自然会是false


10.Java中文件读写操作。

Java使用Reader和Writer两个抽象类进行读写操作,Write中write()、flush()、close()为抽象方法,Reader中read()、close()为抽象方法。    
我们可以使用BufferReader对Reader进行包装,这样可以提高读取的数据,我们可以一行一行的读取文本,使用readLine()方法。
当写入文件时,为了提高效率,写入的数据会先放入缓冲区,然后写入文件。因此这时候需要我们手动调用flush()方法。


11、内部类

Java中内部类的重要意义是封装,不让外面的人看到内部类的创建和构造。
内部类可以访问创建它的外部对象中的内容,甚至包括私有变量。这个特性会非常的有用。



12.Locale 主要在软件本地化时使用。

13.Mock -Java开发的模拟测试框架

mock -效仿或模仿 

单元测试的思路就是我们想在不涉及依赖关系的情况下测试代码,这种测试可以让你无视代码的依赖关系去测试代码的有效性。核心思想是如果代码按设计正常工作,并且依赖关系也是正常的,那么他们应该会同时工作正常。

谈到模拟时,你只需要关心三样东西:设置测试数据、设置预期结果,验证结果。一些单元测试方案根本不涉及这些,有的值涉及测试数据,有的只涉及设置预期结果和验证。



14.Java 8 的新特性

1、Lambda

2、接口中支持静态方法和default 方法。(Default方法具有实现)

若继承的多个接口有相同的default方法,则必须override此方法。

http://www.codeceo.com/article/java-8-default-method.html 关于deault方法的一些细节。 

3、Stream操作。
Java 8 中的Stream 是集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation) ,或者大批量的数据处理。Stream API借助同样新出现的Lambda表达式,极大的提高了编程效率和可读性。同时它提供串行和并行两张模式进行汇聚操作,并发模式能够充分利用多核处理的优势,使用fork/join并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错,但使用Stream API无需编写一行多线程代码,就可以很方便的写出高性能并发程序。个人认为其形式上跟Python非常相似。








原文地址:https://www.cnblogs.com/fengmanlou/p/4854216.html