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中ajax方法data参数的用法小结
Feb 12 Javascript
一个JavaScript获取元素当前高度的实例
Oct 29 Javascript
node.js中的fs.createReadStream方法使用说明
Dec 17 Javascript
javascript中的Function.prototye.bind
Jun 25 Javascript
JavaScript中的call方法和apply方法使用对比
Aug 12 Javascript
JavaScript实现同一个页面打开多张图片
Dec 29 Javascript
vue.js事件处理器是什么
Mar 20 Javascript
Angular.JS中指令ng-if的注意事项小结
Jun 21 Javascript
js代码规范之Eslint安装与配置详解
Sep 08 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
Oct 10 jQuery
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 Javascript
js实现电灯开关效果
Jan 19 Javascript
微信小程序实现下拉框功能
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常用函数的用法详解
2013/05/10 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
JavaScript 基本概念
2015/01/20 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
Node.js实现数据推送
2016/04/14 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
解析Python中的二进制位运算符
2015/05/13 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
贷款委托书怎么写
2014/08/02 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
党员民主生活会材料
2014/12/15 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书