第3章 操作符
1 Random类
在使用Random类的时候,如果构造时传入相同数值,则后面的nextXXXX()得到的值每次都相同了。如果不传入数值,默认是系统的当前时间作为随机数生成器的种子。
但不管怎样,多次调用nextXXX(),还是会生成不一样的随机数。
2 一元加号 +
唯一的作用: 将 较小类型的操作数 提升为 int。
3 进制
大写、小写的L,代表long(使用小写l容易造成混淆,因为和数字1很像。)
大写、小写的F 代表float
大写、小写的D 达标double
前缀0x、0X带包十六进制,后面跟随0-9或大写、小写的a-f。
通过使用Integer、Long类的静态方法 toBinaryString()
输出二进制形式的结果。
4 指数计数法
e 代表10. 1.39 e-43 = 1.39 * 10 (-43次方)
5 按位操作符
异或 ^
非 ~
布尔类型,没有按位非 ~
运算。大概是为了避免与逻辑NOT 混淆。(逻辑只有 && || !
)
对于布尔类型,按位操作符 和 逻辑操作符 效果相同, 然而 没有 “短路”。
6 移位操作符,
只能操作整数。
<<
低位补0
>>
高位补符号位
>>>
高位补0
char、byte、short 在进行 移位处理时,会被自动转换成int。得到的结果也是int。
所以对它们进行<<= >>= >>>= 这种运算,可能得到-1.
第4章 控制执行流程
1 逗号操作符。
(注意,不是分割函数参数的逗号分隔符)
Java里唯一用到逗号操作符的地方就是for循环的控制表达式。在初始化,和步进控制部分(1,3部分)使用,判断部分不能用,只能是一个boolean的表达式。
2 switch
书中说只能是int
或者char
的整数值才能switch
,实测String
也可以。(java 7 引入)
Enum
也可以( Java 5) ,
注意,long不可以。!!!!
3 臭名昭著的goto
Java里没有goto,虽然它是保留字,有一个类似的机制continue
和break
,搭配标签。
标签式后面跟有冒号的标识符。
在Java中,标签起作用的唯一的地方刚好是在迭代语句之前。
在标签和迭代之间置入任何语句都不好。
使用标签的唯一理由:我们希望在嵌套循环迭代or开关。
4 continue
和 break
continue
和 break
本身只能中断最内层循环。
一般的continue会继续执行递增表达式,continue + 标签,不会执行递增表达式。
第5章 初始化与清理
1 类成员变量,定义时就被初始化 和 构造器中初始化 的区别
初始化块优先于构造方法被执行,如果初始化块执行中,构造方法被调用之前没有什么特殊的处理,只是单纯的成员变量赋值,那么效果是一样的。
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。
并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。
大家可以随意改变变量a、变量b以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。
静态代码块跟静态变量都是类加载时进行初始化的(同等条件下,初始化顺序由书写顺序决定)
非静态变量和非静态代码块是在类实例时进行初始化的(同等条件下,初始化顺序由书写顺序决定)
static final 修饰的变量,在类加载时已被初始化(一次),必须赋初始值。
final 修饰的变量,在每次创建新实例时被初始化(每次),必须赋初始值。
2 方法重载(涉及基本类型的重载)
基本类型能从一个较小的类型自动提升至较大的类型。因此当找不到最合适的方法,会自动向上转型到最接近的。byte-short-int-long-float-double
char略有不同,会把char自动提升至int-long-float-double。
如果传入较大的类型,则必须手动强转,否则编译报错。
3 this关键字
调用方法是“发送消息给对象”。编译器做了一些幕后工作,它暗自把“所操作对象的引用”作为第一个参数传递给方法。
所以a.peel(1);
-> Banana.peel(a,1);
这是内部的表示形式,我们写代码不能这么写。
通常this,表示 对当前对象的引用。
但是如果在构造器中,为this添加了参数列表,就表示调用其他构造器。
有三点注意事项:
-
只能用this调用一个构造器,不能调用2+个构造器。
-
必须将构造器调用 置于 最初始处(第一行)
-
除了构造器之外,编译器禁止在其他任何方法中调用构造器函数。
4 static
的含义
可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。
5 finalize()
不等同于“析构”。 不建议用。 如果通过java调用其他代码,例如C,C里通过malloc()函数获取的空间需要在finalize()里释放。
6 垃圾回收如何工作
Java虚拟机采用 自适应 垃圾回收技术。自适应的、分代的、停止-复制、标记-清扫 式 垃圾回收期。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
[外链图片转存中…(img-wG44EGqt-1713515461037)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!