- 使用了静态导入后,就可以省略类名来访问静态成员(成员变量、方法、嵌套类)
静态导入的经典使用场景:
import static java.lang.Math.PI;
public class Main {
public static void main(String[] args) {
System.out.println(2 * PI * 10);
System.out.println(2 * PI * 20);
}
}
正确使用静态导入,可以消除一些重复的类名,提高代码可读性;
过度使用静态导入,会让读者分不清静态成员是在哪个类中定义的;
建议:谨慎使用静态导入。
===========================================================================
编译器会自动为未初始化的成员变量设置初始值;
如何手动给实例变量提供初始值?
-
在声明中
-
在构造方法中
-
在初始化块中
编译器会将初始化块复制到每个构造方法的头部(每创建一个实例对象,就会执行一次初始化块)
如何手动给类变量提供初始值?
-
在声明中
-
在静态初始化块中
当一个类被初始化的时候执行静态初始化块;
当一个类第一次被主动使用时,JVM 会对类进行初始化;
public class Person {
static { // 静态初始化块
System.out.println("static block");
}
{ // 初始化块
System.out.println("block");
}
public Person() {}
public Person(int age) {}
public static void main(String[] args) {
new Person();
// static block
// block
new Person(20);
// block
}
}
一个更复杂的示例:
public class Person {
static {
System.out.println("Person static block");
}
{
System.out.println("Person block");
}
public Person() {
System.out.println("Person constructor");
}
public class Student extends Person {
static {
System.out.println("Student static block");
}
{
System.out.println("Student block");
}
public Student() {
System.out.println("Student constructor");
}
}
**执行顺序**:父类静态块 -> 子类静态块 -> 父类代码块 -> 父类构造器 -> 子类代码块 -> 子类构造器
public static void main(String[] args) {
new Student();
// Person static block
// Student static block
// Person block
// Person constructor
// Student block
// Student constructor
}
[](https://gitee.com/vip204888/java-p7)单例模式(Singleton Pattern)
==========================================================================================
如果一个类设计成单例模式,那么在程序运行过程中,这个类只能创建一个实例。
**饿汉式单例模式**:像饿汉一样,上来就直接创建了唯一的那个实例。(线程安全)
/*
- 饿汉式单例模式
*/
public class Rocket {
private static Rocket instance = new Rocket();
private Rocket(){}
public static Rocket getInstance() {
return instance;
}
}
**懒汉式单例模式**:像懒汉一样,只有用到的时候采取创建实例。(线程不安全)
/*
- 懒汉式单例模式
*/
public class Rocket {
private static Rocket instance = null;
private Rocket(){}
public static Rocket getInstance() {
if (instance == null) {
instance = new Rocket();
}
return instance;
}
}
[](https://gitee.com/vip204888/java-p7)final、常量(Constant)
=====================================================================================
被 `final` 修饰的类:**不能被子类化,不能被继承**
被 `final` 修饰的方法:**不能被重写**
被 `final` 修饰的变量:**只能进行1次赋值**
常量的写法:
* `public static final double PI = 3.14159265358979323846;`
* `private static final int NOT_FOUND =