Thinking in Java 学习笔记 三

对于类的清理,首先在于按照一定次序销毁成员变量,但是对于有些类,创建了多个对象,有的变量在多个对象中被引用(无法销毁),清理工作变得复杂,需要计数器来记录创建的对象数目 。

 

构造器是隐性static,private是隐性final。记住这两点有助于理解许多问题。


一个两难的问题:构造器用于创建对象,需要在对象被创建时调用。对于多态 ,如类中的对象方法绑定,直到运行时才能确定(也只有这样,才能发挥多态的效力)。如果在构造器中调用多态方法,会有什么样的结果?构造执行之时,整个对象之时初始化一半,直接调用的结果可能使用了未初始化的变量,这将造成风险 。


简单来说,一个类、方法最终被编译为中间代码(可能是本机环境的汇编),然后编译为可以运行的执行代码,对于最后生成的代码而言毕竟是写死的了,所为多态的实现,运行时确定的概念又有什么意义?多态的概念应该只是对于一个类、一个方法而言的,对于整个项目,没有什么是不能确定的(随机忽视);对与类、方法而言,它自身确实不能确定传入的参数是原型还是向上转型的产物,此即多态。


初始化的顺序:
1) 在其他任何事物发生之前 ,将分配给对象的存储空间初始化成二进制的零 。
2) 调用基类的构造器。如有与子类同名的方法(覆盖),调用的为覆盖的方法。
3) 按照声明的顺序调用成员初始化方法 。
4) 调用子类的构造器。


由于基类中调用方法可能会产生不确定性(因为你也不知道什么时候自己会变成基类,你的public或protected方法被覆盖了~),最好在构造器中调用final(不可覆盖)或private(隐性final)的方法。这是为了避免未知的错误(在C++中的表现更为合理些)。


Java SE5之后的新特性:协变返回类型。之前强制返回类型、参数 、方法名都一致才能形成覆盖。新特性允许,覆盖方法的返回类型可以是子类(而非强制基类)


多态是继承灵活应用的表现,但是在设计之初考虑继承会加重设计负担 ,还有优先使用组合来解决问题。组合、继承的关系也是耦合的话,继承是强关系(编译时确定),组合要若上很多(在运行时仍然可以改变)


Java提供抽象方法的机制,abstract关键字,包含一个或多个抽象方法的类称为抽象类。(不限定编译报错),对于抽象类编译器限定无法创建对象。


一个接口 表示:所有实现了这个接口的类看起来都像这样。Java没有多重继承,但实现多个接口可以实现这个需要,相比C++,这样的优势在于,interface都是没有任何实现的类,这样就避免了多个基类中相同方法实现间的冲突。在组合类与接口的时候,类必须放在前面声明,后面才跟着接口。


放入接口中的任何域都是默认隐式static和final的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值