一、静态变量
使用static关键字定义的变量
static可以修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象
二、 静态变量和非静态变量的区别
静态变量被所有的对象所共享,在内存中只有一个副本【存放在方法区】,它当且仅当在类初次加载时会被初始化【加final和不加final的static变量初始化的位置不一样】。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化
生命周期:
成员变量随着对象的创建而存在随着对象的回收而释放。
静态变量随着类的加载而存在随着类的消失而消失
三、静态方法
使用static关键字修饰的方法
静态方法不依赖于任何对象就可以进行访问,属于是类方法,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。所以this和super关键字都不能使用,正是由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
静态方法只能继承,不能重写(静态方法属于类,所以不再是普通函数,拥有类的特性,可以理解他就是一个类)
package com.test.innerclass;
public class Test {
Person person = new Person("Test");
static {
System.out.println("test static");
}
public Test() {
System.out.println("test constructor");
}
public static void printClass(){
System.out.println("Test printClass");
}
public void output(){
System.out.println("Test output");
}
public static void main(String[] args) {
Test myClass = new MyClass();
System.out.println("------------------------------");
myClass.printClass();
myClass.output();
}
}
package com.test.innerclass;
class MyClass extends Test {
Person person = new Person("MyClass");
static {
System.out.println("myclass static");
}
public MyClass() {
System.out.println("myclass constructor");
}
public void output(){
System.out.println("MyClass output");
}
public static void printClass(){
System.out.println("MyClass printClass");
}
}
四、静态代码块
使用static关键字修饰的代码块,也可以理解为没有函数名称的静态方法
静态代码块可以用来优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
初始化的顺序 静态代码块 > 构造代码块 > 构造函数
输出结果:
五、使用场景
1、对象间共享值时
2、方便访问变量时
六、static和final
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问
注意:
对于被static和final修饰过的实例常量,实例本身不能再改变了,但对于一些容器类型(比如,ArrayList、HashMap)的实例变量,不可以改变容器变量本身,但可以修改容器中存放的对象
package com.test.innerclass;
import java.util.ArrayList;
public class Test {
//static final容器类型
private static final ArrayList<String> list = new ArrayList<String>();
//static 变量
private static String aa =null;
//final 变量
private final String bb = null;
//static final类型初始化必须赋值
private static final int cc = 0;
Person person = new Person("Test");
static {
System.out.println("test static");
}
public Test() {
System.out.println("test constructor");
}
public static void printClass(){
System.out.println("Test printClass");
}
public void output(){
System.out.println("Test output");
}
public static void main(String[] args) {
Test myClass = new MyClass();
System.out.println("------------------------------");
myClass.printClass();
myClass.output();
System.out.println("------------------------------");
aa = "aaaaaa";
// bb = "bbbbbb"; //错误,final表示终态,不可以改变变量本身
// cc = "cccccc"; //错误,final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改
list.add("t1"); //正确,容器变量本身没有变化,但存放内容发生了变化。这个规则是非常常用的,有很多用途
list.add("t2");
}
}
收功完毕,如果你觉得对你有帮助,朋友点个赞呗!