位置: 编程技术 - 正文

java必学必会之static关键字(javastudio)

编辑:rootadmin

推荐整理分享java必学必会之static关键字(javastudio),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javaststic,java step,javaststic,java stdin,java step,java structs,java structs,java s,内容如对您有帮助,希望把文章链接给更多的朋友!

一、static关键字

  

  原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态成员变量。对于static成员变量来说,这个成员变量只有一份,而且这一份是这个类所有的对象共享。

1.1.静态成员变量与非静态成员变量的区别

  以下面的例子为例说明

通过画内存分析图了解整个程序的执行过程

  执行程序的第一句话:Cat.sid = ;时,这里的sid是一个静态成员变量,静态变量存放在数据区(data seg),所以首先在数据区里面分配一小块空间sid,第一句话执行完后,sid里面装着一个值就是。

  此时的内存布局示意图如下所示

  

  接下来程序执行到:

    Cat mimi = new Cat(“mimi”);

  这里,调用Cat类的构造方法Cat(String name),构造方法的定义如下:

    Cat ( String name){

      this.name = name;

      id=sid++;

    }

  调用时首先在栈内存里面分配一小块内存mm,里面装着可以找到在堆内存里面的Cat类的实例对象的地址,mm就是堆内存里面Cat类对象的引用对象。这个构造方法声明有字符串类型的形参变量,所以这里把“mimi”作为实参传递到构造方法里面,由于字符串常量是分配在数据区存储的,所以数据区里面多了一小块内存用来存储字符串“mimi”。此时的内存分布如下图所示:

  

  当调用构造方法时,首先在栈内存里面给形参name分配一小块空间,名字叫name,接下来把”mimi”这个字符串作为实参传递给name,字符串也是一种引用类型,除了那四类8种基础数据类型之外,其他所有的都是引用类型,所以可以认为字符串也是一个对象。所以这里相当于把”mimi”这个对象的引用传递给了name,所以现在name指向的是”mimi”。所以此时内存的布局如下图所示:

  接下来执行构造方法体里面的代码:

    this.name=name;

  这里的this指的是当前的对象,指的是堆内存里面的那只猫。这里把栈里面的name里面装着的值传递给堆内存里面的cat对象的name属性,所以此时这个name里面装着的值也是可以找到位于数据区里面的字符串对象“mimi”的,此时这个name也是字符串对象“mimi”的一个引用对象,通过它的属性值就可以找到位于数据区里面的字符串对象“mimi”。此时的内存分布如下图所示:

  

java必学必会之static关键字(javastudio)

  接下来执行方法体内的另一句代码:id=sid++;

  这里是把sid的值传递给id,所以id的值是,sid传递完以后,自己再加1,此时sid变成了。此时的内存布局如下图所示。

  

  到此,构造方法调用完毕,给这个构造方法分配的局部变量所占的内存空间全部都要消失,所以位于栈空间里面的name这块内存消失了。栈内存里面指向数据区里面的字符串对象“mimi”的引用也消失了,此时只剩下堆内存里面的指向字符串对象“mimi”的引用没有消失。此时的内存布局如下图所示:

  

  接下来执行:Cat pipi = new Cat(“pipi”);

  这里是第二次调用构造方法Cat(),整个调用过程与第一次一样,调用结束后,此时的内存布局如下图所示:

  

  最后两句代码是调用info()方法打印出来,打印结果如下:

  

  通过这个程序,看出来了这个静态成员变量sid的作用,它可以计数。每当有一只猫new出来的时候,就给它记一个数。让它自己往上加1。

  程序执行完后,内存中的整个布局就如上图所示了。一直持续到main方法调用完成的前一刻。

  这里调用构造方法Cat(String name) 创建出两只猫,首先在栈内存里面分配两小块空间mimi和pipi,里面分别装着可以找到这两只猫的地址,mimi和pipi对应着堆内存里面的两只猫的引用。这里的构造方法声明有字符串类型的变量,字符串常量是分配在数据区里面的,所以这里会把传过来的字符串mimi和pipi都存储到数据区里面。所以数据区里面分配有存储字符串mimi和pipi的两小块内存,里面装着字符串“mimi”和“pipi”,字符串也是引用类型,除了那四类8种的基础数据类型之外,其他所有的数据类型都是引用类型。所以可以认为字符串也是一个对象。

  这里是new了两只猫出来,这两只猫都有自己的id和name属性,所以这里的id和name都是非静态成员变量,即没有static修饰。所以每new出一只新猫,这只新猫都有属于它自己的id和name,即非静态成员变量id和name是每一个对象都有单独的一份。但对于静态成员变量来说,只有一份,不管new了多少个对象,哪怕不new对象,静态成员变量在数据区也会保留一份。如这里的sid一样,sid存放在数据区,无论new出来了多少只猫在堆内存里面,sid都只有一份,只在数据区保留一份。

  静态成员变量是属于整个类的,它不属于专门的某个对象。那么如何访问这个静态成员变量的值呢?首先第一点,任何一个对象都可以访问这个静态的值,访问的时候访问的都是同一块内存。第二点,即便是没有对象也可以访问这个静态的值,通过“类名.静态成员变量名”来访问这个静态的值,所以以后看到某一个类名加上“.”再加上后面有一个东西,那么后面这个东西一定是静态的,如”System.out”,这里就是通过类名(System类)再加上“.”来访问这个out的,所以这个out一定是静态的。

再看下面的这段代码

  这段代码与上一段代码唯一的区别是把声明sid变量的static修饰符给去掉了,此时的sid就不再是静态成员变量,而是非静态成员变量了,此时每一个new出来的cat对象都会有自己单独的sid属性。所以这段代码执行完成后,内存中的布局如下图所示:

  

  由于sid变成了非静态成员变量,所以不再有计数的功能了。sid与id和name属性一样,成为每一个new出来的对象都具有的属性,所以每一个new出来的cat都加上了一个sid属性。由于不能再使用”类名.静态成员对象名”的格式访问sid,所以代码的第一句”Cat.sid =;”不能这样使用,否则编译会出错,必须把这句话注释掉才能编译成功。既然无法访问得到sid的值,所以sid的值就一直都是初始化时赋给的值0。直到调用构造方法时,执行到方法体内的代码id=sid++;时,sid首先把自身的值0赋值给id,所以id的值是0,然后sid自己加1,所以sid变成了1。

  所以静态变量和非静态变量的区别就在于静态变量可以用来计数,而非静态变量则不行。

  理解了内存,就理解了一切,就理解了各种各样的语言。所有的语言无非都是这样:局部变量分配内存永远在栈里面,new出来的东西分配内存永远是在堆里,静态的东西分配内存永远是在数据区。剩下的代码肯定是在代码区。所有的语言都是这样。

  在一个静态方法里,如果想访问一个非静态的成员变量,是不能直接访问的,必须在静态方法里new一个对象出来才能访问。如果是加了static的成员变量,那么这个成员变量就是一个静态的成员变量,就可以在main方法里面直接访问了。

  main方法是一个静态的方法,main方法要执行的时候不需要new一个对象出来。

  动态方法是针对于某一个对象调用的,静态方法不会针对某一个对象来调用,没有对象照样可以用。所以可以使用”classname.method()”.的形式来调用静态方法。所以想在main方法里面访问非静态成员变量是不可以的,想在main方法里面访问非静态方法也是不可以的,因为非静态方法只能针对于某个对象来调用,没有对象,就找不到方法的执行者了。

  成员变量只有在new出一个对象来的时候才在堆内存里面分配存储空间。局部变量在栈内存里面分配存储空间。

  静态方法不再是针对某一个对象来调用,所以不能访问非静态的成员。

  非静态成员专属于某一个对象,想访问非静态成员必须new一个对象出来才能访问。

  静态的变量可以通过对象名去访问,也可以通过类名去访问,两者访问的都是同一块内存。

标签: javastudio

本文链接地址:https://www.jiuchutong.com/biancheng/387093.html 转载请保留说明!

上一篇:解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法(js页面滚动到指定位置)

下一篇:详解JavaScript对象和数组(javascript的对象)

  • 营利性医疗机构筹建是什么意思
  • 费用日记账明细
  • 报销人和经办人怎么区分
  • 款项已付发票未到,怎么做凭证
  • 个税申报了还要扣钱吗
  • 当地外包公司是干什么的
  • 小规模普票专票税率一样吗
  • 小微企业免税销售额和其他免税销售额
  • 个人以不动产投资入股
  • 其他综合收益不能重分类进损益的有哪些
  • 公允价值确定方法最新
  • 金融企业计提的坏账准备金
  • 留存收益转增资本有什么好处
  • 接受控股股东的非现金资产捐赠
  • 物流快递代收货款怎么退
  • 中方人员取得的工资、薪金所得,征收个人所得税有特别规定吗?
  • sd标准差是什么意思
  • 购买商品成本要支付哪些成本
  • 生产企业出租设备如何开票
  • 已认证的进项税额转出怎么做账务处理
  • 一式三联的收据哪一联要盖财务章
  • 常见的linux系统磁盘
  • 新版edge浏览器兼容模式怎么设置
  • macos big sur将安装在macintosh hd
  • win10开机黑屏几秒
  • 游戏不能全屏幕
  • win10电源模式最佳性能多耗好多电
  • 建筑施工企业是落实施工现场带班制度的第一责任人
  • php自学
  • 分公司 股东
  • 怎么扣除购入的物品
  • 母公司投资收益和子公司
  • 高新技术企业研发费用归集
  • 跨年度发票的发票要报销应该怎么办
  • 长期借款利息和短期借款利息都应计入财务费用
  • 如何防范增值税的税收风险
  • 注销公司需要缴纳注册资金吗
  • 前端 input
  • laravel怎么用
  • php图片代码
  • 出差补助需要发工资吗
  • 货物及劳务包括哪些内容
  • 产品出库单附在什么凭证后面
  • 小规模纳税人的增值税账务处理
  • 一般纳税人销售货物税率
  • 长期投资减值准备属于什么会计科目
  • 个人劳务费怎么退税
  • 最新版税控盘怎么设置打印机
  • 在建工程领用原材料税费怎么处理
  • 为什么一般纳税人税率高
  • 公对公转账货款写成了往来款怎么办
  • 留抵税额抵减欠税滞纳金
  • 固定资产房屋拆除后如何做帐务处理
  • 房租押金不退如何处理
  • 预付账款是属于什么类
  • macos怎么操作
  • 使用组策略可控制什么
  • ubuntu系统怎么更新
  • uphclean.exe - uphclean进程是什么意思
  • 安装xp后win7不能用怎么办
  • winoldap.exe - winoldap进程是什么意思
  • win7音量图标不能启用
  • SchSvr.exe - SchSvr是什么进程 有什么作用
  • dmg是啥文件
  • [置顶] 此外,车牌号:458143(懂得都懂[吃瓜])
  • android app 框架
  • 经典都有什么
  • android课程心得体会
  • 用python画一棵树
  • javascript教程完整版
  • 成都市税务局公示名单公布
  • 工会经费网上怎么申报
  • 网上交医保几点上班
  • 电子发票和普通发票哪个好
  • 个人所得税是哪种税率
  • 四川4050社保补贴政策什么时候发放
  • 医保可以直接到税局买吗?
  • 税务师 领证
  • 大修费属于什么费用
  • 地税局申报个人所得税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设