第六章 JAVA语言中的面向对象特性 6.1 类 6.2 对象 6.3 面向对象的特性 6.4 抽象类、接口和Inner Class
6.1 类
6.1.1 类的创建
6.1.2 成员变量 举例:public static int num ; [修饰符] [static][final] 变量类型 变量名 ; 修饰符:public, protected, private表示访问控制。 static : 表示变量是静态变量。可以有类直接调用,并被所有的 类的实例共享。 final : 表示变量是一个常量。在程序中不能被修改。 transient、volatile : 用的很少,了解其用途。 举例:public static int num ;
6.1.3 成员方法 举例:public static void IncrNum() [修饰符] [static][final | abstract] [native] 返回类型 方法名(参数列表) throws 异常列表 ; 修饰符:public, protected, private表示访问控制。 static : 表示该方法是静态方法。可以有类直接调用。 final : 表示该方法不能被重载。 abstract : 表示该方法。 native : 表示该方法由其他程序语言完成。如C++ 举例:public static void IncrNum() { num++ ; }
类的举例: public class Car{ public String color; //成员变量 public int speed; public static int saleNum ; //静态变量 public Car(){ //构造方法 color=“Red”; speed=100; } public void turnLeft(){ //成员方法 …… public void turnRight(){ public static void incrSaleNum(){ //静态方法 saleNum++ ;
6.1.4 方法重载 概念:多个方法具有相同的方法名,但参数表不同。 如: public void turnLeft(float angle){ …… } public void turnLeft(float angle, int speed){
6.1.5 构造方法 是一个特殊的方法,每个类都有 用来实例化该类,生成一个对象 构造方法和类同名,且无返回值 构造方法可以不显式写出,有JAVA系统提供缺省的构造方法 构造方法也可以显式写出,并可以被重载。 构造方法只能由new操作符调用,不能有类、对象调用 构造方法举例Point.java
构造函数的多态
6.2 对象 6.2.1 对象的生成 对象是类的实例,其生命周期为:生成、使用和清除 格式: Type objectName = new Type(参数表); 说明: 1) Type objectName 声明了一个类型为Type的对象,但并没有 分配内存空间 2)new操作符为objectName 分配内存空间,并返回该对象的一个 引用。 3)调用构造方法Type(参数表),进行初始化。
6.2.2 对象的使用 6.2.2 对象的清除 格式: 对象名. 变量; 对象名. 方法; 举例 见PointUsing.java 对象名. 变量; 对象名. 方法; 举例 见PointUsing.java 6.2.2 对象的清除 JAVA的垃圾回收机制负责对象的清除。
6.3 包 在编程中,包可以分为两个部分:JAVA系统包、程序 员编制的包。 在JAVA中,包的概念和其他编程语言中的函数库的概 念是相同的,也可以称为类库。如: java.io.*; java.util.*; com.mypackage.db.*; 包是类和接口的集合,通常将功能相似的类放在一个 包里,如同把mp3文件放到一个music目录下。这样 使得程序功能清楚,结构分明。 包是一种松散的类的集合(没有明确的命名、存放规 则)。但是为了统一、一般采用约定俗成的规则。
6.3.1 创建包 创建包的格式: package 包名.子包名; 该语句必须放在.java文件的第一个非注释行。 创建包就是在当前文件夹下创建一个子文件夹。如: package MyPackage; package MyPackage.SubPackage;
6.2.2 程序包的引用(import语句) 通常一个类只能引用与它在同一个包中的类。如果要使用其他包中的public类,则可以使用以下4种方法: 使用包名、类名前缀 java.util.Date d = new java.util.Date(); 加载需要使用的类 import java.util.Date; Date d = new Date(); 加载整个包 import java.util.*; Vector v = new Vector();
CLASSPATH类似于DOS中的PATH,从形式上看就是一系列的目录。它指明了所有类的默认存放的根路径。 在程序需要装载某个类时,JDK就到系统中搜索这个类。 . G:\2000java\src … Cs2000.hfut.ch6 JDK
6.4 面向对象的特性 封装性 继承性 多态性 其他特性
6.4.1 封装性 JAVA中对象就是一组变量和方法的封装。 封装实现了使用者和设计者的分离。提高了程序的重用性。 通过封装,实现了模块化和信息隐藏。 JAVA中的访问控制修饰符(P54 Example) public, protected, package, private 修饰符 类 包 子类 所有类和包 private √ package protected public
格式: [修饰符] class 类名 extends 父类 { 6.2. 继承性 1. 创建子类 格式: [修饰符] class 类名 extends 父类 { 类体; } 如: public class MyApplet extends java.applet.Applet public class MyApplication extends Frame public class MyApp1 注意:在父类的构建器中,Java会自动插入对子类构建器的调用。 见Cartoon.java
class A{ int a1=1; public int a2=2; protected int a3=3; private int a4=4; int geta4() {return a4;} } class B extends A{ int b=5; int sum() { return a1+a2+a3+geta4()+b; } public class ClassInheritance{ public static void main(String[] a){ A aa = new A(); System.out.println(“A:”+aa.a1+”\t”+aa.a2+”\t”+aa.a3+”\t”+aa.geta4()); B bb = new B(); System.out.println(“B:”+bb.a1+”\t”+bb.a2+”\t”+bb.a3+”\t”+aa.geta4()+ ”\t”+bb.sum());
2. 成员变量的隐藏和方法的重写 Class Point { int x,y; void setPoint(int a,int b){ 2. 成员变量的隐藏和方法的重写 Class Point { int x,y; void setPoint(int a,int b){ x=a;y=b; } Class Point3D extends Point { int x,y,z; //父类的变量被隐藏 void setPoint(int a,int b,int c){ //父类的方法被重写 x=a;y=b;z=c;
3. super 在子类中需要调用父类的同名方法或使用父类的同名 变量时,使用关键字super来指明当前调用的是父类的成员 变量或方法。 见教材Chess.java示例
6.3 多态性 1. 编译时多态 运行时多态 表现为方法名相同,而参数表不同。 6.3 多态性 1. 编译时多态 表现为方法名相同,而参数表不同。 典型:System.out.println();它底参数有很多种。 运行时多态 取得一个对象句柄,并将其作为父类型句柄使用的行为就叫作“上溯造型” 1) Music.java 2) Music2.java 3) Shapes.java
Shapes.java中类的结构图
3. 对象状态的判断 由于子类对象可以作为父亲类对象使用。那么我们有时需要判断这个对象究竟属于哪个类。JAVA提供instanceof关键字。 见InstanceofTest.java
4. final关键字 5. static关键字 修饰变量 修饰方法 修饰类 用static修饰的变量、方法称为类变量、类方法 类变量只有一个副本。所有的对象共享。 类方法只能使用类变量 类方法可以被类调用,也可以被对象调用 Emaple P63
4. java.lang.Object类 是JAVA中所有类的父类(间接父类)。其中定义了所有对象基本的状态和方法。 equals() final getClass() toString() finalize() notify(),notifyAll()和wait()
6.5 抽象类和接口 6.5.1 抽象类 使用abstract修饰的类叫做抽象类 使用abstract修饰的方法叫做抽象方法 6.5 抽象类和接口 6.5.1 抽象类 使用abstract修饰的类叫做抽象类 使用abstract修饰的方法叫做抽象方法 抽象类的意图是为从它派生出去的所有类都创建一个通用接口。 从而实现运行时多态。 抽象类不一定要包含抽象方法。 如果一个类中包含了一个以上的abstract方法,那么这个类必须 是abstract。 abstract类不能被实例化,只能作为父类来派生子类。 由抽象类派生的非抽象子类必须实现父类中的所有抽象方法。 抽象类、抽象方法的表现形式。 举例:Music4.java
6.5.2 接口 1. 关于接口的几个问题 是一个更“纯”的抽象类。(不能含有非abstact方法,变量) 接口这样描述自己:“对于实现我的所有类,看起来都应该象我现在 这个样子”。 接口只包含常量和方法的定义,没有变量和方法的实现。 接口可以实现多重继承的功能。 若使用接口,我们可以同时获得抽象类以及接口的好处。
2. 接口的定义 3. 接口的实现 使用implements关键字 举例InterfaceTest.java 接口声明格式: [public] interface 接口名 extends 接口列表{ … } 接口体 接口体包含常量和方法的定义 接口举例 InterfaceDmo.java 3. 接口的实现 使用implements关键字 举例InterfaceTest.java
6.5 Inner Class 内部类:一个类内部嵌套另一个类的定义。 Inner Class 可以使用包含它的类(外层)的静态和成员变量。 Inner Class可以定义为abstract,private或protected。 Inner Class若被声明为static,就不能使用成员变量。 Inner Class不是static,就不能拥有static变量。 Inner Class可以节省编译后字节码文件的大小,但使用Inner Class造成程序结构不清楚。