一.包(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()方法然后重写了此方法,用来比较字符串的内容。