`
kofsky
  • 浏览: 196736 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Java details

阅读更多

 本来不准备看JAVA的,不过,看到简历许多部分都涉及到了J,为了不至于阴沟里翻船,还是瞄他一瞄。与C++对比着看。主要参考<C++与Java对比编程>。Thinking in Java就不看了,太长太裹脚。
1.Java方法覆盖(override)限制
 a。子类覆盖方法的返回值类型必须与基类方法的返回值一致。比如像基类方法定义为public float fun();,子类方法定义为public double fun(),编译器将不会接受这样的代码。如果返回类型是引用类型,则覆盖方法的返回类型可以声明为基类方法声明的返回类型的子类型;如果返回类型是基本类型,则覆盖方法的返回类型必须和超类方法的返回类型相同。C++里也是这样。
 b。覆盖方法的访问限制不能比基类被覆盖方法的访问限制更严格。比如说,基类访问限制为protected,子类可以为public或者protected,但不能为private。和C++不同的是,JAVA中类的私有方法是不能被覆盖的,也就是说,被private修饰的方法不具备多态行为。在C++中,基类虚拟函数的访问控制对子类的覆盖定义没有任何影响。
 c。子类中一个覆盖的异常说明必须是基类中被覆盖函数的异常说明的一个子集。 比如如下的例子:
class E1 extends Exception{}
class E2 extends Exception{}
class A
{
 public void fun() throws E1{}
}
class B extends A
{
 public void fun() throws E2{}
}
编译器给出错误提示: Exception E2 is not compatible with throws clause in A.fun()
C++对覆盖函数的异常说明也有类似的限制。另外需要注意的是,子类不抛出任何异常是可行的。因为空集是任何集合的子集。

2.Java容器类
比较之一:ArrayList, LinkedList, & Vector
ArrayList的内部实现是基于内部数组Object[],所以它更象一个数组,但LinkedList的内部实现是基于一组链接的记录,所以,它更象一个链表结构。这就像C++中Vector与List的区别。当需要较多的随机访问,并且在尾部进行数

据添加于删除时,用ArrayList更佳,当你需要更多的是在链表中间插入删除数据时,用LinkedList更好。Vector非常类似ArrayList,但是Vector是同步的。
PS:Stack继承自Vector

比较之二:Hashtable & HashMap
Hashtable的方法是同步的,而HashMap的不是,并且允许null

类层次关系:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap


Java容器算法在类Collections中。Collections与Collection不同。前者是一个实现算法的类,后者是一个定义了集合的接口。

3.Java I/O
相对C++而言,JAVA的IO操作对象数量有点多。包括字节流,字符流,管道流,对象流,而且,java为每种情况单独提供一个类来进行处理。C++流在缺省情况是进行缓冲的,而Java则不是。但是Java可以通过构造缓冲数据流来处理。另外,Java所有的整形和浮点数都是以大端字节序进行输出的,与底层平台无关,因此可移植性更好。相对c++,Java还提供了对象流,可以直接对序列化的对象进行读写;这种对象流可以在网络中传输。
Java IO流大量采用了Decorator模式,典型的构造一个流的过程如下:
DataOutputStream os = new DataOutputStream( new BufferedOutputStream( new FileOutputStream("out.txt")));
在不同的类层次依次实现不同的功能。
按输入输出的格式可以分为两个基本的类型:
字节流:基类为Outputstream和Inputstream,其子类全部为字节流
字符流:基类为Writer和Reader,其子类全部为字符流
其他的常见的文件IO,管道IO,数组IO都可以继承自以上四个类的任意一个。比如文件流:分别继承上述四个类的子类为FileOutputstream,FileInputStream,FileWrite,FileReader。字节流对应数组为ByteArrayOutputStream和ByteArrayInputStream,字符数组对应的是CharArrayWrite和CharArrayWriter。另外,比较特殊的是对象流,对象流只能继承自字节流,因为其是按字节进行操作的。另外这个四个基本类型都有提供缓冲功能的子类型。


4.在Java中,多个构造函数可以通过this(variable list)互相调用。而C++不行。

5.Java数组是一个对象。这个与C++有非常大的不同。Java数组是类类型,也就是说,可以关联相关的数据成员。比如说,可以通过 array.length 来获得数组的长度。另外,Java数组成员访问是是进行下标检查的,越界将抛出IndexOutOfBoundsException异常。

6.Java里面实现Thread非常的简单。继承Thread类或者实现Runnable接口即。对函数同步也非常简单,加一个synchronized修饰即可。Thread类提供了一些列简单的函数来操作线程,start,stop,resume,sleep等之类。但是在实际中用这些还是感觉会有点点莫名其妙,因为会时不时的抛出一些InterruptedException,也许当时水平还不够的~~只是会用,而不清楚内部机制~~不知道现在再写这些,会如何?

7.Java网络通讯功能非常强大。基本上对本地文件进行IO的数据都可以进行网络IO,这其中包括序列化的对象。只要让对象实现Serializable并提供一个序列号,就能在网络上进行传输。网络通讯中常常会用到多线程技术,两者结合功能强大得让你惊讶的同时也会出现许多莫名其妙的问题~~

8.Java类库设计用到了大量的设计模式。IO流用到了decorator;Adapter在swing包中大量采用,比如WindowAdapter,KeyAdapter等;Cloneable是Prototype思想体现;抽象类本身就是Template;Java库中提供了Observer类来实现Observer模式,Java的Collection的子类中对象的遍历都是Iterator模式~~等等~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics