任何一门高级语言在讲解语法的时候必会讲变量。仔细想一想是不是这样的呢?本文通过java代码进行讲解,如果看不懂java代码不影响的哈。都是很简单的java语句,看单词的意思就可以明白的那种。
我们怎么理解变量呢?或者说变量是什么呢?
我们可以这样理解:计算机的程序的运行的实质就是一系列的运算。我们可以简单的把这种运算理解成+ – * / 四则运算(描述不准确,但是我们可以这样理解)。
举个例子:
想一想我们在进行1230*235这个运算的时候我们人是怎么做的呢?我们是不是先找一张草稿纸,在上面写上1230 * 235 然后进行运算。计算机是人发明的所以肯定是让它以我们人类的方法来进行运算的。计算机在进行1230*235这个运算的时候做的第一件事情就是:找一张草稿纸。草稿纸代表什么?代表存储。我们在草稿纸上写1230*235的目的是存储1230 235这两个数。有的人可能会说我不用草稿纸就可以了啊 我可以心算啊。但是弟弟啊,你在进行心算的时候是不是知道自己在算什么呢?你为什么知道自己在算1230 * 235呢?还不是你的大脑此时充当了一张草稿纸把你这两个数存在了大脑里面?
所以:在计算之前我们需要做的事情就是先把需要运算的数字存储起来,那么我们存到哪里呢?我们存到我们的变量里面去。变量你可以理解成一个存储空间的名称。就像stack和heap一样就是一个对某一种存储空间的名称。
我们在写成代码的时候就应该这样写:
int a = 1230;
int b = 235;
int mult = a * b;
可能有些弟弟会这样写:
int mult = 1230 * 235;
这样写的话是不是以为我们没存储1230 和 235呢?我们还是存储了这两个数字的只不过是不存在我们自定义的变量中,而是存到另外一个存储区域去了。
上面的例子所讲的变量都是基本类型的变量。对于引用类型的变量理有一些不同,因为引用类型变量存储的并不是一个用来运算的值,而是一个地址。真正的用来运算的值存储在另外一个地方我们称之为堆(heap)。
我们来看一下这个例子:
String s1 = new String("Lujipeng");
String s2 = new String("Lujipeng");
String s3 = s1;
System.out.println("s1 == s2:"+(s1 == s2)); //false
System.out.println("s1 == s3:"+(s1 == s3)); //true
因为s1和s2变量存储的是地址,s1存储的第一个Lujipeng字符串的地址,s2存储的是第二个Lujipeng字符串的地址。所以s1 == s2 是false的。s3 == s1是true的。此时可能就会有弟弟说:我不喜欢这个结果,明明就是s1和s2都是Lujipeng为什么就不是相等的呢?真是让我无法接受啊。没事java开发者是很人性的,他们提供了equal方法让你自己来定义object(类类型变量)到底怎么样才是相等。所以我们可以直接override一下string类类型的equal方法就可以了。更加人性化的是java开发者已经给我们override了。我们看一下string类型中的equal方法:
作者:知乎用户
链接:https://www.zhihu.com/question/26872848/answer/34364603
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
所以:
System.out.println(s1.equals(s2)); //true
但是我们要注意上面那个例子中string类型变量的初始化。因为string类型可以说是一个历史遗留问题,对我们string的初始化按照这种方式初始化的时候结果会不一样的哦:
String s1 = "Lujipeng";
String s2 = "Lujipeng";
String s3 = s1;
System.out.println("s1 == s2:"+(s1 == s2));
//true 这里会变成true,因为按照上面的方法初始化的时候系统会先在堆中存储一个Lujipeng,然后让s1和s2指向这个Lujipeng。即使
//你有s3 s4....sn如果按照上面这张方法初始化的话他们都是指向一个Lujipeng。
System.out.println("s1 == s3:"+(s1 == s3)); //true
如果你被基本类型变量和引用类型变量的理解搞混了那么我就引用一下《c++ primer plus 5th》中的一句话吧:变量提供一个具名的,可供程序操作的存储空间。
变量构成
int i = 6;
int – 变量的数据类型;i – 变量名;6 – 变量存储的值。这三个可以称为一个变量必不可少的要素(你见过那个变量缺少过这三个要素吗?)。但是你可能会问为什么一个变量必须要有这几个要素呢?我们来探讨一下吧!
数据类型(Date Type)
In computer science and computer programming, a data type or simply type is a classification of data which tells the compiler or interpreter how the programmer intends to use the data. Most programming languages support various types of data, for example: real, integer or Boolean. A data type provides a set of values from which an expression (i.e. variable, function …) may take its values. The type defines the operations that can be done on the data, the meaning of the data, and the way values of that type can be stored.[1][2]