zoukankan      html  css  js  c++  java
  • 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非常相似。








  • 相关阅读:
    C# SQLiteHelper
    C# 自定义等待窗口
    C# Work PPT to PDF
    SQL 分隔字符串
    SQL 客户端查看
    SQL 自定义四舍五入
    SQL 并联更新
    C# 委托简单例子
    每天一个Linux命令(52)telnet命令
    每天一个Linux命令(51)ss命令
  • 原文地址:https://www.cnblogs.com/fengmanlou/p/4854216.html
Copyright © 2011-2022 走看看