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 相关文章推荐
用js查找法实现当前栏目的高亮显示的代码
Nov 24 Javascript
Javascript 类型转换方法
Oct 24 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
Aug 15 Javascript
javascript校验价格合法性实例(必须输入2位小数)
May 05 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
Apr 06 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
Jul 02 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
Aug 15 Javascript
jQuery使用deferreds串行多个ajax请求
Aug 22 Javascript
获取url中用&隔开的参数实例(分享)
May 28 Javascript
从源码里了解vue中的nextTick的使用
Nov 22 Javascript
angular 服务随记小结
May 06 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
May 14 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
JAVA/JSP学习系列之二
2006/10/09 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
JS查看对象功能代码
2008/04/25 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
js倒计时小程序
2013/11/05 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
python实现推箱子游戏
2020/03/25 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
python3中布局背景颜色代码分析
2020/12/01 Python
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
员工自我鉴定范文
2013/10/06 职场文书
军训心得体会
2013/12/31 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
先进工作者推荐材料
2014/12/23 职场文书
遗失证明范文
2015/06/19 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技