static表示 “静态的” ,它也是一种修饰符,可以修饰属性、方法、代码块和内部类。
static修饰符具有如下特性:
- 被static修饰的属性(成员变量)称为静态变量,也叫做类变量;
- 被static修饰的常量称为静态常量;
- 被static修饰的方法称为静态方法,也叫做类方法;
- 被static修饰的代码块叫做静态代码块;
- 被static修饰符的内部类,叫做静态内部类。
静态变量、静态方法、静态常量统称为类的静态成员,归整个类所有,不属于某个单一的对象,所以,静态成员不需要通过对象来进行访问,而是直接通过类来访问。我们调用静态成员的语法格式如下:类名.静态成员
类变量应用场景
在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住。
规律
对于成员变量,要通过 “对象.变量名” 的形式调用;
成员变量属于某个对象,属于对象自己的“私有财产”,不能被整个类共享,对象之间不能共享这些成员变量;
静态变量和静态常量属于整个类 ,可以被类的所有对象共享,属于公共财产 ;
在同一个类中,我们可以在静态方法中 直接调用静态成员,也可以通过 “类名.静态成员”,或 “对象.静态成员” 的方式进行调用;
虽然语法支持通过“对象.静态变量”或“对象.静态常量”的方式进行调用,但不建议这样做;
对于静态成员,一般都是要通过 ”类名.静态成员” 的方式调用,否则在编译时会有“静态属性应该通过静态方式来访问”的提示;
被static修饰的方法叫做类方法,也叫做静态方法。
类方法最常见的应用场景是做工具类,工具类中的方法都是一些类方法, 每个方法都是用来完成一个功能的, 工具类是给开发人员共同使用的。使用类方法来设计工具类提高了代码复用;调用方便,提高了开发效率。工具类没有创建对象的需求,建议将工具类的构造器进行私有。
静态方法具有以下特性:
对于静态方法,我们可以通过如下格式调用:类名.方法名
由static修饰的代码块称为静态代码块,每个类中可以有多个静态代码块,每个静态代码块都只会在类加载时执行一次。对那些只需要进行一次操作的初始化代码,就可以放在静态代码块中执行
- 静态代码块类似于是一个方法,但它不可以在方法中调用,也不能存在于任何方法体中;
- 静态代码块可以写在类中的任何地方,一个类中也可以有多个静态代码块;
- 静态代码块在类加载时执行;
- 静态代码块优先于动态代码块执行;
- 如果类中包含多个静态代码块,则JVM虚拟机会按它们在类中出现的先后顺序依次执行,每个静态代码块只会被执行一次;
- 静态代码块与静态方法一样,不能直接访问类的实例变量和实例方法,需要通过类的实例对象来访问。
静态代码块,在类被加载时就会自动调用,且只会被调用一次。
非静态代码块,在对象被创建时自动调用,每次创建对象时都会执行。
而构造方法,每创建一个对象就会执行一次。
(代码块一般用于初始化)
确保一个类只有一个对象
饿汉式单例(拿对象时,对象已经创建好了)写法:
1.把类的构造器私有
2.定义一个类变量记住类的一个对象
3.定义一个类方法,返回对象
public class A{
//定义一个类变量记住类的一个对象
private static A a = new A();
//私有构造器
private A(){
}
//定义一个类方法返回对象
public static A getObject(){
return a;
}
}
懒汉式单例(拿对象时,才开始创建对象)写法:
1.把类的构造器私有
2.定义一个类变量用于存储对象
3.提供一个类方法,保证返回的是同一个对象
pubic class B(){
//定义一个类变量用于存储这个类的一个对象
private static B b;
//把类的构造器私有
private B(){
}
//定义一个类方法,这个方法要保证第一次调用时才创建一个对象,后面调用时都会返回这同一个对象
public static B getInstance(){
if(b == null){
b = new B();
}
return b;
}
}
protected修饰的方法是在子类里面可以访问,不是子类的对象可以访问(外部创建的对象)
我们可以在一个类的内部定义另一个类,也就是A类里面可以嵌套一个B类,这个内部的B类就叫做内部类。而内部类根据是否带有static关键词,可以分为静态内部类和非静态内部类。
特点:
final表示 “最终的、不可改变的、完结的”
final关键字,可以修饰方法,类,变量
在使用final声明变量时,一般会要求变量名的单词全部大写,且变量名由多个单词组成时,多个单词之间用下划线“_”分隔开,比如“SCHOOL_NAME”。
被final修饰的方法称为常量方法,该方法可以被重载,也可以被子类继承,但却不能被重写。
基本数据类型变量:数据值不可改变
引用数据类型变量:地址值不可改变**(但这个对象本身的成员和数据是完全可以发生改变的。)**
**定义:**使用了static final修饰的成员变量就被称为常量;使用了静态最终修饰的成员变量就被称为常量;
**作用:**通常用于记录系统的配置信息。作用:通常用于记录系统的配置信息.
●代码可读性更好,可维护性也更好。代码可读性更好,可维护性也更好.
●程序编译后,常量会被“宏替换" :出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是-样的.
饰的成员变量就被称为常量;
**作用:**通常用于记录系统的配置信息。作用:通常用于记录系统的配置信息.
●代码可读性更好,可维护性也更好。代码可读性更好,可维护性也更好.
●程序编译后,常量会被“宏替换" :出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是-样的.