菜鸟一只,若有不正之处,还请批评指正。
Static
- 被声明为static的类的成员变量、常量和方法称为静态成员。
- 静态成员同样遵循public、private和protected修饰符的约束。一个类的public static类成员可以由该类的任意对象访问,或者通过类名访问;一个类的private static类成员可以通过类方法访问(没有创建对象的类的private static的访问需要一个public static方法)
- 当一个类还没有实例化任何对象时,静态变量和静态方法已存在并可以使用。
- 静态成员可以通过如下方式调用:
类名.静态成员
当然也可以通过”对象.静态成员“的方式调用,但是不建议使用,因为这样容易混淆静态成员和非静态成员。
1.静态变量
- 静态变量只有一份副本由类的所有对象共享。
- 所以说静态变量可以节省内存空间。JVM只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。 对于非静态变量,每创建一个实例,就要为非静态变量分配一次内存。
区别 | 静态变量 | 非静态变量 |
---|---|---|
拥有者 | 类 | 对象 |
初始化时间 | 类初次加载时 | 实例化对象时 |
类的对象之间是否共享 | 是 | 否(互不影响) |
别名 | 类变量 | 实例变量 |
// 静态变量的特点同样适用于静态方法和静态代码块。
注意:static只能用于修饰成员变量,不能用于修饰局部变量,否则会报错(区别于c/c++)
2.静态方法
- 可以对象之间共享
- 可以在不创建对象的情况下就可以调用(静态方法不和对象绑定在一起)
注意:
1.在一个静态方法中只能访问静态成员。因为没有被static修饰的成员需要先创建对象才能访问,而静态方法在调用时可以不创建任何对象。
想到了啥?main()方法不就是被static修饰的。
2.静态方法中不可以使用this。因为static类变量和static类方法的存在不依赖于类的任何对象。
3.静态代码块
在程序中通常会使用静态代码块来对类的成员变量进行初始化。
如果在执行类时,希望先执行类的初始化动作,可以使用static定义一个静态区域。
public class demo1 {
static{
//...
}
public static void main(String[] args) {
//...
}
}
当这段代码执行时,首先执行static块中的程序,并且只会执行一次(类demo1被加载时)。
4.单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
-
单例类只能有一个实例。
-
单例类必须自己创建自己的唯一实例。
-
单例类必须给所有其他对象提供这一实例。
想了解的可以去下面链接看看
5.静态内部类
final
1.final类
-
定义为final的类不能被继承
-
如果将某个类设置为final形式,则类中的所有方法都被隐式的设置为final形式,成员变量可以是final或非final形式。
final class A{
}
2.final方法
-
final方法不能被重写
-
定义final的方法执行效率高于非final方法。
-
一个被定义为private的方法隐式的被指定为final类型,无需将一个private方法再定义为final。
-
final方法不能被重写,但private final方法却似乎可以被重写,实际上不是,是生成了一个新的方法,像下面这样
class A{
private final void print(){
}
}
class B extends A{
void print(){
}
}
3.final变量
-
final变量值不可改变
-
在声明时对final变量进行赋值,或者声明空白final,在构造方法中为空白final赋值
-
final修饰对象引用,可以为引用中的变量赋值,但不能将引用指向其他引用。
-
数组也可以看做一个对象来引用
-
一个既是static又是final的字段只占据一段不能改变的存储空间
-
定义全局变量通常使用public static final修饰
final int[] a = {1 , 2};
a[0] = 2; // 可以
a = new int[]{3, 3}; // 不可以