Thinking in Java 学习笔记 二


编译器对于编译时数值(如随机产生)只有在第一次使用的时候才会进入初始化,即便对于static也一样,不同的是static声明了一份,在更多的实例对象创建的时候也不会再次初始化。


对于组合与继承的使用,可以的话,不要对继承滥用,优先用组合的方式。判断是否需要使用继承的一个很好的方法就是:是否需要使用向上转型(即子类作为父类参数调用)。


对于一个基类的清理 ,首先要注意的是其中的成员对象,一般清理的顺序与生成的顺序相反,然后调用类的dispose执行清理。——清理,垃圾回收,如果不能把握这些,就无法写出高质量的java代码。

对于final,仅支持基本类型,无论无何编译都确保在使用前初始化。Final也可以在声明时不初始化,这样的话就必须在类的定义域或者构造器中初始化。在参数传递中,final意味着在方法中无法修改参数引用的对象;final方法是为了方法锁定防止在子类中被修改,并且不会覆盖;final类,就是表明不希望、也确实不能继承的类(绝育,没有子类)。


对于java而言,一切都是对象(都是class),拥有自己的编译文件(.class文件),在程序运行时,只有当类第一次产生一个对象或者类中的static成员被调用,才会引发class文件的加载:类的代码初次使用时被加载。初次使用也是static初始化之时(唯一的例外是运行时才能知道确切值的那些)。


对于类的加载:如main方法,首先加载的是main所在的类,然后是其基类,知道加载到根基类为之(Object?),接着从根基类起初始化static成员,最后从根基类的构造器开始创建对象。


关于多态,多态的好处很明显,java中多态的实现是运行时方法与类的动态绑定。所以说对static、final的方法(private方法被隐形声明为final),无法实现动态绑定(在编译与类加载的时候,这些已经被写死,自然无法动态)。对于private的成员变量也是这样(private也无法多态了~~),private的变量如果子类再次声明一个,不会形成覆盖(毕竟对子类而言,它并没有继承到这些财产),而是两个类各自维护一个数据。


Java的多态的实现是伪多态:在子类被向上转型传递参数的时候,全部转化为万物之源——object类型存储,在取出来的时候需要加入强制类型转化再次固化。多态的实现关系被转化为简单的类与方法的绑定(这些绑定在运行时才能确定 )——最为疑惑的还是这里吧,对于C++而言,我也半懂其中的实现,没有把握到根本;对比java,好像更为麻烦点。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值