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代码
Jul 20 Javascript
js输出列表实现代码
Sep 12 Javascript
javascript实现获取浏览器版本、操作系统类型
Jan 29 Javascript
jquery实现顶部向右伸缩的导航区域代码
Sep 02 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
Feb 16 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
Aug 11 Javascript
JavaScript实现简单的树形菜单效果
Jun 23 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
Sep 02 Javascript
Vue 路由 过渡动效 数据获取方法
Jul 31 Javascript
vue项目环境变量配置的实现方法
Oct 12 Javascript
详解vue-router数据加载与缓存使用总结
Oct 29 Javascript
vue 中几种传值方法(3种)
Nov 12 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
终于听上了直流胆调频
2021/03/02 无线电
php文件怎么打开 如何执行php文件
2011/12/21 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
PHP Include文件实例讲解
2019/02/15 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
Js获取事件对象代码
2010/08/05 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
搭建vue开发环境
2018/07/19 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
python进程管理工具supervisor使用实例
2014/09/17 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
Python中内建模块collections如何使用
2020/05/27 Python
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
人力资源专业推荐信
2013/11/29 职场文书
生产部管理制度
2014/01/31 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
离婚财产分配协议书
2014/10/21 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
Java 异步任务计算FutureTask
2022/04/28 Java/Android