读《Java从入门到精通》——联想笔记

正式接触Java的第一本书——因为书本内容讲的很简单也很浅显,所以内容就不归纳了,这里拓展一些阅读时引发的联想。


目录

1、static用法

2、boolean存储空间大小

3、构造方法的魔改

4、类继承的本质

5、向上、向下转型深究

6、探索迭代器Iterator的秘密

 


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。
  • 图解:

读《Java从入门到精通》——联想笔记_第1张图片


6、探索迭代器Iterator的秘密

  • 迭代器:迭代器(Iterator)是一个对象,它的工作就是遍历并选择序列中的对象,它提供了一种访问容器(container)对象中的各个元素,而又不必暴露该对象内部细节的方法。
  • 优点:Iterator总是用同一种逻辑来遍历集合,使用时可以不用管底层数据具体是怎样存储的,并且其创建的代价很小,也便于代码的复用。
  • 参考:https://blog.csdn.net/q5706503/article/details/85230897
  • 拓展:为了更好的探究它指向哪儿以及更好的了解iterator遍历的过程,明确迭代器指向的是谁?以及next返回的是谁?它是先后移还是先返回值?previous又返回了谁?我特地翻出了源码,以ListIterator为例,来康康这中间我们的iterator经历了啥。
  • 截取了部分需要的java8代码段:
  • 读《Java从入门到精通》——联想笔记_第2张图片
  • 读《Java从入门到精通》——联想笔记_第3张图片
  • 图解:读《Java从入门到精通》——联想笔记_第4张图片
  • 结论:1、迭代器指向的位置就是cursor所在的位置。2、next返回的是cursor所指向的值,然后cursor移动+1。3、先保留值,再移动,再返回值。4、previous返回的是cursor-1所指向的值,先移动,后传值。

     

 

  

 

 

你可能感兴趣的:(java)