面向对象的核心特性1.ppt_第1页
面向对象的核心特性1.ppt_第2页
面向对象的核心特性1.ppt_第3页
面向对象的核心特性1.ppt_第4页
面向对象的核心特性1.ppt_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 面向对象技术,3.1 类和对象 3.2 类的创建 3.3 对象的创建 3.4 类的封装 3.5 类的继承 3.6 类的多态性 3.7 递归方法,3.1 类和对象,3.1.1 面向对象基本概念 3.1.2 定义类 3.1.3 使用对象,编程语言的几个发展阶段,程序设计语言的发展 面向机器 - 面向过程 -面向对象 面向机器(机器语言、汇编语言) 程序 = 数据 + 指令 设计者要考虑:硬件特性、数据安排位置、I/O设备的调用 适应:一般科学计算;简单控制处理 缺陷:可读性、维护性、移植性差;编程效率低,编程语言的几个发展阶段 (续),面向过程(Fortran、Pascal、C、COBOL、Ada) 程序 = 数据结构 + 算法 设计者要考虑:做什么、怎么做、每个过程细节 结构化、模块化设计 适应:复杂的科学计算;简单应用程序开发 缺陷:不适用于GUI界面、事件驱动编程; 对于规模较大的应用程序,难以维护,编程语言的几个发展阶段 (续),面向对象(Smalltalk、C+ 、Java ) Object Oriented Programming (OOP) 全新的程序设计思想:计算机现实世界 程序 = 对象 + 消息 设计者主要考虑:对象的描述、对象间的关系、类的管理、何时用何方法调动对象,在设计上强调两点: 1. 尽可能地重用软件的成分 2. 维持不同成分的独立性。 适应:大规模应用程序的解决方案、网络计算等,面向对象基本概念,类与对象 对象(object)是类似于现实世界的实体,具有属性、状态和行为特征 类(class)是对同一类对象的抽象,既包括数据(对应属性和状态)又包括作用于数据的一组操作(对应行为)的封装体。 实际是面向类的编程。 对象是类的实例(instance),动态存在(创建、运行、消亡)。 以人类为例 (P50),对象间联系,对象间联系 对象通过相互发送消息来激发动作 什么是消息(Message) 消息 : 进行对象(实体)间的联系的方法 调用一次对象的方法(函数),称为向该对象发送一个消息 程序设计中: 消息是实现对象功能的主要手段 发送一个消息要考虑三方面内容: 接收的对象、使用的方法和所需参数,类的封装性、继承性和多态性,封装 数据及相应的操作都被封装在对象内,对外通过一个接口与程序的其他部分交互信息(“黑匣子”)。类的内部细节被隐藏。 继承 在已有类的基础上,通过扩充或改写其某些属性及方法,生成新的类,可重复使用代码。 多态 用相同的名字定义、调用不同的方法。,3.2 类的创建,类定义格式 类声明 成员变量的声明; 成员方法的声明及实现; 声明类 修饰符 class 类 extends 超类 implements 接口列表 声明成员变量 修饰符 static final 数据类型 变量名;,3.2 类的创建,声明成员方法 方法声明语法 修饰符 返回值类型 方法(参数列表) throws 异常类 语句序列; return 返回值; 声明main方法 public static void main(String args),类的定义要点(后面有详细说明),类中定义的变量和方法都是类的成员 成员的访问权限有四种: private、protected、public 和 缺省 Java中的每个类有唯一的超类 缺省时:系统默认超类 Object,定义类的例子,【例3.1】 声明日期类。 自己定义学生类,至少3个属性,get和set方法,3.3 对象的创建,声明对象 类 对象 对象实例化 对象 = new 类的构造方法(参数列表) 例:Date1 aday=new Date1(); 引用对象的成员变量和调用对象方法 对象.成员变量 对象.成员方法(参数列表) 例:aday.year = 2006; /引用对象的成员变量 aday.setDate(2006,1,28); /调用对象的方法,3.3 对象的创建,对象的引用模型,3.3 对象的创建,方法调用时的参数传递原则 基本数据类型参数传递值; 引用数据类型参数传递引用。 对象初始化 对象创建时,其成员变量被初始化 表3.1 Java各类型变量的初值,3.3 对象的创建,构造方法 是一种特殊方法,该方法名字与它的类名相同 用途是创建类的对象时,给对象进行初始化(属性赋值) 是公共方法,在其对象被创建时自动地被执行 定义构造方法要点 : 构造方法的名字应该与该类的名字完全相同 构造方法总是由关键字new调用,不能显式调用 构造方法可以有多个,有不同的参数(重载) 构造方法没有返回值,定义时不用说明数据类型 【例3.2】 使用构造方法为日期赋初值 如果定义类时未定义构造方法,系统会默认一个没有参数的构造函数。,3.3 对象的创建,析构方法 作用与构造方法相反 只能有一个,没有参数,没有返回值 public void finalize() /析构方法 语句序列; /释放资源:文件等 释放对象 Java语言具有资源回收机制,能够跟踪存储单元的使用情况,自动收回不再被使用的资源。,3.4 类的封装,3.4.1 封装的概念 3.4.2 如何封装 3.4.3 实例成员与类成员,封装的概念,将数据和对数据的操作(方法)组合起来构成类。 既提供与外部联系的方法,又尽可能隐藏类的实现细节。 一种模块化的设计机制。 (类似工业生产),类及其成员的访问权限,类中成员的访问权限(当被其它类的对象访问) 类的访问权限:产生对象,调用类成员时。 public class Date1 /公有的类 class Date1_ex /默认的类, 同一包,类访问权限和成员访问权限关系,能访问类,但不一定能访问成员 不能访问类,肯定不能访问成员 类比 进入不了景区,肯定什么都看不成 进了景区,可能还要买门票,【例3.3】 日期类的封装。,设计并重载构造方法 成员变量设计为私有的访问权限,限制其他类对成员变量的访问 成员方法设计为公有的访问权限,提供给其他类使用 运行包含main()方法的类,3.4.3 实例成员与类成员,实例成员变量与类成员变量 实例成员变量属于实例(私有属性) 类成员变量属于类(共有属性) 两者声明时的差别 public class Person1 String name; /姓名,实例成员变量 static int count; /人数,类成员变量 ,两者存储结构的差别,实例变量 同类不同对象的实例变量将被分配不同的内存空间 改变该类某一个对象的实例变量值不影响其他对象的状态 类变量 同类不同对象的类变量都分配给相同的一处内存 改变其中一个对象的这个类变量会影响其他对象的这个类变量 存储位置的不同:图3.2(P62),两者引用方式的差别,实例成员变量必须通过对象访问 类成员变量既可以通过对象访问,也可以通过类访问 ; p1.count; Person1.count; P;,实例成员方法与类成员方法,两者声明时的差别 public static int howMany() /类成员方法 return count; /类成员方法只能访问类成员变量 public String getName() /实例成员方法 return public static void main(String args) /main方法也是类成员方法,两者方法体中语句的差别,实例方法可以访问当前对象的实例变量或类变量 类方法不能够访问实例变量(只能访问类变量) 在类方法中不能够使用this 和super,两者调用方式的差别,实例方法必须由实例对象调用 类方法除了可以由实例对象调用之外,还可以由类名直接调用 Person1.howMany(); /通过类名调用类成员方法 Person1.getName(); /错误 p1.howMany(); /通过对象名调用类成员方法 p1.getName(); 【例3.4】实例成员与类成员,3.5 类的继承,3.5.1 创建子类 3.5.2 this引用、super引用和instanceof运算符 3.5.3 最终类和抽象类,什么是继承,继承的概念 由一个已有的类定义一个新类,称为新类继承已有的类。 继承的作用:可扩展、可重用性,类的继承性,继承原则,子类继承父类的成员变量,包括实例成员变量和类成员变量 子类继承父类除构造方法以外的成员方法,包括实例成员方法和类成员方法 子类不能继承父类的构造方法。因为父类构造方法创建的是父类对象,子类必须声明自己的构造方法,创建子类自己的对象 子类能够继承父类的析构方法 子类不能删除父类成员 子类可以增加自己的成员变量和成员方法 子类可以重定义父类成员,3.5.1 创建子类,声明继承的类 修饰符 class 类 extends 父类 implements 接口列表 public class Student1 extends Person1 String speciality; /专业,增加的属性 Java不支持多重继承,但支持多接口的实现,3.5.1 创建子类,Java中的类都是Object的子类 类的赋值相容性 子类对象即是父类对象。 子类对象可以给父类对象赋值。 子类对象对父类成员的访问权限 子类对父类的私有成员(private)没有访问权限;(拥有但不能使用) 子类对父类的公有成员(public)和保护成员(protected)具有访问权限 子类对父类中缺省权限成员的访问分两种情况,对同一包中父类的缺省权限成员具有访问权限,而对不同包中父类的缺省权限成员则没有访问权限,3.5.1 创建子类,子类重定义从父类继承来的成员 子类隐藏父类成员变量(同名变量) 子类覆盖父类成员方法(同名同参方法) 子类继承并重载父类成员方法(同名,不同参方法) 【例3.5】 子类继承超类的成员变量 【例3.6】 子类继承超类的成员方法,3.5.2 this引用、super引用和instanceof对象运算符,this引用 指代对象本身 this 访问本类的成员变量和成员方法 this.成员变量 this.成员方法(参数列表) 调用本类重载的构造方法 this(参数列表) instanceof对象运算符,返回值:boolean aday instanceof Date2,3.5.2 this引用、super引用和instanceof对象运算符,super引用 调用父类的构造方法(不能继承,但可以调用) super(参数列表) 引用父类同名成员 子类隐藏父类成员变量 super.成员变量 子类覆盖父类成员方法 super.成员方法(参数列表) 【例3.7】 this和super引用,创建多层继承例子,创建一个交通工具的类( Vehicle ) 和一个小汽车的子类( Car ) class Vehicle public void start() System.out.println(“ Starting .“); class Car extends Vehicle public void drive() System.out.println(“ Driving .“); ,创建多层继承例子(续一),添加一个飞行器的子类( Aircraft ) class Aircraft extends Vehicle public void fly() System.out.println(“ Flying .“); ,创建多层继承例子(续二),从飞行器( Aircraft )中再派生两个子类, 螺旋直升机( Whirlybird )和喷气机( Jet ) class Whirlybird extends Aircraft public void whirl() System.out.println(“ Whirling .“); class Jet extends Aircraft public void zoom() System.out.println(“ Zooming .“); ,创建多层继承例子(续三),类层次结构 Vehicle Car Aircraft Whirlybird Jet,创建多层继承例子(续四),实例化这些类 class App public static void main(String args) System.out.println(“Creating a car.“); Car c=new Car(); c.start(); c.drive(); System.out.println(); System.out.println(“Creating a jet.“); Jet j=new Jet(); j.start(); j.fly(); j.zoom(); ,创建多层继承例子(续五),运行结果 Creating a car. Starting . Driving . Creating a jet. Starting . Flying . Zooming .,super的使用方法举例一,class Student int number; String name; Student(int number,String name) this.number=number; =name; System.out.println(“I am “+name+“my number is “+number); ,super的使用方法举例一(续一),class Univer_Student extends Student boolean 婚否; Univer_Student(int number, String name,boolean b) super(number,name);/调用什么? 婚否=b; System.out.println(“婚否=“+婚否); ,super的使用方法举例一(续二),public class Example4_9 public static void main(String args) Univer_Student zhang=new Univer_Student(9901,“和晓林“,false); ,super的使用方法举例二,class Sum int n; float f() float sum=0; for(int i=1;i=n;i+) sum=sum+i; return sum; ,super的使用方法举例二(续一),class Average extends Sum int n; float f( ) float c; super.n=n; /引用谁的?修改权限 c=super.f( ); return c/n; float g( ) float c; c=super.f( ); return c/2; ,super的使用方法举例二(续二),public class Example4_10 public static void main(String args) Average aver=new Average( ); aver.n=100; float result_1=aver.f( ); float result_2=aver.g( ); System.out.println(“result_1=“+result_1); System.out.println(“result_2=“+result_2); ,3.5.3 最终类和抽象类,声明最终类 public final class Math extends Object /数学类,最终类,不能继承 声明最终方法 public class Circle1 extends Graphics1 public final double area() /最终方法,不能被子类覆盖 return Math.PI*this.radius*this.radius; ,final例子,class XYZ final double PI = 3.1415926; class Demo public static void main(String Str ) XYZ a = new XYZ( ); PI = 2.718; /错误:不能更改final变量 ,final例子-2,class ABC final void methed( ) /原有的程序代码 class XYZ extend ABC void method( ) /错误:不能覆盖final方法 /新的程序代码 ,3.5.3 最终类和抽象类,抽象类 声明抽象类与抽象方法 public abstract class PlaneGraphics1 /平面图形类,抽象类 public abstract double area(); /计算面积,抽象方法,分号“;“必不可少 抽象类与抽象方法的作用:描述共有的抽象概念,abstract类和abstract方法,要点: 程序中不能直接把abstract类进行实例化(创建对象) 对于abstract方法,只允许声明,而不允许实现 如果一个类是一个abstract类的子类,它必须具体 实现父类的abstract方法 含有abstract方法的类必须是abstract类 abstract类可以定义非abstract方法 abstract方法不能使用修饰词 private 或者 final 注意:构造方法、静态方法和私有方法不能作为abstract方法定义。,3.6 类的多态性,3.6.1 方法的重载 3.6.2 方法的覆盖,什么是多态,一个名字有多种语义 主要实现途径 方法的重载 重载(overload)是指同一个类中的多个方法可以同名但参数列表必须不同。 方法的覆盖 覆盖(override)是指子类声明并实现父类中的同名方法并且参数列表也完全相同。,3.6.1 方法的重载,重载的含义 Math.abs()方法声明有4种(P70) 成员方法重载 同名,参数不同(个数,类型,次序不同) 返回值可以相同或不同 构造方法重载 Date2 aday1 = new Date2(); Date2 aday2 = new Date2(2006,2,28); 【例3.9】 构造方法的重载,3.6.2 方法的覆盖,覆盖使子类能改变父类行为 覆盖是实现运行时多态性的关键 【例3.10】 方法的覆盖,运行时多态性,编译时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论