Java语言基础(一)

一,Java语言中的对象引用

C++中指针和引用兼有,而Java中没有指针的概念,完全用引用替代。如C++中一样,引用是我们给变量的一个“别名”,一个变量可以有多个“别名”。引用的值是一个内存地址,在对象的引用被定义时,如:

String s;  //此时s值为空,系统并没有为s所指的对象分配内存

s = “hello”;  //对象实例化以后,系统为对象实例分配内存

t = s;   //给对象实例“hello”起了另一个别名t

t = “world”;  // s会随t的改变而改变吗?

答案是:没有,t变了,而s没有变,Java中所有的基本数据类(StringInteger等)的实例一旦创建,不能改变

注意,我们说的是实例不能改变,可能有人会说:

s = “hello world”; 以后s不是变了吗?这是一个误区:

s的值从 “hello”的字符串首地址1变成了“hello world”的字符串首地址2,但是内存地址1中存放的数据没有改变,仍然是 “hello”,内存地址中存放的数据才是对象的实例。

二,Java语言中的 “==” “equals()”

Java中的 “==”可以对所有类型数据进行匹配,比C++中的 “==”要方便、强大了许多,在C++中需要重载才可以完成各种类型的匹配。我们可以思考一下为什么Java中的 “==”可以完成这样的通用功能?

原因就在于,Java中使用了对象的引用!

1.    “==”比较的是对象引用的值,如:

String a = “this is a string”;

String b = new(“this is a string”);//或者 String b= new (a);

虽然 ab引用指向的对象实例值相同,但是,由于ab引用的值不等,所以 “==”将返回false

2.    Java.lang.Object中的“equals()”被其它类覆盖时,比如java.lang.String中的 “equals()”不仅比较对象的引用值(即 “==”),而且在 “==”false的情况下,继续比较对象实例的值是否相等。

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;

}

你可能感兴趣的:(java,String,object,Integer,equals,语言)