JAVA面试题 static关键字详解


Posted in Javascript onJuly 16, 2019

问题

面试官Q1:请说说static关键字,你在项目中是怎么使用的?

static 关键字可以用来修饰:属性、方法、内部类、代码块;

static 修饰的资源属于类级别,是全体对象实例共享的资源;

使用 static 修饰的属性,静态属性是在类的加载期间初始化的,使用类名.属性访问

案例说明

①修饰成员变量

package com.ant.param;
 public class StaticFieldDemo {
  public static void main(String[] args) {
   Foo f1 = new Foo();
   Foo f2 = new Foo();
   Foo f3 = new Foo();
   System.out.println(f1.id + " " + f2.id + " " + f3.id );
  }
 }
class Foo{
 int id;
}

运行结果如下:

0 0 0

上面的代码我们很熟悉,根据Foo构造出的每一个对象都是独立存在的,保存有自己独立的成员变量,相互不会影响,他们在内存中的示意如下:

JAVA面试题 static关键字详解

从上图中可以看出,f1、f2和f3三个变量引用的对象分别存储在内存中堆区域的不同地址中,所以他们之间相互不会干扰。对象的成员属性都在这了,由每个对象自己保存。f1.id、f2.id、f3.id相当于“每个人一个水杯”。

我们对上面的代码,做如下修改:

package com.ant.param;
 public class StaticFieldDemo {
  public static void main(String[] args) {
   Foo f1 = new Foo();
   Foo f2 = new Foo();
   Foo f3 = new Foo();
   System.out.println(f1.id + " " + f2.id + " " +
   f3.id + " " + Foo.i);
  }
}
class Foo{
 int id;
 static int i=0;
 public Foo(){
  id = i++;
 }
}
运行结果如下:
0 1 2 3

程序执行过程内存图如下所示:

第 1 步:加载类

JAVA面试题 static关键字详解

static修饰的变量在类加载期间初始化,且在方法区中分配,属于线程共享区,所有的对象实例共享一份数据。

第 2步:继续加载类

JAVA面试题 static关键字详解

第 3步:继续加载类

JAVA面试题 static关键字详解

最终加载结果如上述三个步骤

②修饰成员方法

static的另一个作用,就是修饰成员方法。相比于修饰成员属性,修饰成员方法对于数据的存储上面并没有多大的变化,因为我们从上面可以看出,方法本来就是存放在类的定义当中的(方法区)。static修饰成员方法最大的作用,就是可以使用"类名.方法名"的方式操作方法,避免了先要new出对象的繁琐和资源消耗,我们可能会经常在帮助类中看到它的使用:

package com.ant.param;
 
 public class StaticFieldDemo {
  private static void print(){
   System.out.println("hello");
  }
  public static void main(String[] args) {
   StaticFieldDemo.print();
  }
}

③修饰静态代码块

静态代码块是在类加载期间运行的代码块,由于类只加载一次,所以静态代码块只执行一次!静态代码块用途很常见,一般用来在类加载以后初始化一些静态资源时候使用。如:加载配置文件等

package com.ant.param;
 
 public class StaticBlockDemo {
  public static void main(String[] args) {
   Foo foo = new Foo();
  }
 }
 
 class Foo{
 //代码块,在创建对象的时候执行,使用很少,和构造器差不多
 {
  System.out.println("创建对象了!");
 }
 //静态代码块,在类加载期间执行,用于加载配置文件或者其他信息等
 static{
  System.out.println("类加载了!");
 }
 public Foo(){
  System.out.println("调用了构造器!");
 }
}

静态块用法:将多个类成员放在一起初始化,使得程序更加规整,对理解对象的初始化过程非常关键;

在我的印象中,这些问题一般初中级Java工程师会被问到,都是很常规的面试题,您会了吗?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 1.9.1源码分析系列(十五)之动画处理
Dec 03 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
Jan 27 Javascript
微信小程序 开发经验整理
Feb 15 Javascript
微信小程序左滑删除效果的实现代码
Feb 20 Javascript
详解webpack3如何正确引用并使用jQuery库
Aug 26 jQuery
vue.js实现的全选与全不选功能示例【基于elementui】
Dec 03 Javascript
深入了解JavaScript代码覆盖
Jun 13 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
Jun 18 Javascript
JavaScript实现随机点名器
Mar 25 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
Nov 06 Javascript
JavaScript实现瀑布流布局的3种方式
Dec 27 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
微信小程序实现下拉框功能
Jul 16 #Javascript
javascript中的this作用域详解
Jul 15 #Javascript
微信小程序页面上下滚动效果
Nov 18 #Javascript
node.js实现上传文件功能
Jul 15 #Javascript
js canvas实现5张图片合成一张图片
Jul 15 #Javascript
js使用文件流下载csv文件的实现方法
Jul 15 #Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
Jul 15 #Javascript
You might like
php防止sql注入简单分析
2015/03/18 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
2016/11/01 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
pycharm安装和首次使用教程
2018/08/27 Python
python中cPickle类使用方法详解
2018/08/27 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
python logging日志模块原理及操作解析
2019/10/12 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
Java servlet面试题
2012/03/04 面试题
《她是我的朋友》教学反思
2014/04/26 职场文书
群教班子对照检查材料
2014/08/26 职场文书
就业推荐表导师评语
2014/12/31 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
python 如何用map()函数创建多线程任务
2021/04/07 Python
深入探讨opencv图像矫正算法实战
2021/05/21 Python
nginx访问报403错误的几种情况详解
2022/07/23 Servers