正式接触Java的第一本书——因为书本内容讲的很简单也很浅显,所以内容就不归纳了,这里拓展一些阅读时引发的联想。
目录
1、static用法
- static作用:使得变量、方法、类、代码块在不创建对象时也能调用,既其是这个类的一部分。
- static原理:static修饰的东西存储在JVM内存中的方法区/静态区当中。
- 参考:https://baijiahao.baidu.com/s?id=1636927461989417537&wfr=spider&for=pc
- 拓展1:静态函数为什么不能引用非静态成员变量?
- 结论:由于静态成员函数不传入实例化对象本身【随着类而加载】,既没有传入对象的this引用,因此会出错。
- 参考:https://blog.csdn.net/kunlcw/article/details/82971292?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- 拓展2:成员内部类为啥不能定义static修饰的变量?
- 结论:因为,static修饰的属性和方法在类加载的时候就会存在于内存【方法区】中,而非static的內部类需要实例化之后存入内存中【堆】才能使用,因此两者存在于内存的时间存在冲突。
- 参考:https://blog.csdn.net/qq_41694349/article/details/79376819?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
2、boolean存储空间大小
- 参考1:https://blog.csdn.net/qq_35181209/article/details/77016508?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- 参考2:https://blog.csdn.net/amoscn/article/details/97377833
- 结论:单独的boolean编译后用int代替占4个字节,数组则编译成byte数组各占1个字节。
3、构造方法的魔改
- 原本的构造方法没有返回值,加上返回值就能变身为具有与类名同名的普通成员函数。
- 无法加上static,构造方法是在创建对象的时候调用,而不是与类共存。
- 单态设计模式需要用到private构造方法,其只能在类内部使用,既只能在类内用该构造方法实例化对象。
4、类继承的本质
- 继承本质上只是在子类的构造函数中调用了父类的默认构造函数(super),如果构造函数带参则子类需要手动调用,其中父类中的public属性或方法在实例化时只会创建一次,并使得this与super均指向其地址,除非子类中再创建了一个(覆写),此时this与super指向就不同了。而父类中的private与子类(this)无关仅仅与super有关并且在子类中还不能调用。子类创建的对象针对的都是this。
5、向上、向下转型深究
- 向上转型(子->父):属于自动转换,只会丢失精度(不能使用子类特有的属性或方法),但是可以通过向下转型恢复。
- 向下转型(父->子):属于强制转换,有失败的风险(可以使用instanceof来避免出错),只有先向上转型过的对象才能向下转型。
- 转型要求:在引用数据类型中,只有有继承关系的类型才能进行类型转换。
- 转换的本质:类型转换只是转换指向对象的引用的类型,对象本身没有也不可能参与转换,对象内存一直在。
- 转型的好处:自动转换可以节省代码:https://www.cnblogs.com/buptldf/p/4959480.html。
- 图解:
6、探索迭代器Iterator的秘密
- 迭代器:迭代器(Iterator)是一个对象,它的工作就是遍历并选择序列中的对象,它提供了一种访问容器(container)对象中的各个元素,而又不必暴露该对象内部细节的方法。
- 优点:Iterator总是用同一种逻辑来遍历集合,使用时可以不用管底层数据具体是怎样存储的,并且其创建的代价很小,也便于代码的复用。
- 参考:https://blog.csdn.net/q5706503/article/details/85230897
- 拓展:为了更好的探究它指向哪儿以及更好的了解iterator遍历的过程,明确迭代器指向的是谁?以及next返回的是谁?它是先后移还是先返回值?而previous又返回了谁?我特地翻出了源码,以ListIterator为例,来康康这中间我们的iterator经历了啥。
- 截取了部分需要的java8代码段:
- 图解:
- 结论:1、迭代器指向的位置就是cursor所在的位置。2、next返回的是cursor所指向的值,然后cursor移动+1。3、先保留值,再移动,再返回值。4、previous返回的是cursor-1所指向的值,先移动,后传值。