标签:
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.枚举类型
私有构造方式,使得外部无法动态地去创建一个枚举类对象
public class LightTest {
// 1.定义枚举类型
public enum Light {
// 利用构造函数传参
RED(1), GREEN(3), YELLOW(2);
// 定义私有变量
private int nCode;
// 构造函数,枚举类型只能为私有
private Light(int _nCode) {
this.nCode = _nCode;
}
@Override
public String toString() {
return String.valueOf(this.nCode);
}
}
7.异常处理
private void tryCatchFinallyWithVoidReturn(StringBuilder whatHappened) {
try {
whatHappened.append("did something dangerous");
doStuff();
} catch(IOException e) {
whatHappened.append("; the catch block executed");
return;
} finally {
whatHappened.append(", but so did the finally!");
}
}
即使在cath中加入了return,还是会执行finally。
注意Java中return和异常抛出的区别。
需要注意的是,一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配和捕获异常类型的机会。
8. 操作符(operator)
@Koan
public void shortCircuit() {
int i = 1;
int a = 6; // Why did we use a variable here?
// What happens if you replace ‘a‘ with ‘6‘ below?
// Try this with an IDE like Eclipse...
if ( (a < 9 ) || (++i < 8) ) i = i + 1;
// replace ‘a‘ with ‘6‘ have no difference.
// because if is combine with "||" and the (a<9) is true,the whole is true,
// so the (++i < 8 ) does not execute. right?
assertEquals(i, 2);
}
&& 和 || 是逻辑操作符,&和| 是位操作符。
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值
注意:自动装箱和拆箱是由编译器来完成的,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。
注意:自动装箱时,对于值从-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此方法。
3、Stream操作。
Java 8 中的Stream 是集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation) ,或者大批量的数据处理。Stream API借助同样新出现的Lambda表达式,极大的提高了编程效率和可读性。同时它提供串行和并行两张模式进行汇聚操作,并发模式能够充分利用多核处理的优势,使用fork/join并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错,但使用Stream API无需编写一行多线程代码,就可以很方便的写出高性能并发程序。个人认为其形式上跟Python非常相似。
Java koan学习总结。
标签:
原文地址:http://www.cnblogs.com/fengmanlou/p/4854216.html