静态变量注意要点,在静态方法和非静态方法之间的注意要点,附加了final

java中有俩种类型变量,一种是加了关键字static修饰的静态变量普通的实例变量,一个类只有一个静态变量,简单来说就是

同一类所有的实例共享一份静态变量或者是每一个类一个静态变量

静态变量有什么特殊的地方?

静态变量是在类在加载过程中初始化的 这也就意味着

1.静态变量会在该类任何 所有对象创建前就初始化

2.静态变量会在该类任何 所有静态方法执行前初始化

3.只会在类第一次载入的时候被初始化

 1 . 非静态方法是否能调用存取静态变量?

 答案是可以(为什么输出的是0?int 默认值是0)

 2.静态方法是否能调用存取实例变量?为什么?

  哈哈哈,眼尖的人应该发现()里的 x 变红了,不行!!但是原因是什么呢?我这里发表一下我的看法。

我们访问调用实例变量时必须要有“已经已经实例化好的对象”,这就意味着我们静态方法里面得有一个实例对象,这当然是不可能的,所以无法通过编译。

还有一种理解方式,我之前说明静态变量是 1.静态变量会在该类任何 所有对象创建前就初始化 静态方法有有些类同,是类在被加载的时候就执行了,而初始化时候才会为我们的普通成员变量赋值。如果静态方法调用存取实非静态成员变量会超前,可能会调用了一个还未初始化的变量,因此编译器会报错。

3.非静态方法是否能调用final修饰的实例变量?为什么?//不需要可跳过

//注意!! final修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值,这也是为什么我们要赋值。

 你想对了没?嘿嘿,没错 可以通过编译的,为什么?首先我们要明白final的含义是什么,fianl值后就无法被更改,上述中x并没有发生改变!记住,final修饰的值是不能改变的!变就错!还有fianl的方法不能被覆盖,final的类不能被继承。

!所以现在我们思考一下类已经是final的话,类里面的方法还需要标记final吗,是不是很多余?

!不只是多余,是超级多余,上面已经说明final类不能被继承,简而言之就是没子类,不能被子类化,那么他的方法还能被覆盖吗?当然不行!! 还有,如果只是想要单独限制几个方法不能被覆盖,我们在单独这些方法前面加上final就好了。

        

4.非静态方法是否能调用存取final修饰的静态变量?为什么? 

 

   我敢赌这里肯定有很多人觉得是可以通过编译,上面不是说了吗?非静态方法可以调用存取静态变量,而且这里又没有修改final的值。这么理解当然是错误的!!!吓一跳吧,再想一想是怎样?嘿嘿,其实这样想是对的!就是这样,你得相信你自己的判断。

 5.和上题基本一样,只是给go方法加上了参数 

问 思考一下里面这个代码现在有什么问题?

答 是不是超级简单?之前我们都说过了   final修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值,这也是为什么我们要赋值。 如果你不知道,我敢打赌之前黄色注意你没有看到,哼哼。所以我们给T.go()加上一个参数,看看 和 静态变量有什么关系没。

 问 通过编译了!太棒了,没有问题,等等,为什么输出的是52,而不是12,这里有什么玄机吗?

我神秘一笑,这里就不做解释,不懂!那你前面都没有弄懂!

 6.最后一问了,看到这里是不是有些豁然开朗,没错这里和之前联系起来了是吧,没错,输出的内容和第五问一样,解释也包括在前面小问里面了。

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值