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 相关文章推荐
JavaScript 验证浏览器是否支持javascript的方法小结
May 17 Javascript
JavaScript 创建对象和构造类实现代码
Jul 30 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
Nov 30 Javascript
学习并汇集javascript匿名函数
Nov 25 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
Jan 15 Javascript
jQuery写的日历(包括日历的样式及功能)
Apr 23 Javascript
读取input:file的路径并显示本地图片的方法
Sep 23 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
Mar 24 Javascript
JavaScript获取表单enctype属性的方法
Apr 02 Javascript
详解堆的javascript实现方法
Nov 29 Javascript
Jquery cookie插件实现原理代码解析
Aug 04 jQuery
微信小程序实现下拉框功能
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遍历删除整个目录及文件的方法
2015/03/13 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
JS学习之一个简易的日历控件
2010/03/24 Javascript
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
python实现树形打印目录结构
2018/03/29 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
python3.7调试的实例方法
2020/07/21 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
C语言面试题
2015/10/30 面试题
人力资源管理专业学生自我评价
2013/11/20 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
员工开除通知书
2015/04/25 职场文书
田径运动会广播稿
2015/08/19 职场文书
公文写作:工伤事故分析报告怎么写?
2019/11/05 职场文书
Python if else条件语句形式详解
2022/03/24 Python
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android