Java中static关键字的详解

exceptionblog 2017-11-21 原文

Java中static关键字的详解

static关键字可以修饰方法和成员变量(不可以修饰局部变量,但是可以修饰内部类)。

 

static关键字方便在没有创建对象的情况下来进行调用(方法/变量)。

很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能

 

1.static 修饰成员变量:

static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存(方法区)中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象(构造方法中)的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。想了解java中类的加载过程可以读下一篇博客。里面有详细介绍

 

2.static修饰方法(例如构造方法)

static方法一般称为静态方法。它不依附于一个具体对象,而可以通过类名进行调用。因此。静态方法中不能访问非静态方法或者非静态成员变量(因为静态方法不依赖对象,而非静态部分需要依赖于对象)。而非静态方法中可以区访问静态的成员变量和静态方法。

 

3.static代码块:static关键字可以形成静态代码块。在一个类的加载过程中执行且只会执行一次(因为类只会加载一次)。静态代码块中一般包含着该类要使用的静态资源(例如图片,音频,视频等等)。因此,很多时候会把只需要初始化一次的操作都放在static代码块中。

static可以置于类中的任何地方,在类被初次加载的时候,会按照static块的顺序执行每一个static块。

 

面试题:这段代码的输出结果是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
复制代码

  类似地,我们还是来想一下这段代码的具体执行过程。首先加载Test类,因此会执行Test类中的static块。接着执行new MyClass(),而MyClass类还没有被加载,因此需要加载MyClass类。在加载MyClass类的时候,发现MyClass类继承自Test类,但是由于Test类已经被加载了,所以只需要加载MyClass类,那么就会执行MyClass类的中的static块。在加载完之后,就通过构造器来生成对象。而在生成对象的时候,必须先初始化该类的成员变量,因此会执行Test中的Person person = new Person(),而Person类还没有被加载过,因此会先加载Person类并执行Person类中的static块,接着执行父类的构造器,完成了父类的初始化,然后就来初始化自身了,因此会接着执行MyClass中的Person person = new Person(),最后执行MyClass的构造器。

发表于 2017-11-21 17:05 一个待业码农的救赎 阅读() 评论() 编辑 收藏

 

版权声明:本文为exceptionblog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/exceptionblog/p/7874152.html

Java中static关键字的详解的更多相关文章

  1. 硬件内存模型到 Java 内存模型,这些硬核知识你知多少?

    Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的, […]...

  2. JUC整理笔记二之聊聊volatile

    要想学好JUC,还得先了解 volatile 这个关键字。了解 volatile ,我们从一个例子开始吧。 本 […]...

  3. 我两年的坚持,值了!

    在腾讯两年,做好这一件事 大家好,我是鱼皮。 从实习至今,我已经在腾讯工作两年了。今天分享下我自从入职腾讯就一 […]...

  4. 五、Spring Web应用程序构建

    Spring MVC介绍,主要是对其中一些关键注解的理解和应用 内容 映射请求到Spring控制器 透明地绑定 […]...

  5. java List接口

    list接口 List接口: l 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中 […]...

  6. 第八届蓝桥-猜算式

    猜算式 你一定还记得小学学习过的乘法计算过程,比如: 273 x 15 —— 1365 […]...

  7. Effective Java 第三版——61. 基本类型优于装箱的基本类型

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java- […]...

  8. 2017自己读过的技术类书籍回顾

    2017自己读过的技术类书籍回顾 读完的书籍 过去的2017年我终于毕业走出学校了,大四一年求职过程也算是曲折 […]...

随机推荐

  1. Kindle支持的文件格式 – cutepig

    Kindle支持的文件格式 Kindle支持的文件格式 Kindle个人文档服务Kindle个人文档服务支持以 […]...

  2. 项目微管理23 – 会议

    高效会议那些事 对于开会,留在四代心中是截然相反的两种印象:一种是能帮助解决问题,而另外一种是浪费时间。   […]...

  3. 前端知识点回顾之重点篇——面向对象

    面向对象编程 面向对象的三大特征:继承,封装,多态 ES5的面向对象 ES5中用构造函数来模拟类的概念,可以根 […]...

  4. 《HiWind企业快速开发框架实战》(1)框架的工作原理

    本篇主要介绍HiWind的架构和开发者如何使用HiWind快速创建项目、完成功能授权。最后介绍HiWind的发 […]...

  5. Java 从入门到进阶之路(六)

    Java 从入门到进阶之路(六), Java 的对象和类。 之前的文章我们介绍了 Java 的数组,本章我们来 […]...

  6. SQLite操作数据库的步骤

    package com.example.dbdemo; import android.content.Cont […]...

  7. Java并发包源码学习系列:线程池ThreadPoolExecutor源码解析

    目录 ThreadPoolExecutor概述 线程池解决的优点 线程池处理流程 创建线程池 重要常量及字段 […]...

  8. HTB Hack The Box — Oopsiec

    HTB Hack The Box — Oopsie 信息收集 开放了22ssh,80端口,其中ss […]...

展开目录

目录导航