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 相关文章推荐
Prototype 学习 工具函数学习($w,$F方法)
Jul 12 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
Oct 17 Javascript
js获取多个tagname的节点数组
Sep 22 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
Bootstrap每天必学之警告框插件
Apr 26 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
Sep 08 Javascript
JavaScript数据结构链表知识详解
Nov 21 Javascript
vue生命周期和react生命周期对比【推荐】
Sep 19 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
Mar 02 Javascript
用 js 写一个 js 解释器过程详解
Aug 02 Javascript
JS判断数组四种实现方法详解
Jun 29 Javascript
JavaScript实现下拉列表
Jan 20 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php结合飞信 免费天气预报短信
2009/05/07 PHP
php牛逼的面试题分享
2013/01/18 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
vue.js的提示组件
2017/03/02 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
Vue刷新修改页面中数据的方法
2018/09/16 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python内存映射文件读写方式
2020/04/24 Python
python super()函数的基本使用
2020/09/10 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
软件售后服务方案
2014/05/29 职场文书
暑期家教宣传单
2015/07/14 职场文书
2016年感恩节寄语
2015/12/07 职场文书
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python