1,static member

可使用该类对象的空引用来引用该类static member
SomeClass obj = null;
obj.staticMethod();
obj.staticData = 1;

用对象引用静态成员是不被推荐的,但为什么不像C#那样禁止掉呢?

2,多重继承

面对从多个接口继承而来的签名相同的方法,子类似乎只能提供一份实现,这样语义的正确性是如何保证的呢?C#可以在子类中为从多个接口继承而来的签名相同的方法各提供一份实现

3,局部类、匿名类、接口内部类

语言在设计方面提供的创新的语法设施,唯一的问题是不要滥用

4,混乱的数组

似乎违反了那句“装苹果的篮子不是装水果的篮子”,在需要基类数组的地方可以传递子类数组,丧失了编译期类型安全性,通过运行时异常来避免错误

5,求值顺序

明确规定了从左至右,善莫大焉

6,作用域

局部变量、参数能够屏蔽成员变量
局部变量不能与参数同名
更加局部的变量不能与外围局部变量同名
善莫大焉

7,逗号表达式

没有逗号表达式,for里面那个不算

8,break label

功能强大,代替flag,goto

9,异常

相对于返回错误代码来说,异常就是那个层次的AOP

10,异常声明与返回值的不同待遇

相同的是都不能做为overload的依据,不同的是override时,异常声明可以被放宽为子类,返回值却不能基于同样的理由放宽为子类,即协变

11,类锁与实例锁

互不相干

12,服务端同步与客户端同步

前者主要保护自己的内部数据,后者主要保证调用序列

13,main

Everything has a begin, has an end-------Matrix Revolution
我猜中了开头,却猜不到这结局----仙履奇缘

Java程序以main始,却未必以main终,直到最后一个user线程退出;?假若main启动了一个user线程,该线程又启动了一个,又启动了一个,则虽我之死,有子存焉;子又生孙,孙又生子;子又有子,子又有孙。子子孙孙,无穷匮也

先有鸡还是先有蛋?人的起源,生命的起源到底如何?或许有一天人们追溯到极点,却发现不过是JVM启动了main,世界毁灭时,不过是JVM崩溃了

扯远了,.Net的线程与此类似

14,J2SE 1.5的倒退

静态引入 Static Import
格式化的输出 Formatted Output
格式化的输入 Formatted Input
不定参数 Varargs

简直不敢相信,宁肯学C也不学C++

15,Proxy

当年C++中引入template,只是为了Generic Programming,却无意中发现了其Generative Programming的强大功能;不知道Java中的Proxy最初的意图是什么,却引起了Generative Programming另外一种形式--AOP的风潮

16,ClassLoader

在程序中开个后门,某个类的字节码从我的个人网站上下载,别被客户发现,以后想起来就改改,呵呵

17,语言、库、平台,模糊的边界

字符串连接操作符“+”,是语言的一部分还是库的一部分?
序列化/反序列化时那个可被虚拟机调用的私有的方法,是语言的一部分还是库的一部分?
SoftRefrence、WeakRefrence等被虚拟机用来处理对象引用这样的核心语言特性的类,是语言的一部分还是库的一部分?

Java不是平台无关的,它本身就是个平台;不是说它不好,只是和传统的语言有这样一些区别

18,@deprecated

比起XDoclet等工具,.Net的属性等特性,它更早的触动了Java的神经:注释居然影响了编译器的行为!总算发展出了带有标注的Java

19,override的不同理念

Java/C#:只要访问权限允许,就可以调用重写的方法,不管子类对象构造出来没有
C++:只要子类对象构造出来了,就可以调用重写的方法,不管访问权限

造成的后果就是:

Java/C#:在基类构造函数里调用方法,只要子类有权限覆写,就会调到子类的实现
C++:在基类构造函数/析构函数里调用的方法永远都是基类的实现,不会调到子类;在其它方法里面永远都是调到子类的覆写实现,不管是不是private

20,IO

字节是没语义的,因此叫Stream
字符是有语义的,因此叫Reader与Writer

需要将没语义的适配为有语义的,叫InputStreamReader,OutputStreamWriter
实用的,叫DataXXX,对象序列化的,叫ObjectXXX

21,java.io.File

放错了地方,实际是文件系统的抽象,跟IO没什么太大关系,应放到系统包里,跟Thread之类并列

22,Collections

一般的设计原则是子类重写方法的前置条件应弱于父类方法,但Collection及其子类适时的没有遵守这个原则,以此证明了任何原则都有适用范围; Collection的设计目的是尽可能通用,而不是运行时的多态,你仍然需要选择合适的具体的数据结构,尽管它有时只是通过Collection接口来引用

23,Iterator

不同于STL,Iterator提供了内部安全的Remove(),部分还提供了Add();但遍历终归是不安全的,又一次不同于STL,Iterator自己能感知外界变化,抛出异常来自我保护,而不是产生未定义行为

24,Timer(),Timer(true)

最常用的却不是最方便的,不得不记住参数;可以用两个创建方法,可以用两个子类,就算用参数,也应该用枚举代替布尔,噢,忘了1.5之前没有枚举,那就静态常量吧,new Timer(Timer.DEAMON)和new Timer(true),哪个更清晰?

25,脆弱的private

除了序列化/反序列化时访问权限被平台破坏,在缺省安全设置下,Class.newInstance()也能够构建ctor声明为private的类的实例,带来的效果就是,希望强迫客户代码使用IoC原则的开发者,可用放心的将bean的ctor声明为private了


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 51, comments - 17, trackbacks - 0, articles - 0

Copyright © 笨蛋啊帆