1 类的成员变量若是基本数据类型,即使没有初始化,Java也会确保它获得一个默认值。
(char:’\u000000’(null) boolean: false其他都是0,)
只有当变量作为类的成员变量使用时,Java才会确保给定其默认值。
上述原则不适用于 “局部”变量(即并非某个类的字段)。
因此,如果在某个方法中定义有int x; 这个想得到的可能是任意值(和CC++中一样),如果不赋初始值,java编译器会报错。
我的理解:堆区的会被自动默认值,栈区的不会。因为数组里的元素也是会赋予默认值。
2 方法名和参数列表(合起来成为“方法签名”)唯一标识出某个方法。
(注:和返回值无关)
第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
的含义
最后
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
这些面试题相对应的技术点:
- JVM
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
图片转存中…(img-0XDNfDWu-1718868643078)]
[外链图片转存中…(img-VQnzV4i9-1718868643079)]
[外链图片转存中…(img-Zzd1rbkY-1718868643079)]
[外链图片转存中…(img-1Xdm9ZmH-1718868643080)]
[外链图片转存中…(img-l71q1pca-1718868643080)]
[外链图片转存中…(img-ypFurKl0-1718868643081)]
[外链图片转存中…(img-y7C1W3ja-1718868643081)]