侧边栏壁纸
博主头像
三生石博主等级

梦想还是有的,就算做咸鱼,也要做最咸的。|

  • 累计撰写 39 篇文章
  • 累计创建 65 个标签
  • 累计收到 10 条评论

Java中的Static

三生石
2021-03-15 / 0 评论 / 0 点赞 / 129 阅读 / 1,711 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

static修饰符

static是静态修饰符,主要作用在于创建独立于具体对象的域变量或者方法。

static可以用来修饰

  • 成员变量 (静态变量,可以直接通过类名访问)
  • 成员方法(静态方法,可以直接通过类名访问)
  • 代码块(静态代码块,当Java虚拟机加载类时,就会执行该代码)

static代码块

jvm加载类时,加载静态代码块。

  • 如果有多个静态块,按顺序加载。
  • 每个静态代码块只会被执行一此。

代码

public class StaticTest {
    static int num = 10;
    static{
        num+=10;
        System.out.println(num);
    }
    static{
        num+=10;
        System.out.println(num);
    }

    public static void main(String[] args) {
        StaticTest s1 = new StaticTest();
        StaticTest s2 = new StaticTest();
        System.out.println(StaticTest.num);
    }
}

运行结果:

20
30
30

static变量

类的成员变量包括

类变量(静态变量)

  • 被static修饰的变量。
  • 在内存中只有一个拷贝。
  • 类内部,可在任何地方直接访问静态变量。
  • 其它类中,可以通过类名访问。

实例变量

  • 没有被static修饰的变量。
  • 每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。

static变量作用

  • 能被类的所有实例共享,可作为实例之间进行交流的共享数据
  • 如果类的所有实例都包含一个相同的常量属性,可把这个属性定义为静态常量类型,从而节省内存空间
public class StaticTest {
    static int num;
        public static void main(String[] args) {
        num++;
        StaticTest s1 = new StaticTest();
        s1.num++;
        StaticTest s2 = new StaticTest();
        s2.num++;
        StaticTest.num++;
        System.out.println(num);
    }
}

运行结果:

4

static方法

静态方法:可直接通过类名访问

  • 静态方法中不能使用this和super
  • 不能直接访问所属类的实例变量和实例方法
  • 可直接访问类的静态变量和方法

实例方法:通过实例访问

  • 可直接访问所属类的静态变量、静态方法、实例变量和实例方法

静态方法必须被实现

main()就是最常用的静态方法

常见错误

static变量不能创建在方法里面

/**
 * JVM加载类时,加载静态代码块
 * 类内部,可在任何方法内直接访问静态变量;
 * 如果有多个静态代码块,按顺序执行
 * 并且每个静态代码块只执行一次
 */
public class StaticText {
    // TODO 在运行中  static会比实例变量更先运行出来
    public StaticText(){
        System.out.println("构造方法执行.....");
    }
    static {
        System.out.println("静态代码块执行....");
    }
    // TODO 这三种有final 的会比上边static更先一步运行出来  因为final 单独已经存放在了内存地址里边,
    //    所以在没有创建类的情况下,有final 的已经存在于内存地址中
    public static final String JD = "jd";
    public String name = "admin";
    public static String atr1 = "atr1";

    public void method1(){
        System.out.println(name);
        System.out.println(atr1);
    }
    // TODO name 放到static中就会报错  因为static方法的速度快  在static起床时,实例变量还没有出生
    //  所以实例变量在这个static方法中不起作用.
    public static void method2(){
//        System.out.println(name);
//        System.out.println(atr1);
    }
0

评论区