开发者社区> 数据小白张小东> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java-static关键字详解

简介: 从学习Java开始,学习static关键字相关已有多次,但还是未能明确区分static在不同地方的作用,以及被修饰的内容在JVM中内存的分配,还有程序执行时的加载过程。 所以在此从到到尾总结下Java中static的使用。
+关注继续查看

从学习Java开始,学习static关键字相关已有多次,但还是未能明确区分static在不同地方的作用,以及被修饰的内容在JVM中内存的分配,还有程序执行时的加载过程。
所以在此从到到尾总结下Java中static的使用。

包括以下内容:

修饰变量、方法

1. 使用

static修饰能够与变量、方法一起使用,表示“静态”的。

静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法。静态变量与实例变量不同,实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同。

public class Demo {
    static int i = 10;
    int j;
    Demo() {
        this.j = 20;
    }
    public static void main(String[] args) {
        System.out.println("类变量 i=" + Demo.i);
        Demo obj = new Demo();
        System.out.println("实例变量 j=" + obj.j);
    }
}

运行结果:

类变量 i=10
实例变量 j=20

2. static的内存分配

静态变量属于类,不属于任何独立的对象,所以无需创建类的实例就可以访问静态变量。之所以会产生这样的结果,是因为编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然有多个实例,但这些实例共享该内存。实例变量则不同,每创建一个对象,都会分配一次内存空间,不同变量的内存相互独立,互不影响,改变 a 对象的实例变量不会影响 b 对象。

public class Demo {
    static int i;
    int j;
    public static void main(String[] args) {
        Demo obj1 = new Demo();
        obj1.i = 10;
        obj1.j = 20;
       
        Demo obj2 = new Demo();
       
        System.out.println("obj1.i=" + obj1.i + ", obj1.j=" + obj1.j);
        System.out.println("obj2.i=" + obj2.i + ", obj2.j=" + obj2.j);
    }
}

静态变量虽然也可以通过对象来访问,但是不被提倡,编译器也会产生警告。

static静态代码块

static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。例如:

public class Test5 {    
    private static int a;    
    private int b;    
    
    static{    
        Test5.a=3;    
        System.out.println(a);    
        Test5 t=new Test5();    
        t.f();    
        t.b=1000;    
        System.out.println(t.b);    
    }    
    static{    
        Test5.a=4;    
        System.out.println(a);    
    }    
    public static void main(String[] args) {    
    // TODO 自动生成方法存根    
    }    
    static{    
        Test5.a=5;    
        System.out.println(a);    
    }    
    public void f(){    
        System.out.println("hhahhahah");    
    }    
}

运行结果:

3 
hhahhahah 
1000 
4 
5

利用静态代码块可以对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候可以直接调用而不用创建实例。

参考链接:

http://www.weixueyuan.net/view/6003.html
http://developer.51cto.com/art/201204/332155.htm

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
浅谈java中static关键字修饰的几种用法
浅谈java中static关键字修饰的几种用法
0 0
Java之static成员与代码块
本篇文章主要介绍JavaSE中一些不是很常见的知识点,但也会涉及,需要了解一下
0 0
Java面向对象进阶1——static修饰符
无static修饰的成员变量或者成员方法,称为实例变量,实例方法,实例变量和实例方法必须创建类的对象,然后通过对象来访问,且必须用对象来调用
0 0
Java基础:static的理解(含义、用法及静态修饰的优先顺序)
Java基础:static的理解(含义、用法及静态修饰的优先顺序)
0 0
Java基础关于含有和不含static的方法的访问
Java基础关于含有和不含static的方法的访问
0 0
浅谈一下:Java学习中不得不知道的:static (静态)成员
浅谈一下:Java学习中不得不知道的:static (静态)成员
0 0
Java面向对象(15)--static关键字静态理解与使用
Java面向对象(15)--static关键字静态理解与使用
0 0
+关注
数据小白张小东
开源技术专家
文章
问答
文章排行榜
最热
最新
相关电子书
更多
JAVA 应用排查全景图
立即下载
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载