全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java中static关键字用法详解

前言

static对我们来说并不陌生,也是面试经常碰到的问题,今天抽空整理了一篇总结作为笔记保存起来!
static用法可以分为三大块:静态变量、静态方法、静态代码块,下面将从这三个方面分析

静态方法

通常在一个类中定义一个方法为static,即为静态方法,无需本类的对象即可调用此方法
声明为static的方法有要注意以下几点:
· 它们仅能调用其他的static方法。
· 它们只能访问static变量。
· 它们不能以任何方式引用this或super。

public class MainClass {

  public static void main(String[] args) {
    SubClass.print();
  }

}

class SubClass {

  static void print() {

    System.out.println("Welcome");

  }

}

调用一个静态方法就是“类名.方法名”使用如上所示。一般来说,静态方法常常作为一些公用的工具类方法方便调用,在Java的类库中大量的静态方法正是出于此目的而定义的。

静态变量

声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了

public class MainCountClass {

  public static void main(String[] args) {
    Value v1, v2;
    v1 = new Value();
    v2 = new Value();
    print("v1.index=" +v1.index + " v2.index="+v2.index);
    v1.addIndex();
    print("v1.index=" +v1.index + " v2.index="+v2.index);
  }

  public static void print(String str){
    System.out.println(str);
  }

}

class Value {
  static int index = 0;
  static void addIndex(){
    index++;
  }
}

输出结果为:
v1.index=0 v2.index=0
v1.index=1 v2.index=1
由此可以证明多个实例共享一块存储区,操作的是同一个变量。

再来看一下static初始化的问题,观察一下static的优先级,这里要注意static代码块仅在该类被加载时执行一次。

public class MainCountsClass {

  public static void print(String str){
    System.out.println(str);
  }

  Values v = new Values(10);
  static Values v1, v2;
  static {//静态代码块
    print("v1.index="+v1.index + " v2.index="+v2.index);
    v1 = new Values(15);
    print("v1.index="+v1.index + " v2.index="+v2.index);
    v2 = new Values(5);
    print("v1.index="+v1.index + " v2.index="+v2.index);
  }

  public static void main(String[] args) {
    MainCountsClass count = new MainCountsClass();
    print("count.index="+count.v.index);
    print("v1.index="+v1.index + " v2.index="+v2.index);
    v1.addIndex();
    print("v1.index="+v1.index + " v2.index="+v2.index);
    print("count.index="+count.v.index);
  }

}

class Values {
  static int index = 0;
  public Values(){
    index = 6;
  }

  public Values(int num){
    index = num;
  }

  public static void addIndex() {
    index++;
  }
}

输出结果为:

v1.index=0 v2.index=0
v1.index=15 v2.index=15
v1.index=5 v2.index=5
count.index=10
v1.index=10 v2.index=10
v1.index=11 v2.index=11
count.index=11

这个程序展示了静态初始化的各种特性。可能会对static后加大括号感到困惑。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。

静态类

通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。

public class StaticClass {

  public static void main(String[] args) {
    OutherClass.innerClass oi = new OutherClass.innerClass();
  }

}

class OutherClass {
  public static class innerClass{
    innerClass() {
      System.out.println("内部类输出……");
    }
  }
}

static和final一起使用

static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问

补充说明

1)被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
2)用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。
3)static 变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
4)static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表…)
类名.静态变量名
5)用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大)。
6)static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是:
 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
7)static方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法 (就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # static  # 关键字  # Java中的static关键字深入理解  # java关键字static的使用详解  # JAVA Static关键字的用法  # 详解java中的static关键字  # java多线程关键字final和static详解  # Java静态static关键字原理详解  # 浅谈Java中static关键字的作用  # Java8的default和static关键字的使用讲解  # 学习Java的static与final关键字  # Java 关键字static详解及实例代码  # 浅析对Java关键字final和static的理解  # Java static关键字详细介绍与用法总结  # Java基础之static的用法  # 可以直接  # 的是  # 这是  # 加载  # 多个  # 这段  # 可以通过  # 要注意  # 此类  # 只有一个  # 一个普通  # 类中  # 访问权限  # 也就是说  # 全局变量  # 就会  # 却是  # 就能  # 子类  # 出现在 


相关文章: 如何快速启动建站代理加盟业务?  如何在Windows 2008云服务器安全搭建网站?  建站之星免费版是否永久可用?  制作网站怎么制作,*游戏网站怎么搭建?  如何快速搭建二级域名独立网站?  如何快速生成凡客建站的专业级图册?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  如何在云虚拟主机上快速搭建个人网站?  如何用AWS免费套餐快速搭建高效网站?  c++ stringstream用法详解_c++字符串与数字转换利器  如何用已有域名快速搭建网站?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何构建满足综合性能需求的优质建站方案?  网站制作报价单模板图片,小松挖机官方网站报价?  如何基于PHP生成高效IDC网络公司建站源码?  如何撰写建站申请书?关键要点有哪些?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  定制建站如何定义?其核心优势是什么?  香港服务器租用费用高吗?如何避免常见误区?  如何选择适合PHP云建站的开源框架?  建站之星如何取消后台验证码生成?  网站制作新手教程,新手建设一个网站需要注意些什么?  设计网站制作公司有哪些,制作网页教程?  网站网页制作专业公司,怎样制作自己的网页?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  建站之星上传入口如何快速找到?  如何在局域网内绑定自建网站域名?  专业网站建设制作报价,网页设计制作要考什么证?  建站之星伪静态规则如何设置?  ,购物网站怎么盈利呢?  linux top下的 minerd 木马清除方法  如何解决ASP生成WAP建站中文乱码问题?  c# 服务器GC和工作站GC的区别和设置  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  广东专业制作网站有哪些,广东省能源集团有限公司官网?  建站主机选购指南:核心配置优化与品牌推荐方案  做企业网站制作流程,企业网站制作基本流程有哪些?  如何在万网主机上快速搭建网站?  免费网站制作appp,免费制作app哪个平台好?  北京专业网站制作设计师招聘,北京白云观官方网站?  建站之星ASP如何实现CMS高效搭建与安全管理?  深圳网站制作的公司有哪些,dido官方网站?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  如何用西部建站助手快速创建专业网站?  建站之星代理如何优化在线客服效率? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。