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嵌套函数及闭包
Nov 09 Javascript
原生javascript获取元素样式属性值的方法
Dec 25 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
Dec 21 Javascript
js实现的常用的左侧导航效果
Oct 17 Javascript
js使用eval解析json实例与注意事项分享
Jan 18 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
Jan 26 Javascript
jQuery 计算iframe 窗口大小的方法
May 13 Javascript
初识SmartJS - AOP三剑客
Jun 08 Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 Javascript
JS/Jquery判断对象为空的方法
Jun 11 Javascript
Vue单文件组件的如何使用方式介绍
Jul 28 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
Sep 30 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
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
Javascript 二维数组
2009/11/26 Javascript
学习JavaScript的最佳方法分享
2011/10/21 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
百度地图自定义控件分享
2015/03/04 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
浅析$(function) ready和onload 的区别
2016/09/03 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
wxpython 学习笔记 第一天
2009/02/09 Python
python实现apahce网站日志分析示例
2014/04/02 Python
django 常用orm操作详解
2017/09/13 Python
Python timeit模块的使用实践
2020/01/13 Python
pandas按条件筛选数据的实现
2021/02/20 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
经营理念口号
2014/06/21 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
JS代码编译器Monaco使用方法
2021/06/11 Javascript
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers