我是靠谱客的博主 冷静发带,最近开发中收集的这篇文章主要介绍Java中staic关键字详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

static :静态修饰符

static表示“全局”或者“静态”的意思。

static 可以修饰:
    1、变量(所谓 class variable)
    2、方法(所谓 class method)
    3、代码块(所谓 block)
    4、内部类(所谓 nested class)

凡是被static修饰的这四种元素,都是属于类的,而不是类实例的

Java把内存分为栈内存和堆内存,其中栈内存用来存放一些基本类型的变量、数组和对象的引用,堆内存主要存放一些对象。在JVM加载一个类的时候,若该类存在static修饰的成员变量和成员方法,则会为这些成员变量和成员方法在固定的位置开辟一个固定大小的内存区域,这样JVM就可以非常方便的访问他们

1、static变量

    被static修饰的成员变量,叫做静态变量;没有被static修饰的变量,叫实例变量。

两者的区别是:

    对于静态变量在内存中只有一个拷贝,JVM只为静态变量分配一次内存,在加载类的过程中完成对静态变量的内存分配,可用类名直接访问(推荐),当然也可以通过对象来访问(不推荐)。

    对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。

所以一般在有以下需求的时候使用静态变量:

    (1)在对象之间共享值
    (2)为了方便的访问变量

2、static方法

    静态方法可以直接通过类名调用,而不需要创建类的对象。
    静态方法的内部不能调用实例变量和实例方法。
    静态方法独立于实例,因此静态方法必须被实现。
    静态方法不能使用this和super关键

问题:为什么Java的main方法是static的?答:为了使得在调用main方法之前不需要创建实例对象

3、static代码块

    静态代码块是在类中独立于类成员的static语句块,可以有多个,它不在任何方法体内,JVM在加载类时会执行这些静态的代码块。多个static代码块,JVM会按照出现顺序执行,每个代码块只执行一次。静态代码块可以用来优化性能,因为它只会在类加载的时候执行一次。

static块示例:

public class Test {
    Person person = new Person("Test");
    static{
        System.out.println("test static");
    }
     
    public Test() {
        System.out.println("test constructor");
    }
     
    public static void main(String[] args) {
        new MyClass();
    }
}
 
class Person{
    static{
        System.out.println("person static");
    }
    public Person(String str) {
        System.out.println("person "+str);
    }
}
 
 
class MyClass extends Test {
    Person person = new Person("MyClass");
    static{
        System.out.println("myclass static");
    }
     
    public MyClass() {
        System.out.println("myclass constructor");
    }
}

执行顺序:

test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor

下面来分析一下这段代码的执行顺序。首先在执行开始需要寻找到main方法,因为main方法是程序的入口方法。发现main方法在Test类中,所以会先去加载Test类,在加载Test类的过程中,会先去执行Test中的statsic块,然后执行 new MyClass(),发现MyClass没有被加载,所以先去加载MyClass,发现MyClass继承自Test,但是Test已经被加载了,所以只需要加载MyClass类,那么就会执行MyClass类中的static块,在加载完成之后,就通过构造器来生成对象,首先初始化父类的成员变量,因此会执行Person person = new Person(),而Person类还没有被加载过,所以先加载Person类并执行Person类中的static块,然后执行父类的构造器,完成父类的初始化,然后初始化自身,首先是成员变量即Person person = new Person(),然后是构造方法

4、static内部类

    被static修饰的类,并且处于某个类的内部
    它可以访问外部类的静态成员,包括private成员。

    它不能访问外部类的非静态成员

参考文献

1、http://www.cnblogs.com/dolphin0520/p/3799052.html

2、java编程思想

最后

以上就是冷静发带为你收集整理的Java中staic关键字详解的全部内容,希望文章能够帮你解决Java中staic关键字详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部