美文网首页Java学习
java中的static关键字

java中的static关键字

作者: 唐T唐X | 来源:发表于2019-02-24 16:28 被阅读0次

又到了读代码了解java知识的时间了。今天我们来了解下java中的static关键字,来看看它的作用和一些相关原理。

package com.xingshulin;

public class StaticTest {

    private String a = "I am a! ";
    private static String b = "I am b! ";

    // 构造函数
    public StaticTest() {
        System.out.println("I am constructor!");
    }

    // static代码块
    static {
        System.out.println("I am static block 1!");
//        System.out.println(a);
    }

    public static void main(String args[]) {
        // 生成StaticTest类的对象
        StaticTest st = new StaticTest();

        // 打印变量a
        System.out.println(st.a);

        // 打印变量b
        System.out.println(StaticTest.b);
        System.out.println(b);

        // 运行静态方法
        staticMethod();
        StaticTest.staticMethod();

        // 运行非静态方法
        st.nonStaticMethod();
    }

    // 静态方法
    public static void staticMethod() {
        System.out.println("I am static method!");
        //System.out.println(a);
    }

    // 实例方法(非静态方法)
    public void nonStaticMethod() {
        System.out.println("I am non static method");
        System.out.println(a);
        System.out.println(b);
    }

    // static代码块
    static {
        System.out.println("I am static block 2!");
    }

    private static String c;

    // static代码块
    static {
        System.out.println("I am static block " + c + "!");

    }

}

运行结果如下:

I am static block 1!
I am static block 2!
I am static block null!
I am constructor!
I am a! 
I am b! 
I am b! 
I am static method!
I am static method!
I am non static method
I am a! 
I am b! 

这段代码很简单,但是也足够说明static关键字的作用了。从上面的例子中我们可以看到static的三种表现形式:static变量、static方法、static代码块

static变量

在代码中的变量b和c就是static变量,有人会问了,那变量a是什么?其实变量a叫实例变量。它们的区别是变量a是在创建对象后分配的;而static变量b和c不同,static变量被所有对象共享,在内存中只有一个副本,是在类加载的过程中分配到JVM的方法区中。static变量可用类名直接访问,如代码:


image.png

在这里我们多说一下变量c,我们是没有给它赋初值的,但是并没有造成编译出错,而且在打印的时候发现它的值被自动置为了null(因为是String类型)。这说明static变量不像局部变量那样需要赋初值才能编译,我认为主要的原因应该是static变量在方法区分配,而局部变量在栈中分配,方法区的内存可以动态变化,而栈的大小在线程运行前就需要是已知的,所以局部变量必须有初值(此处留坑,不一定理解的对)

static方法

和static变量类似,static方法也不需要创建对象就可以被所有对象调用,并可直接通过类名调用。


image.png

也正是由于这个特性,static方法中不能包含this等和对象有关的关键字,更不能包含实例变量和实例方法,否则编译会出现问题:


image.png

但是也如上图所示,实例方法中却可以包含实例变量和static变量,原因很简单,就不赘述了。

static代码块

static关键字还有一个比较关键的作用就是用来形成static代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
从上面的代码结果来看,的确是在类加载的时候就进行了static块的运行,因为所有的代码块打印都在构造函数之前。


运行结果

而且和static方法一样,static代码块中不能包含this等和对象有关的关键字,更不能包含实例变量和实例方法,否则编译会出现问题:


image.png

相关文章

  • 1.3 static 关键字

    static 关键字 《Java编程思想》 中:static方法就是没有this的方法 static 修饰的方法或...

  • java面试问题总结与分享,很乱

    java中static关键字的作用 在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员...

  • Kotlin学习2

    1.Kotlin中static在kotlin中 没有static关键字,但是有类似java中static的用法例如...

  • Java static关键字

    声明static属性 static是Java中定义的一个关键字,主要是描述全局的概念,所以利用static关键字可...

  • Java中的static和final

    java中的static和final 此篇文章是记录我在学习Java中static和final关键字的笔记。 st...

  • Java static关键字

    Java之美[从菜鸟到高手演变]之Java中static关键字

  • 复习Java基础资料

    Java中面向字符的输入流 Java中的static关键字解析 Java中的main()方法详解 Java中普通代...

  • Java Static 用法

    Java中的Static关键字用的很多,但是总结起来,大概有:Static member、Static Block...

  • Java:3分钟带你全面了解Static静态关键字

    前言 在Java中,静态 Static关键字使用十分常见 本文全面 & 详细解析静态 Static关键字,希望你们...

  • java基础知识面试题

    static关键字什么意思?java中是否可以覆盖一个private或者是static的方法? “static”表...

网友评论

    本文标题:java中的static关键字

    本文链接:https://www.haomeiwen.com/subject/kpmplqtx.html