java笔记 五
Java 不能隐式执行向下转型
double d = 1.1;//1.1 字面量属于 double 类型
// float f0 = 1.1;报错, Java 不能隐式执行向下转型,因为这会使得精度降低。
float f = 1.1f;//1.1f 字面量才是 float 类型。
short s1 = 1;
// s1 = s1 + 1;报错
s1 = (short) (s1 + 1);
s1 += 1;//+= 或者 ++ 运算符会执行隐式类型转换。相当于s1 = (short) (s1 + 1);
switch与String
Java 7 开始,可以在 switch 条件判断语句中使用 String 对象,内部实现在 switch 中使用字符串的 hash code。。switch 不支持 long、float、double。
- 不可变类:https://javabetter.cn/basic-extra-meal/immutable.html#_02%E3%80%81%E5%B8%B8%E8%A7%81%E7%9A%84%E4%B8%8D%E5%8F%AF%E5%8F%98%E7%B1%BB
final
- final 修饰的成员变量必须有一个默认值
- private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。
- final 和 static 一起修饰的成员变量叫做常量,常量名必须全部大写。
static
- 静态变量属于一个类,所以不要通过对象引用来访问,而应该直接通过类名来访问
- 如果 main 方法不是静态的,就意味着 Java 虚拟机在执行的时候需要先创建一个对象才能调用 main 方法,而 main 方法作为程序的入口,创建一个额外的对象显得非常多余。
静态代码块
优于main()函数执行。
静态内部类
外部类不能声明为 static。静态内部类仅可以访问外部类的所有静态变量,包括私有静态变量。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
代码执行顺序
静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。
存在继承的情况下,初始化顺序为:
- 父类(静态变量、静态语句块)
- 子类(静态变量、静态语句块)
- 父类(实例变量、普通语句块)
- 父类(构造函数)
- 子类(实例变量、普通语句块)
- 子类(构造函数)
Object 通用方法
tips:
- 任何不是 null 的对象 x 调用 x.equals(null) 结果都为 false
- equals()实现 1.2.3.4
- toString(),默认返回 ToStringExample@4554617c 这种形式,其中 @ 后面的数值为散列码的无符号十六进制表示。
- clone() 是 Object 的 protected 方法。一个类不显式去重写 clone(),其它类就不能直接去调用该类实例的 clone() 方法。
- Cloneable 接口规定,如果一个类没有实现 Cloneable 接口又调用了 clone() 方法,就会抛出 CloneNotSupportedException。
clone() 的替代方案:拷贝构造函数或者拷贝工厂。