Static静态
Static 静态
静态 ,对象层级变为了类层级,不用创建对象,直接通过类名.调用
1.静态属性
public class Student { static int a =1;//静态属性 int b =3; //成员属性 } public class Test2 { public void f(){ //静态属性属于类层级,类名.调用 int a = iterator1.a; //成员变量属于对象层级,创建对象调用 int b = new iterator1().b; } }
2.静态方法
静态方法:只能调用静态的属性和方法,不能使用this和super关键字
非静态方法:可以调用静态方法和非静态方法
public class Student { static int a =1;//静态属性 int b =3; //成员属性 //静态方法只能调用静态属性 public static void eat(){ System.out.println(a); // System.out.println(b); } //非静态方法可以调用静态属性/方法 和成员方法 public void run(){ //iterator1.eat(); System.out.println("run "+a); System.out.println("run "+b); } public static void main(String[] args) { new Student().run(); } } run 1 run 3
每创建一个对象实例,就会创建一份与之对应的成员属性,,每个对象的成员属性各自独立互不干扰,而静态的属性和方法是属于这个类的,在当前程序中只有一份,并且还没有对象创建时,它就存在了,所以它怎么访问的了后面创建出来的成员属性。
初始化顺序:静态属性/代码块> 成员属性/普通代码块> 构造器,父类优先于子类
3.静态内部类
能够在它的类的任何对象创建之前被访问,而不必引用任何对象。static 成员的最常见的例子是main( ) 方法。因为在程序开始执行时必须调用main() ,所以它被声明为static。
public class OuterClass { public static class InnerClass{ InnerClass(){ System.out.println("============= 我是一个内部类’InnerClass’ ============="); } } } public class TestStaticClass { public static void main(String[] args) { // 不需要new一个 InnerClass new OuterClass.InnerClass(); } }
补充
静态方法和非静态方法的区别
1.调用方法不同 静态方法可以直接调用,类名调用和对象调用。(类名.方法名 / 对象名.方法名) 但是非静态方法只能通过对象调用。(对象名.方法名)
2.生命周期不同 静态方法的生命周期跟相应的类一样长,静态方法和静态变量会随着类的定义而被分配和装载入内存中。一直 到线程结束,静态属性和方法才会被销毁。(也就是静态方法属于类) 非静态方法的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法才会被创建,而当 这个对象被销毁时,非静态方法也马上被销毁。(也就是非静态方法属于对象)
3.调用对象、引用变量不同
- 静态方法:静态方法和属性
- 非静态方法:静态方法和属性,成员变量和成员方法
类方法可以直接通过类名调用,实例方法必需先实例化类,再初始化对象,然后通过类的实例对象才能调用
static和final一块用表示什么
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
static属于类层级,不用创建对象,this和super指向的是对象
首先,static叫静态方法,也叫类方法,它先于任何的对象出现。在程序最开始启动(JVM初始化)的时候,就会为static方法分配一块内存空间,成为静态区,属于这个类。而非static方法,必须在类实例化的时候,才会给分配内存空间,在实例化对象的时候JVM在堆区分配一个具体的对象,this指针指向这个对象。也就是说,this指针是指向堆区中的类的对象,而static域不属于this指向的范围所在,所以不能调用。
同时,在static修饰的方法中,不能使用super(),道理其实与上面差不多。
super代表子类对父类满参构造函数的初始化,也是需要产生对象才可以使用但是考虑到虚拟机加载顺序为先加载类,当被实例化才产生对象。所以如果并存则表示类和对象同时加载,显然是不合逻辑的。