static 关键字详细介绍

Static

  • 概念

static是Java中的一个关键字,单词本身是静态的含义。一个类的成员包括变量、方法、构造方法、代码块和内部类,static可以修饰除了构造方法以外的所有成员

使用static修饰的成员成为静态成员,是属于某个类的,也就是说可以直接用类名调用(比如MATH.PI);而不使用static修饰的成员成为实例成员,是属于类的每个对象的。  

  • static常量

静态变量使用较为多,典型的例子就是 Math.PI;通常用final修饰,不允许在此更改此值;

  • static变量

在类中,用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点:

  1. 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。
  2. 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!
  3. 一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化)访问静态成员。)
  4. 在static方法中不可直接访问非static的成员。

总结:static变量和非static变量的区别:

  1. 份数不同:静态变量:1份;非静态变量:1个对象一份
  2. 存储位置不同:静态变量:方法区;非静态变量:堆中
  3. 内存分配空间的时间不同:静态变量:第一次加载类的时候;非静态变量:创建对象的时候
  4. 生命周期不同。静态变量和类的生命周期相同;非静态变量的生命周期和所属对象相同
  5. 调用方式不同  : 静态变量:  通过类名调用  Student.classRoom ,也可以通过对象名调用stu1.classRoom ="301" 但不推荐;非静态变量:通过对象名调用 stu1.name ="小张";           

      那什么时候对类中的变量用static修饰?

      在某个类中,如果这个变量不属于任何一个对象,那就把它设为静态变量,例子如下:

Class Employee{
   private static int nextId=1;
   private int id;
   .....

   public void setId(){
    id=nextId;
    nextId++;
   }
}

     每一个员工对象都有一个自己的id字段,但这个类的所有实例共享一个nextId字段,换句话说,如果有1000个Employee,则有1000个实例字段id,分别对应每个对象。但是只有一个静态字段nextId,即使没有Employee对象,静态字段nextId也存在,它属于类,而不属于任何一个对象;

setId()方法:假定harry设置员工标志码,harry.setId();harry的id字段被设置为静态字段nextId当前的值,并且静态字段nextId的值加1,便于下一个对象标志码的设置;

  • static方法

  1. static方法的作用 : 访问static变量和static方法
  2. static方法的调用方式  :通过类名调用  Student.showClassRoom() ,推荐该方式; 通过对象名访问  stu1.showClassRoom();
  3. 不可以

              静态方法中不可以访问非静态变量

              静态方法中不可以访问非静态方法

              静态方法中不可以访问this

              理解:加载类的时候就加载静态变量和静态方法,此时可能还没有创建对象,所以非静态变量和非静态的方法还没有分配空间,无法访问

     4.可以

              非静态方法中可以访问静态变量

              非静态方法中可以访问静态方法

              理解:加载类的时候就已经加载静态变量和静态方法,创建对象后,非静态变量和非静态的方法才分配空间,此时静态变量和静态方法已经存在,可以访问

    那什么时候使用静态方法?

     方法不需要访问对象的状态,,因为它需要的参数都是通过显示参数提供(列如:Math.pow())。

     方法只需要访问类的静态字段

public static int getnextId(){
  return nextId;
}

int n=Employee.getNextTd();
  • static代码块 

  1. 位置:类中
  2. 数量:多个
  3. 执行顺序:依次执行
  4. 执行时间:第一次加载类的时候执行,只执行一次
  5. 作用:给静态变量赋初始值。实际开发中使用比较多,一般用于执行一些全局性的初始化操作,比如创建工厂、加载数据库初始信息

用飞机大战的爆炸类例子解释:当飞机与殒石相撞时,就会显示爆炸的动画(其实就是16张图片的轮播),因为爆炸都是一样的,我们不希望每一次爆炸都创建一个对象,所以将爆炸类的图片加载成静态的,并且不涉及方法的概念,因此用代码块比较适合,diamagnetic如下

package cn.sxt.game;
 
import java.awt.Graphics;
import java.awt.Image;
 
/*
 * 爆炸类
 */
public class Explode {
    double x,y;
    static Image[] imgs = new Image[16];
    static {                        //爆炸类的动画加载
        for(int i=0;i<16;i++){
            imgs[i] = GameUtil.getImage("images/explode/e"+(i+1)+".gif");
            imgs[i].getWidth(null);
            
        }
    }
     
    static int count;
     
    public  void draw(Graphics g){
        if(count<=15){
            g.drawImage(imgs[count], (int)x, (int)y, null);
            count++;
        }
    }
     
    public Explode(double x,double y){
        this.x = x;
        this.y = y;
    }
}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页