java中变量命名和引用变量的一个坑
这次有两个主题,第一个太简单啦,就是java中变量的命名规则,纯记忆性东西。第二个主题,就是讨论一下对象引用变量的一个注意点。
如果你对命名规则很熟啦,就直接看第二个内容吧。(上边的图稍微有点顺序紊乱啊)
一、java中变量的命名规则
大多数语言的命名规则是相似的,只有一些微小的差别。
- 变量的第一个位置,可以是字母,下划线(_),美元符($) (这个在c/c++,python中是不行的)(注意:不能是数字哦,一想就知道啦为什仫)
- 其他的位置可以是数字,字母,下划线
- 不能使用java中的关键字
java中的关键字有:
boolean byte char double float int long short public private
protected abstract final native static strictfp synchronized transient volatile if
else do while switch case default for break continue assert
class extends implements import instanceof interface new package super this
catch finally try throw throws return void const goto enum
java的命名规则就说这么多,变量除了注意命名规则之外,还要注意命名规范。
二、对象引用变量的注意之处
基本变量没有这个毛病,通过代码来引入问题。
1 public class Test { 2 public static void main(String[] args) { 3 int i1 = 10; 4 int i2 = i1; 5 i1 = 10000; 6 System.out.println("i1 = " + i1); 7 System.out.println("i2 = " + i2); 8 } 9 }
预测一下结果吧。OK,如你所料:
在看一段代码,如果预测结果正确,就不要往下看啦。
1 public class Test { 2 public static void main(String[] args) { 3 Test t = new Test(); 4 Test.Dog d1 = t.new Dog(1);//若看不懂,只需看成创建了一个Dog类一个实例变量 5 Test.Dog d2 = d1;//把d1赋值个d2,此时d2的age是不是1? 6 d1.age = 10;//重新为d1的age属性赋值成10 7 //打印结果 8 System.out.println("dog1's age = " + d1.age); 9 System.out.println("dog2's age = " + d2.age); 10 } 11 12 //为了节省空间能一眼看完,此处写成内部类 13 class Dog { 14 //为了方便把属性定义为public,实际中最好不要 15 public int age; 16 public Dog(int age) { 17 this.age = age; 18 } 19 20 } 21 }
猜猜结果:
猜对没有,为什么没有更改d2的age,d2的age从1变成了10?
基本变量中存的就是实际值,而对象引用变量中存的是一个能找到实际值得数据(可以看成c语言中的地址,因此,所有的对象引用变量的大小都是一样的),所以,当d1赋值d2时,只是把那个能找到实际对象的数据赋值给了d2,内存中只有一个Dog的实例,d1,d2指向同个变量。
所以,d1改变object的值时,d2因指向相同的object,所以,结果就不言而喻啦。
这说得还远远不够,想深入了解,请找书看。
Challenges are what make life interesting and overcoming them is what makes lifes meaningful.