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程序的一个基本运行过程。比如:

来源: <http://yqsshr.blog.51cto.com/469059/147687>

6.枚举类型

http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html

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

  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)拆箱:跟自动装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为基本类型的数据。

如下:

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

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

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

来源: <http://my.oschina.net/jackieyeah/blog/199212>

http://blog.csdn.net/mlc0202/article/details/7393471

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

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

10.Java中文件读写操作。

Java使用Reader和Writer两个抽象类进行读写操作,Write中write()、flush()、close()为抽象方法,Reader中read()、close()为抽象方法。

我们可以使用BufferReader对Reader进行包装,这样可以提高读取的数据,我们可以一行一行的读取文本,使用readLine()方法。

当写入文件时,为了提高效率,写入的数据会先放入缓冲区,然后写入文件。因此这时候需要我们手动调用flush()方法。

http://blog.csdn.net/smartcat86/article/details/4085739

11、内部类

Java中内部类的重要意义是封装,不让外面的人看到内部类的创建和构造。

内部类可以访问创建它的外部对象中的内容,甚至包括私有变量。这个特性会非常的有用。

http://blog.csdn.net/wanglj0925/article/details/44574999

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

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

mock -效仿或模仿

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

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

http://www.oschina.net/translate/mockito-a-great-mock-framework-for-java-development

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非常相似。

http://www.oschina.net/translate/everything-about-java-8

来自为知笔记(Wiz)

时间: 2024-08-07 17:00:28

Java koan学习总结。的相关文章

Java基础学习——数组初识(1)

Java基础学习--数组初识(1) 1什么是数组 Java中常见的一种数据结构就是数组,数组可以分为一维数组.二维数组和多维数组. 数组是由一组相同的变量组成的数据类型,数组中每个元素具有相同的数据类型,数组中的每个元素都可以用一个统一的数组名和下标来确定. 2 数组的使用 数组的一般使用步骤: 声明数组 分配内存给该数组 下面是一维数组为例: 数据类型  数组名 []: 数组名 = new 数据类型 [数据个数]: 2.1一维数组的声明与赋值 1.数组的声明 int  num [];    

Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这部分内容需要以下Jar包支持 mysql-connector:MySQL数据库连接驱动,架起服务端与数据库沟通的桥梁: MyBatis:一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架: log4j:Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录: 修改后的pom.xm

Java并发学习之五——线程的睡眠和恢复

本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.Thread类的sleep方法,可以使线程睡眠.此方法接收一个整数作为参数,表示线程暂停运行的毫秒数.在调用sleep方法后,当时间结束时,JVM会安排他们CPU时间,线程会继续按指令执行. 另一种可能是使用一个有TimeUnit列举元素的sleep方法,使用线程类的sleep方法让当前线程睡眠,但是它接收的参数单位后会转成毫秒的. 2.当你调用sleep()方法,Thread离开CPU并在一段时间内停止运行.在这段时间内,他是不消耗CP

Java EE学习--Quartz基本用法

新浪博客完全不适合写技术类文章.本来是想找一个技术性的博客发发自己最近学的东西,发现博客园起源于咱江苏,一个非常质朴的网站,行,咱要养成好习惯,以后没事多总结总结经验吧.很多时候都在网上搜索别人的总结,我自己也总结些东西,或许多多少少能帮得上别人. 首先提到的是Quartz,一个开源的定期执行计划任务的框架.其实我内心好奇这个框架很久了,像那些能定时修改数据库数据,定时分配任务的功能一直觉得很神奇.心动不如行动,今天我就小小的学习了一下用法,力求言简意赅,大家都懂的我就不说了. 第一步:下载Qu

java nio学习笔记(一)

位置保留,待用 java nio学习笔记(一),布布扣,bubuko.com

JAVA基础学习笔记(2)

看了几天的视频了,都没时间来写下学习笔记,今天来写下第二次的学习笔记,前几天看的给忘记了,就写最新看到的吧 主要内容:1.类的变量与函数(方法) 2.对象的存储方式 3.新建一个对象及对象的赋值与调用 4.空对象 5.匿名对象 1.类的变量与函数(方法) class Dog      //类名 { String name;  //变量的声明 int age; String color; void bark()   //方法的定义(返回值为空,不带参数) { System.out.println(

java排序学习笔记

前面写了js的排序实现,总得玩玩java的哈. 同样,冒泡.选择.快速(这三个之前实现过也写过文章).堆排序,然后做比较. 主要遇到的难点: - -||想轻松点写个封装计时的逻辑,不想每调用一个排序就要写一个计时代码.想想,还是javascript写起来方便: java的话,我想到的方法是写一个抽象类:抽象出排序方法,实现一个排序计时方法(该方法调用了抽象排序,但在先后排序时加入计时代码[感觉像是aop操作]): 接着所有排序类都继承这个抽象类,并实现排序方法,调用的时候直接调用继承的排序计时方

java密码学学习整理--对称加密(着重描述3des)

1.对称加密要点 对称加密算法的核心是加密和解密操作使用同一套密钥.加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要.因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题. 2.des(参考自:http://baike.baidu.com/view/878529.htm?from_id=210508&type=syn&fromtitle=DES&fr=aladdin) DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的

《深入Java虚拟机学习笔记》- 第4章 网络移动性

Java虚拟机学习笔记(四)网络移动性 <深入Java虚拟机学习笔记>- 第4章 网络移动性,布布扣,bubuko.com