6.使用包
6.1将类放在包中
在类的定义文件头上加“package;”即可。也可以在Eclipse中快速建立一个包,右击项目中的src目录,选择New_Package命令。
注意:
(1)在源代码中,“package chinasei;”表示该源文件中的所有类都位于包chinasei中。packagge语句必须放在源代码文件的最前面,也可以不指定package语句,相当于将类放在默认包中,不过指定包,使用更方便、可靠。
(2)在java中,推荐包名字的字母小写,例如“chinasei”“bank”等,为了便于阅读,有时候还用“.”隔开,例如“school.admin”“school.stu”等。
(3)在将类放入某个包中之后,包将会用专门的文件夹来表示。
(4)如果要用命令来运行某个包中的类,必须首先到达包目录所在的上一级目录。
(5)使用命令行编译一个.java文件,在默认情况下不会生成相应目录。
(6)编写一个类,编译成.class文件之后任意放在一个目录下,这并不等于就将该类放在吧哦包中。包名必须在源代码中,通过package语句指定,而不是靠目录结构来确定。
6.2访问包中的类
- 在同一个包中直接用类名访问,不用指定类所在的包。
- 两个类不在同一个包中的情况:(1)在使用类时指定类的路径。(2)用import语句导入该类。
注意:
(1)如果一个包中的类很多,可以用“import包名.*”导入该包中的所有类。
(2)TeacherTest类访问Teacher类,必须要保证Teacher是public类(定义时class前必须加关键字public)。
(3)有时候,包名中有“.”例如“school.admin”,这并不是说school包中包含了admin包,school.admin仅是一个包名而已。因此,“import school.*;”只是导入了school包中的类,并没有导入school.admin包中的类,如果要导入school.admin包中的类,必须使用“import school.admin”。
7.使用访问控制修饰符
7.1类的访问控制修饰符
在定义类时,有时会在类的前面加上关键字public。
在不写public的情况下属于默认访问修饰,此时该类只能被同一包中的所有类识别;如果写了public,该类则是一个公共类,可以被包内、包外的所有类识别。
注意:
如果将一个类定义成public类,类名和文件名必须相同,因此在一个.java中最多只能有一个public类。
7.2成员的访问控制修饰符
对于成员来说,访问控制修饰符共有4个,分别是private、default、protected、public。其特性如下:
(1)private类型的成员只能在定义它的类的内部被访问。
(2)default类型的成员可以在定义它的类的内部被访问,也可以被这个包中的其他类访问。
(3)protected类型的成员可以在定义它的类的内部被访问,也可以被这个包中的其他类访问,还可以被包外的子类访问。
(4)public类型的成员可以在定义它的类的内部被访问,也可以被包内、包外的所有其他类访问。
从开发程度讲,private<default<protected<public。
8.使用类中类
类种类,顾名思义是在类中定义了类,也称为内部类。
注意:
(1)内部类中的成员只在内部类范围内才能被使用,外部类不能像使用自己的成员变量一样使用它们。
(2)如果在内部类中使用this,仅代表内部类的对象,因此也只能引用内部类的成员。
9.使用继承
9.1继承
继承是面向对象的重要特征。在Java中,被继承的类称为父类、基类或超类,与之对应的类称为子类或派生类。继承是通过关键字extends实现的,格式如下:
class子类extends父类{}
9.2实现继承
注意:
如果一个成员要被子类继承之后使用,这个成员不能是private类型,因为私有的成员不能在类的外部使用,当然也不能被子类使用。一般情况下,成员变量定义为protected类型,成员函数定义为public类型。
注意:
- Java不支持多重继承,一个子类只能有一个父类,不允许出现以下情况:
class子类extends父类1,父类2{ }
- 在Java中可以有多层继承,如A继承了B,B又继承了C。此时相当于A间接地继承了C。
9.3继承的底层本质
从本质上讲,子类继承父类之后实例化子类对象的时候,系统会首先实例化父类对象。
只要实例化子类对象,系统就会先自动实例化一个父类对象与之对应,当然此时调用的是父类没有参数的构造函数。
这就出现了一个问题——父类构造函数万一有参数呢?此时,系统必须要求在实例化父类对象时传入参数,否则会报错。
系统在子类函数中报错,其原因是父类没有不带参数的构造函数。解决该问题有以下两种方法:(1)给父类增加一个不带参数的空构造函数,代码错误即可消失
(2)在子类的构造函数中,第一句用super给父类构造函数传参数,代码错误即可消失。
注意:
“super(title);”必须写在子类构造函数的第一句,传入的参数必须和父类构造函数中的参数列表类型匹配。
10.成员的覆盖
10.1成员覆盖
子类中成员函数的定义和父类相同是指名称相同、参数列表相同、返回类型相同。
如果子类中的函数定义和父类相同,最后调用时是调用子类中的方法,称为覆盖或重写。
注意:
(1)将Override和Overload相区别。
(2)如果在子类中定义了一个名称和参数列表与父类相同的函数,但是返回类型不同,此时系统会报错。
(3)在重写时,子类函数的访问权限不能比父类的更加严格。
(4)在覆盖的情况下,如果一定要在子类中调用父类的成员函数,可以使用关键字super,调用方法是“super.函数名”。
10.2成员覆盖的作用
成员覆盖的最大作用是在不改变源代码的情况下能够对一个模块的功能进行修改。
11.使用多态
11.1多态
多态是面向对象的基本特征之一,也是软件工程的重要思想。
注意:
函数重载也是一种多态,称为静态多态。
动态多态的理论基础是父类引用可以指向子类对象。
11.2使用多态
“父类引用可以指向子类对象”可以延申到以下两个方面:
1.函数传入的形参可以是父类类型,而实际传入的可以是子类对象。
注意:
为多种对话框编写多个toCenter函数实际上是函数重载,这也是静态多态的“静态”的特点,需要编写多个函数。
2.函数的返回类型是父类类型,而实际返回的可以是子类对象。
11.3父类和子类对象的类型转换
在多态的情况下,父类和子类之间的转换需要注意以下问题:
1.子类类型对象转换成父类类型。根据多态原理,子类对象无须转换就可以赋值给父类引用。
2.父类类型对象转换成子类类型。严格来讲,父类类型对象无法转换成子类类型。但有一种特殊情况,如果父类类型对象原来就是某一种子类类型对象,则可以转换成相应的子类类型对象,此时使用强制转换即可。
12.抽象类和接口
12.1抽象类
含有抽象函数的类称为抽象类,抽象类必须用abstract修饰。
注意:
(1)抽象类不能被实例化。
(2)抽象函数必须被重写,除非子类也是抽象类。
(3)在抽象类中可以含有普通成员函数。
12.2接口
在抽象类中可以含有普通成员函数,如果一个抽象类中的所有函数都是抽象的,也可以定义为接口。在“继承接口”的情况下一般有另一种说法,叫“实现接口”,子类也称为实现类。
说明:
(1)接口中的方法不需要专门指明abstract,系统默认其为抽象函数,在接口中只能包含常量和函数。
(2)接口中的成员函数默认都是public访问类型,成员变量默认是用public static final标识的,所以接口中定义的变量是全局静态常量。
(3)接口可以通过extends继承另一个接口,类通过关键字implements来实现一个接口。
(4)一个类可以在继承一个父类的同时实现一个或多个接口,多个接口用逗号隔开,格式如下:
class子类extends父类implements接口1,接口2,...,{}
关键字extends必须位于关键字implements之前。
13.其他
13.1关键字final
1.用final修饰一个类
该类不能被继承。
2.用final修饰一个函数
该类在被子类继承的情况下,show函数不能被重写。
3.用final修饰一个成员变量
该成员变量的值不允许被改变,即不允许重写赋值(哪怕是同一个值),因此一般用关键字final来定义一个常量。
注意:
Final成员变量必须在声明时或在构造函数中显示赋值才能使用。一般情况下,在定义时就进行赋值。
13.2 Object类
在Java中定义一个类时,如果没有用extends明确标明直接父类,那么该类默认继承Object类,因此Object类是所有类的父类,或者说Java中的任意一个类都是Object类的子类。
在Object类中,常用toString和equals两个方法。
注意:
“if(name.equals(cus.name))”说明判断两个字符串相等也不能用“==”,而用equals方法。
14.工具的使用
14.1将字节码打包发布
如果开发了一个项目,用户使用的将不是源代码,而是大量的.class文件。但是,大量的class文件不好管理且占据空间,因此,在一般情况下将这些.class文件压缩成一个或若干文件,这个过程称为打包。
在Java中,可以使用jar命令打包,生成的包为.jar文件。.jar文件是一种压缩文件,当在另一个项目中导入这个.jar文件之后,系统能够识别其中的类。
一般使用jar命令进行打包。对于该命令的详细信息,可以直接输入jar命令查看。
14.2文档的使用
在开发的过程中,文档的使用对于程序员来说非常的重要。在网上有大量的Java文档可以下载,最方便的是CHM格式的文档。