您的位置:首页 > 移动开发 > Objective-C

菜鸟的学习之路(7) — 包(package)、Object类和String类

2013-10-22 17:17 295 查看
一.包(package):

1.包:用于将不同功能的类分门别类,放在不同的目录(包)下。

命名规范:一般采用自己在互联网上的域名称作为自己程序包的唯一前缀,且域名翻转,每个字母小写。

例如:bztc.edu.cn 翻转 cn.edu.bztc(包名)

当定义的时候没有使用package那么java就认为我们所定义的类在默认包里(default package)。

编译带有package声明的package源文件有两种方式:

(1).直接编译,然后根据类中所定义的包名逐一进行手工建立目录结构,最后将生成的class文件放到该目录结构中(此方法很少使用,因为非常的麻烦,因为逐一进行手工目录的创建)。

(2).使用编译参数 -d,方式为javac -d . 源文件.class,这样编译后,编译器会自动给我们生成目录结构,然后将class文件放在目录下。( -d . 这个点的意思是在当前目录下创建目录结构)

例子:



有两个包名,第一个aa.bb,cc和aa.bb.cc.dd我们就说第二个是前一个的子包。

2.导入(import):

import用于将package分离的各个类导入回来,能够让编译器直接找到该类。

语法: import cn.edu.bztc.a.b.c.d.Test;

语法: import cn.edu.bztc.a.b.c.d.*; //表示对于该目录文件下类全部导入。

如果d下还有e那么需要在加一条import语句,因为d只是导入d下的类,而不会导入e下的类。

注意:package必须放在所有代码的开头如上例子,然后再是import语句,然后再是class或者interface的定义

如果两个类都在同一个包中则不需要导入。

二.Object:

Object:使用时不用显示的导入java.long包,因为编译时由编译器自动帮助我们导入。

类Object是继承体系中的根,每个类都会将Object作为父类,所有对象(包括数组)都实现这个类的方法。

Object类中的方法(部分,除去private的方法):

本人的英语水平有限,看英文的感觉比较麻烦,所以为了方便看的是中文的帮助文档。

提倡大家还是去看英文版的帮助文档,官网就有。



Object类就一个无参数的构造方法。

接下来对类中的方法(部分)使用:

1. toString()例子:



对于本例子中的当打印引用时,就会打印出引用所指向的对象中的toString()的返回值,因为每个类间接或直接的继承Object,而Object类中定义了toString()方法,所以每个类中也就继承了这个方法,但是每个类可以重写这个toString()方法,所以例子中上下两个输出的内容是不一样的,String的引用输出的字符串,而Object输出的是一串字符串,它的含义此对象是该类的一个实例、@和此对象的哈希码(16进制)组成。

16进制:0~9、A~f,逢十六就进一。

2.equals()例子:



本例子中的equals()方法,因为在Object类中定义,所以在java中每个类中都会有此方法,对于Object类中的此方法是判断调用equals()的引用和传进来的引用是否是指向同一个对象,可以说等价于 == 。

三.String:

1.String不属于八种基本数据类型,String是一个对象。

2.String对象的初始化:

由于String对象的常用,所以在对String对象进行初始化时,java提供了一种简化的特殊语法。

a).格式如下:

String str = "abc";

b).标准格式:

String str1 = new String("abcd");

如果按照第二种方法,会在内存的使用造成比较大的浪费。例如:String str = new String("abc");实际上创建了两个String对象,一个是”abc”对象,存储在常量空间中,一个是使用new关键字为对象s申请的空间。

3.String 是常量,其对象一旦创建完毕就无法改变。如果使用 + 拼接字符串时,就会生成新的String对象,而不是原有的String对象追加内容。

4.String Pool(字符串池):在JVM中存在着一个字符串池,其中保存的很多String对象,可以共享使用,因此提高了效率。因为String类时final的,它的值已经创建就不能在改变。

5.String对象初始化的两种方式的解释:

a).String s = "hello";

首先在String Pool中查找有没有"hello"这个对象,如果不存在,则在String Pool 中创建一个“hello”对象,然后将String Pool中的"hello"对象的地址返回来,赋给引用变量 s,这样s会指向String Pool中的“hello”字符串对象。如果存在,则不会创建任何对象,直接将String Pool中的“hello”字符串地址返回来,赋给变量引用s。

b).String s = new String("hello");

当使用这个初始化时,首先在String Pool中查找“hello”字符串对象,如果存在这个字符串则不再去创建“hello”这个对象了,直接在堆(heap)中创建一个“hello”字符串对象,然后将堆中的这个“hello”这个字符创对象的地址返回来,赋给引用变量s,然后s指向的是堆中创建的“hello”字符串对象。如果不存在,则现在String Pool中去创建一个“hello”字符串对象,然后再堆中再去创建一个“hello”字符串对象,然后将堆中的这个“hello”字符串对象地址返回来,赋给s,导致s指向的是堆中的“hello”字符串对象。

基于上面两个的例子:



6.字符串的比较:

既然是字符串的比较那肯定就是比较的其中的内容,而不是比较的字符串对象的地址,那也就不用去管它是否是堆中的还是String Pool的了,所以这时候就要用equals()方法。

String str1 = "hello";

String str2 = new String("hello");

System.out.println(str1.equals(str2)); // 结果为true。

Object中的equals()方法是判断两个对象的引用是否一致。而String类继承课Object类中的equals()方法然后重写了此方法,用来比较字符串的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: