1、项目项目3 面向对象编程基础面向对象编程基础主要内容主要内容v3.1 任务描述任务描述v3.2 类和对象类和对象v3.3 继承和多态继承和多态v3.4 接口和包接口和包v3.5 Java异常处理异常处理v3.6 任务实施任务实施能力要求能力要求v理解面向对象编程的基本思想理解面向对象编程的基本思想v掌握类、对象的基本概念,类与对象之间的关系掌握类、对象的基本概念,类与对象之间的关系v能用能用Java语言编写一个类语言编写一个类v能实现对象的生成及对对象的成员方法和成员变能实现对象的生成及对对象的成员方法和成员变量的调用量的调用面向对象程序设计概述面向对象程序设计概述 对象对象 对象的行为(be
2、havior)可以对对象实施的操作,或对象所具有的功能。对象的属性(attribute)对象的外观、性质、属性等。类类 封装性 继承性 多态性面向对象技术的基本概念和特征面向对象技术的基本概念和特征v对象、类和实体对象、类和实体对象对象类类实例化实例化抽象抽象计算机世界计算机世界实体实体抽象数据类型抽象数据类型现实世界现实世界抽象抽象映射映射计算机逻辑的实现计算机逻辑的实现类与对象的概念类与对象的概念对象与类 对象:现实世界中某个具体的物理实体在计算机逻辑中的映射和体现,其基本组成:对象标识 状态(对象的静态属性)行为(对象的操作)(张三,男,吃饭)类:一种抽象的数据类型,是同种对象的集合与抽
3、象。是Java程序的基本组成要素,描述了一类对象的状态和行为,其基本成分包括:成员变量 成员方法(人,性别,吃饭的过程)请大家分析“学生”“孙旭川”类与对象的另一实例类与对象的另一实例v对象是类的实例对象是类的实例类的定义类的定义class 类名称 数据类型 属性名;.;返回值类型 方法名称(参数1,参数2,.)程序语句;.;return 表达式;Java中定义类的通用格式:中定义类的通用格式:Java中定义类的通用格式:中定义类的通用格式:class Student int stuNum;String stuName;char stuSex;int stuAge;void enrol()Sy
4、stem.out.println(“学生”+stuName+”已注册入学”);void selectCourse()System.out.println(“学生”+stuName+”已选课”);String getStuInfo()return“”学号:”+stuNum+”t 姓名:”+stuName+”t 性别:”+stuSex+”t 年龄:”+stuAge;成员变量(对象属性)成员变量(对象属性)成员方法(对象的行成员方法(对象的行为或操作)为或操作)类的成员变量与成员方法类的成员变量与成员方法v成员变量成员变量 1.命名约定 遵循Java标识符的基本规则 遵循命名惯例 2.默认值 未赋值
5、的成员变量将被系统赋予默认值v成员方法基本结构成员方法基本结构type methodName(parameter-list)/方法体 方法返回方法返回类型类型参数列表,参数列表,可选可选方法名方法名对象及对象的使用对象及对象的使用v对象对象 对象是一个动态概念,具有产生、使用和消亡的生命周期 通过new操作符创建对象 对象属性的使用:对象名.属性;对象方法的使用:对象名.方法名();当对象不再使用时,将由系统的垃圾回收机制进行回收。方法的使用方法的使用v 分析下面程序段的输出:public class Func public static double getArea(double l,dou
6、ble w)return l*w;public static void main(String args)double area=getArea(5.0,8.0);System.out.println(“第1个矩形的面积为:”+area);System.out.println(“第1个矩形的面积为:”+getArea(10.0,12.0);getArea(8.0,12.0);v 调试运行例35,观察输出值。方法参数中的值传递与引用传递方法参数中的值传递与引用传递v 分析下面程序段的输出:class Demo public void increase(int x)x=x+5;class Demo
7、Test public static void main(String args)Demo d=new Demo();int x=20;d.increase(x);System.out.println(x=+x);v 调试运行例37,观察输出值当参数为对象时当参数为对象时传递的是引用传递的是引用当参数为基本数当参数为基本数据类型时传递的据类型时传递的是值本身是值本身构造方法构造方法 构造方法是一种特殊的方法,其语法格式如下 类名称()程序语句;语法说明:构造方法的名称必须与类名一致。它没有返回值。由于构造方法主要是给其它类调用的,因此构造方法的访问权限一般都为public。构造方法及其重载构造
8、方法及其重载构造方法所完成的主要工作是帮助新创建的对象赋初值(也称构造函数)。class 类名称 访问权限类名称(类型1 参数1,类型2 参数2,)程序语句;./构造方法没有返回值 在使用构造方法的时候需要注意:它与类具有相同的名称。它没有返回值。由于构造方法主要是给其它类调用的,因此构造方法的访问权限一般都为public。构造方法及其重载构造方法及其重载 在执行javac编译java程序的时候,如果在程序中没有明确声明一构造方法的话,系统会自动为我们的类加入一个无参的且什么都不做的构造方法。public Circle()在Java里,不仅普通方法可以重载,构造方法也可以重载。只要构造方法的参
9、数个数不同,或是类型不同,便可定义多个名称相同的构造方法。注意注意 在Java中,只要申明了一个构造方法(无论有没有参数),则默认的构造方法就不会被生成。因此我们还需要在类中申明一个无参数的构造方法。3.3 继承和多态继承和多态 继承和多态是面向对象程序设计的两个重要的概念。继承和多态是面向对象程序设计的两个重要的概念。一、继承一、继承 继承是由一种现有的类创建新类的机制。继承是由一种现有的类创建新类的机制。先创建一个共先创建一个共有属性的一般类,根据一般类再创建具有共有属性的新类,新有属性的一般类,根据一般类再创建具有共有属性的新类,新类继承了一般类的属性和行为,并根据需要增加它自己的属性类
10、继承了一般类的属性和行为,并根据需要增加它自己的属性和行为。和行为。由继承得到的类称为由继承得到的类称为子类子类,被继承的类称为,被继承的类称为父类父类,也称为,也称为基类或超类基类或超类。类的层次结构类的层次结构v 类继承的语法形式v Java继承的可以采用以下的语法格式:class 父类 /定义父类 class 子类 extends 父类 /用extends关键字实现类的继承例如:class Student extends People /声明学生类Student为人员类People的子类二、多态二、多态 所谓多态,是指一个程序中同名的不同方法共存的所谓多态,是指一个程序中同名的不同方法共
11、存的情况。在面向对象的程序中,多态的情况有多种,可以情况。在面向对象的程序中,多态的情况有多种,可以通过子类对父类方法的覆盖实现多态,也可以利用重载通过子类对父类方法的覆盖实现多态,也可以利用重载在同一个类中定义多个同名的不同方法来实现多态。在同一个类中定义多个同名的不同方法来实现多态。1、方法覆盖、方法覆盖 2、方法重载、方法重载 3、抽象方法和抽象类、抽象方法和抽象类方法的覆盖方法的覆盖v1、方法的覆盖、方法的覆盖v 如果子类中的某个方法与其父类具有相同的名如果子类中的某个方法与其父类具有相同的名称和参数(个数和类型都相同),则称该子类重称和参数(个数和类型都相同),则称该子类重构了该方法
12、(构了该方法(overriding),重构也称为覆盖。),重构也称为覆盖。这样父类定义的方法在子类就这样父类定义的方法在子类就“看不见看不见”了,当了,当子类的这一方法被调用的时候,将直接使用子类子类的这一方法被调用的时候,将直接使用子类定的方法。定的方法。方法覆盖方法覆盖 有关方法重构的规定有关方法重构的规定 子类重构父类方法时,子类方法的返回值类型应当与被子类重构父类方法时,子类方法的返回值类型应当与被重构的方法的类型相同;重构的方法的类型相同;子类不能重构父类的子类不能重构父类的final 和和private 方法;方法;子类不能用实例方法重构父类的子类不能用实例方法重构父类的stati
13、c 方法。子类的方法。子类的static 方法可重构父类的方法可重构父类的static方法,但不能重构父类方法,但不能重构父类的实例方法;的实例方法;子类方法重构父类方法时,子类方法的访问权限修饰符子类方法重构父类方法时,子类方法的访问权限修饰符不能严于父类方法的访问修饰符;不能严于父类方法的访问修饰符;子类若要引用父类中被重构的方法,应使用子类若要引用父类中被重构的方法,应使用“super.方方法名法名”的方式的方式;方法重载方法重载2、方法重载、方法重载 如果在同一个类中定义了多个同名的方法,它如果在同一个类中定义了多个同名的方法,它们或有不同的形参个数或有不同的形参类型,则称们或有不同的
14、形参个数或有不同的形参类型,则称该方法为被重载(该方法为被重载(Overloading)。在调用时,)。在调用时,Java 将根据实参个数或实参类型选择匹配的方法。将根据实参个数或实参类型选择匹配的方法。v 成员方法的重载成员方法的重载v 构造方法的重载构造方法的重载多态多态v方法的动态调用方法的动态调用 类Dog和类Cat都继承了Anima。Animal有一bark方法。多态多态 Animal.java1 public class Animal 2 public void bark()3 Dog.java1 public class Dog extends Animal2 public vo
15、id bark()3 System.out.println(汪汪);4 5 多态多态Cat.java1 public class Cat extends Animal2 public void bark()3 System.out.println(喵喵);4 TestAnimal.java1 public class TestAnimal 2 public static void main(String args)3 4 Animal animal=new Dog();5 animal.bark();6 animal=new Cat();7 animal.bark();8 9 多态多态 输出结
16、果 汪汪喵喵 在Anima.java中的第2行,定义了一个空的bark函数。Dog和Cat都是从Anima中派生出来的。在Dog.java和Cat.java中的第3行分别覆盖了bark函数。然后在TestAnimal.java中进行测试,我们在TestAnimal的第4行定义了一个Animal类型的对象,首先我们赋给它一个Dog类型的对象,然后调用其bark进行测试。然后在第6行又赋给它一个Cat类型的对象,并调用bark进行测试。从输出的结果可以看到,在不同的时候animal对象调用bark所产生的结果是不同的。多态多态 输出结果 汪汪喵喵 在Anima.java中的第2行,定义了一个空的b
17、ark函数。Dog和Cat都是从Anima中派生出来的。在Dog.java和Cat.java中的第3行分别覆盖了bark函数。然后在TestAnimal.java中进行测试,我们在TestAnimal的第4行定义了一个Animal类型的对象,首先我们赋给它一个Dog类型的对象,然后调用其bark进行测试。然后在第6行又赋给它一个Cat类型的对象,并调用bark进行测试。从输出的结果可以看到,在不同的时候animal对象调用bark所产生的结果是不同的。抽象类和抽象方法抽象类和抽象方法3、抽象类和抽象方法、抽象类和抽象方法 在Java自上而下的类的继承结构层次中,位于上层的类应是更加具有通用性和
18、更加的抽象,有时由于对象高级抽象的需要,我们需要类只是申明方法的首部,而不需要说明其方法的主体,其主体部分由子类来完成。在Java中,使用abstract关键字可以实现这个功能。需要注意的是,由于抽象类的抽象性,因此其不能创建任何的对象,抽象类只是用来被其子类继承。抽象类和抽象方法抽象类和抽象方法 抽象类的定义规则:抽象类的定义规则:抽象类和抽象方法必须由抽象类和抽象方法必须由abstract关键字来修饰。关键字来修饰。抽象类不能实例化,也就是不能用抽象类不能实例化,也就是不能用new关键字去产生对象。关键字去产生对象。抽象的方法主需要申明,不需要具体的实现。抽象的方法主需要申明,不需要具体的
19、实现。含抽象方法的类必须申明为抽象类,抽象类的子类必须覆盖实现父含抽象方法的类必须申明为抽象类,抽象类的子类必须覆盖实现父类的所有抽象方法后才能被实例化,否则这个子类还是抽象类。类的所有抽象方法后才能被实例化,否则这个子类还是抽象类。抽象类中除了抽象方法外,也可包含具体的数据和具体的方法。抽象类中除了抽象方法外,也可包含具体的数据和具体的方法。抽象类和抽象方法抽象类和抽象方法抽象类的定义格式如下:抽象类的定义格式如下:abstract class 类名称 /定义抽象类 申明数据成员;访问权限 返回值数据类型 方法名称(参数.)/普通的方法 .访问权限 abstract 返回值数据类型 方法名称
20、(参数.);/抽象方法例如:把Animal类申明为abstract,然后把bark申明为抽象的方法。public abstract class Animal public abstract void bark();3.4 接口和包接口和包一、接口一、接口 与与C+不同的是,不同的是,Java不支持多重继承。不支持多重继承。v 接口中可以实现接口中可以实现“多重继承多重继承”,且一个类可以实现多个接口,且一个类可以实现多个接口,这些机制使接口提供了比多重继承更简单、更灵活、更,这些机制使接口提供了比多重继承更简单、更灵活、更强大的功能。强大的功能。v 1、接口的定义、接口的定义v 接口在语法上与
21、抽象类非常相似,它定义了一些抽象方接口在语法上与抽象类非常相似,它定义了一些抽象方法和常量,形成一个属性集合。该属性集合通常对应于某法和常量,形成一个属性集合。该属性集合通常对应于某一组功能。一组功能。接口的定义接口的定义2 2、定义接口的一般语法格式如下:定义接口的一般语法格式如下:vpublic interface 接口名 extends 父接口名列表v public static final 数据类型 常量标识符=常量值;v public abstract 返回值类型 方法名(参数);v说明:说明:在接口中只提供方法的定义但不提供其具体实现,接口提供了方法原型的封装机制。接口的实现接口的
22、实现3、接口的实现、接口的实现 接口定义的仅仅是实现某一特定功能的对外接口和规范接口定义的仅仅是实现某一特定功能的对外接口和规范,并没有真正实现这个功能。这个功能的真正实现是在,并没有真正实现这个功能。这个功能的真正实现是在“继承继承”这个接口的各个类中完成的,要在这些类中具体定义接口中这个接口的各个类中完成的,要在这些类中具体定义接口中各抽象方法的方法体。各抽象方法的方法体。v 定义好一个接口之后,一个或多个类可以实现这个接口。定义好一个接口之后,一个或多个类可以实现这个接口。要实现一个接口必须在类的定义中包含一个要实现一个接口必须在类的定义中包含一个implementsimplements
23、子句。子句。包含包含implements关键字的一般语法格式如下:关键字的一般语法格式如下:v修饰符 class extends 父类名 implements接口明列表v /类体v说明:说明:一个类也可以实现多个接口。一个类也可以实现多个接口。如果一个类要实现多个接口,如果一个类要实现多个接口,那么接口之间要用那么接口之间要用逗号逗号隔开。隔开。二、二、Java中的包中的包v 为了更好地组织类,为了更好地组织类,Java提供了包机制提供了包机制。包。包是类的容器,用于分隔类名空间。如果没有指定是类的容器,用于分隔类名空间。如果没有指定包名,所有的示例都属于一个默认的无名包。包名,所有的示例都属
24、于一个默认的无名包。Java程序编译的类被放在包内,要访问类就要给程序编译的类被放在包内,要访问类就要给出类所属的包名,来指明类是在哪一个包中,以出类所属的包名,来指明类是在哪一个包中,以便能够找到该类。便能够找到该类。1、包的定义、包的定义 可以使用package语句指明源文件中的类属于哪个具体的包。其一般的语法格式为:package包名;例如:package jyvtc;2包的使用包的使用v 包是类的集合,将类组织成包是为了更好地利用包中的类。同一个包中的类相互访问不用指定包名;如果要引用其他包中的公共类,则需要指出包名。因此在程序中首先需要用import语句将该类所在的包导入。v导入包的
25、一般语法格式如下:import 包名;3、包的、包的访问权限访问权限 包除了提供类和接口的机制外,还提供了包一级包除了提供类和接口的机制外,还提供了包一级的访问控制机制。包一级的访问控制机制包含两个方的访问控制机制。包一级的访问控制机制包含两个方面,一是对于包中类和接口的访问控制,二是对于类面,一是对于包中类和接口的访问控制,二是对于类成员的访问控制。成员的访问控制。v Java语言中的访问权限有语言中的访问权限有public、protected、默认的包访问权限和默认的包访问权限和private。4种访问控制符的权限见表种访问控制符的权限见表3-1所示。所示。访问控制符访问控制符同一类同一类
26、同一包同一包不同包中的子类不同包中的子类不同包中的不同包中的非子类非子类private是否否否否无访问控制无访问控制符符是是否否否protected是是是否否public是是是是是是是是表表3-1 访问控制符的权限访问控制符的权限Java中的中的APIv 所谓应用程序接口API(Application Program Interface)实际上就是一些已经写定义好的、可供用户直接调用的类库。Java API也是采用包的形式组织起来的,功能相关的类和接口放在同一个包中,程序设计人员可以方便地查找与使用。最常用的是最常用的是Java核心包和核心包和Java扩展包扩展包。3.5 Java异常处理异常
27、处理1、异常的基本概念异常的基本概念v 异常(Exception)指的是程序执行过程中出现的非正常情况。在Java程序的执行过程中,任何中断正常程序流程的情况都是错误或异常。异常经常出现在以下情况:v打开的文件不存在v除数为零v数组下标越界v网络连接突然中断v内存空间不够2、异常处理机制、异常处理机制 在Java语言中,所有的异常都是用类来表示的。当程序发生异常时,会生成某个异常类对象,异常对象一旦产生,系统中就一定有相应的机制来处理,确保用户程序在执行期间不会死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。3、Java中的异常中的异常类类 Java中的每个异常都是Thro
28、wable类及其子类的实例对象。Throwable类是Java.lang包中一个专门用来处理异常的类,它有两个标准的子类:Error和Exception类,即错误和异常子类。异常类的层次异常类的层次v Java 的异常类是处理运行错误的特殊类,每一个异常类都对应一种特定的运行错误。所有的Java 异常类都是系统类库中的Exception 类的子类。其类的层次结构如图所示。v Throwable 类是类库java.1ang 包中的一个类,它派生了两个子类:Exception和Error。其中Error 类由系统保留,而Exception类则供应用程序使用。异常类的层次异常类的层次v Error类
29、 例如,动态链接错误、虚拟机错误等,由Java虚拟机生成并抛弃。通常,Java 程序不对这类异常进行处理。在Java 编程语言中,错误(Error)类定义被认为是不能恢复的严重错误。在大多数情况下,当遇到这样的错误时,建议让程序中断。v Exception类 一般性程序故障,一般由用户代码或类库生成并抛出,Java 程序需要对它们进行处理。同其他的类一样,Exception 类有自己的方法和属性v Exception类构造方法有两个public Exception();public Exception(String s);4、异常的处理异常的处理 (1)异常的捕获与处理异常的捕获与处理 Jav
30、a语言提供了try-catch-finally语句来捕获一个或多个异常,并进行处理。异常的处理异常的处理Java异常处理的格式语法如下:异常处理的格式语法如下:try /try 语句块 要检查的程序语句;.catch(异常类 对象名称)/catch语句块 异常发生的处理语句;finally /finally语句块 一定会运行到的代码;格式说明:格式说明:vtry语句块中若是有异常发生,则程序运行中断,并抛出异常类产生的对象。v抛出的对象如果属于catch()括号内欲捕获的异常类,则catch会捕捉此异常,然后进到catch的块里继续运行。vfinally语句块一般是用来处理一些资源释放之类的事
31、情,无论是否发生异常都会执行finally语句块里面的内容,如果你没有这样的需求,finally语句块也可以没有。异常的抛出异常的抛出 异常的抛出通常有两种方式:一是在程序中抛出异常,二是指定方法抛出异常。1、在程序中抛出异常 throw 异常类实例对象;throw后抛出的是一个异常类的实例对象2、指定方法抛出异常 方法名称(参数.)throws 异常类1,异常类2,.如果方法内的程序代码可能会发生异常,且方法内又没有使用任何的代码块来捕捉这些异常时,则必须在声明方法时一并指明所有可能发生的异常,以便让调用此方法的程序得以做好准备来捕捉异常。自定义异常自定义异常v Java 类库中定义的异常主要用来处理系统可以预见的、比较常见的运行错误。如果某个应用程序有特殊的要求,则可能出现系统不能识别的运行错误,这时,用户就需要自己创建异常和异常类,使系统能够识别这种错误并进行处理,以增强用户程序的健壮性和容错性,从而使系统更加稳定。v 用户自定义的异常类必须是Throwable 类的直接或间接子类v 定义自己的异常类的格式语法如下class 异常名称 extends Exception .