打字猴:1.70044114e+09
1700441140
1700441141 子类SimpleServer的构造函数接收int类型的参数:1000。
1700441142
1700441143 父类初始化常变量,也就是DEFAULT_PORT初始化,并设置为40000。
1700441144
1700441145 执行父类无参构造函数,也就是子类的有参构造中默认包含了super()方法。
1700441146
1700441147 父类无参构造函数执行到“int port=getPort()”方法,调用子类的getPort方法实现。
1700441148
1700441149 子类的getPort方法返回port值(注意,此时port变量还没有赋值,是0)或DEFAULT_PORT(此时已经是40000)了。
1700441150
1700441151 父类初始化完毕,开始初始化子类的实例变量,port赋值100。
1700441152
1700441153 执行子类构造函数,port被重新赋值为1000。
1700441154
1700441155 子类SimpleServer实例化结束,对象创建完毕。
1700441156
1700441157 终于清楚了,在类初始化时getPort方法返回的port值还没有赋值,port只是获得了默认初始值(int类的实例变量默认初始值是0),因此Server永远监听的是40000端口了(0端口是没有意义的)。这个问题的产生从浅处说是由类元素初始化顺序导致的,从深处说是因为构造函数太复杂而引起的。构造函数用作初始化变量,声明实例的上下文,这都是简单的实现,没有任何问题,但我们的例子却实现了一个复杂的逻辑,而这放在构造函数里就不合适了。
1700441158
1700441159 问题知道了,修改也很简单,把父类的无参构造函数中的所有实现都移动到一个叫做start的方法中,将SimpleServer类初始化完毕,再调用其start方法即可实现服务器的启动工作,简洁而又直观,这也是大部分JEE服务器的实现方式。
1700441160
1700441161 注意 构造函数简化,再简化,应该达到“一眼洞穿”的境界。
1700441162
1700441163
1700441164
1700441165
1700441166 编写高质量代码:改善Java程序的151个建议 [:1700438104]
1700441167 编写高质量代码:改善Java程序的151个建议 建议35:避免在构造函数中初始化其他类
1700441168
1700441169 构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码:
1700441170
1700441171 public class Client{
1700441172
1700441173 public static void main(String[]args){
1700441174
1700441175 Son s=new Son();
1700441176
1700441177 s.doSomething();
1700441178
1700441179 }
1700441180
1700441181 }
1700441182
1700441183 //父类
1700441184
1700441185 class Father{
1700441186
1700441187 Father(){
1700441188
1700441189 new Other();
[ 上一页 ]  [ :1.70044114e+09 ]  [ 下一页 ]