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