Java-初步认识-常用对象API(String类-特点)

一. 引言

前面讨论的是主要是面向对象的思想和java的基础编程,同时在多线程的基础中呢,又进行了面向对象思想的基本深化,就是说继承Tread类或者实现Runable接口,面向对象的三个特征都得以体现了。接口的出现,也将线程的执行路径和线程的任务进行了分离,降低了其耦合性。

再接着要学习的就是,日后在用java语言开发的时候,我们所需要的一些工具,或者说一些对象。

java本身已经给我们提供了n多的对象,来方便于我们的开发,这些对象都是遵循面向对象思想而出现的。后期在讲述时就不再讲述思想了,而是在不断地学习这些对象的基本使用。从思想的学习转变为使用的学习上来了。知道怎么用,什么时候用。

二.

现在学习日后开发常用的一个对象,开发中会打印一大段文字,在java中就是字符串。这个描述字符串的对象,才是我们任务开发最为常用的对象之一。这个字符串为了方便于操作,java便按照面向对象的思想进行了描述,进行了面向对象的封装,提供了对字符串操作的方法。我们以后见到字符串,只要指挥字符串做事情就可以了。

你把这个事情封装成对象以后,你能指挥,别人也能指挥。

描述字符串的这个类就是String,这个String是个类。我们要想对这个类进行对象的建立,有这么几种方式。

之前介绍过字符串的创建,String str="abc",直接用双引号表示这个字符串。一旦变成字符串时,它其实就是个对象了。因为String是个类,str是个类类型的变量。类类型的变量应该指向一个实体,"abc"就是一个对象。

要说一说字符串特殊的地方。

从本节开始,视频中采用Eclipse来编辑源代码,而不是用Editplus来编辑了。

在Eclipse中,创建多个包时,不同的包之间有个顺序。有时系统会按照字母的顺序给我们实际设置的顺序进行了变换,

String对象的第一个特点就是不能改变,但是上面的例子显示貌似是可以变化的。

这里是两个字符串对象,而s刚才指向"abc",现在指向"nba","abc"并没有变,说的是字符串对象一旦初始化就不能被改变。

s是一个引用型变量,它可以指向这个或者那个,但是"abc"不变。

接着看下面的例子,

s和s1都是"abc",现在我们看输出结果,true或false。==是用来比较地址值的,结果显示为true。

这两个地址怎么一样呢?在字符串建立时,内存当中有一个字符串缓冲区,可以理解为字符串常量池。这怎么创建呢?先从第一个语句开始说,咔来了个字符串,它先到字符串常量池(它里面什么也没有),查看里面是否有"abc",一看没有,就创建"abc",再把"abc"的地址值给s。s1也是这样,它先到常量池中寻找有"abc"么?有,系统就把已有的"abc"地址值赋给s1。这就意味着s和s1指向同一个"abc",这个字符串存在于常量池当中。

这里采用的是在Eclipse中建立文档注释。

三.

创建对象可以用new创建,用new创建东西需要查询很多东西,因为初始化有很多种,需要查询API,有没有提供这样的方法。

String是java中的核心类,所以它在java.lang包中,(java的language包是java的核心包,里面定义的都是java的核心类)。1.2版本以后,这个包会自动导入。

依照截图中的方法,String类可以创建对象,

DOS结果显示,这两者是一样的。

但是再次比较二者时,结果为false。就是说不同的创建方法,在进行比较时,得出不同的结果。

一个是在字符串常量池中创建了一个字符串常量并把地址赋值给了引用型变量,还有一个是在堆内存中用new的方式创建了String对象。String s1=new String("abc");这里其实是创建了两个对象,先是在堆内存中创建了一个对象,接着再将对象"abc"传递进来。因此,在通过==进行比较的时候,结果就不一样。

String s="abc"是创建了一个对象。它们在常量池中,而且是可以共享的。而new方式创建的,其实最终在堆中也是创建的常量池。

如果想比较对象是否相同,可以做另外的动作,==仅仅是用来比较地址值。

用equals方法进行比较时,两者又是相等的。equals方法进行比较的确实是地址值。在这里==和equals方法比较得出的结果怎么不一样呢?String是object类的子类,它其实是在将object类中的equals方法覆写,建立了字符串依据自身特点来比较字符串是否相同的依据。equals到底是依据什么判断的呢?字符串对象想判断是否是一样的是吧?它比较的是内容,而不是地址。尽管是不同的创建方法,但是s和s1中的内容是一样的。

猜你喜欢

转载自blog.csdn.net/fighting_future/article/details/80464581