JAVA面向对象编程.ppt_第1页
JAVA面向对象编程.ppt_第2页
JAVA面向对象编程.ppt_第3页
JAVA面向对象编程.ppt_第4页
JAVA面向对象编程.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第三章,面向对象的概念和 Java 实现-2,2,回顾,类是具有相同属性和行为的一组对象的集合 ,对象是类的实例 封装是隐藏对象实现细节的过程,以便不让用户看到实现的细节 类可用Class来定义,类的变量和方法可被该类的实例访问,圆点符号用于访问对象的成员,构造函数在创建对象时初始化对象 包可用package来申明 ,可用import 来导入包,3,目标,掌握对象 掌握类 理解抽象和封装 理解对象与类之间的关系 掌握包的创建和导入 理解继承及其特点 运用JAVA程序实现继承 理解多态及其特点设计 运用JAVA程序实现多态 掌握访问修饰符和方法修饰符,4,继承,父 类,子类,5,继承的特点,6,继承的优点,7,演示:示例 1,编写一个父类 使用 extends 关键字,编写子类,class Vehicles /*存储交通工具的名称. */ protected String name = “Honda Civic“; /* 存储颜色信息.*/ protected String color = “Red“; /* 存储座位信息. */ protected int seats = 5; /* 构造方法.*/ Vehicles() /* *显示父类汽车的详细信息 */ void showDetail() System.out.println(“从父类 Vehicles 中输出的信息“); System.out.println(“名称 - “ + name); System.out.println(“颜色 - “ + color ); ,8,class Car extends Vehicles /*构造方法. */ Car() /* 显示子类 Car 的信息. */ void show() System.out.println(“从子类 Car 中输出的信息 “); System.out.println(“交通工具的名称 - “ + name); System.out.println(“交通工具的颜色 - “ + color); System.out.println(“座位的数量 - “ + seats); System.out.println(“=“); ,public class CarTest /* *构造方法 */ CarTest() /* * 这是 main 方法 * param args 传递至 main 方法的参数 */ public static void main(String args) /* 声明一个对象*/ Car vehicle = new Car(); vehicle.show(); vehicle.showDetail(); ,9,子类构造方法 2-1,要调用父类构造方法,使用关键字 super,10,子类构造方法 2-2,调用父类构造方法的语法为: super() 或 super(参数列表) ; super () 方法始终指向调用类的父类,11,调用父类构造方法,演示:示例 3,关键字 super 的用法,class FictionAuthor extends Author /* 存储作者的小说类型.*/ String storytype; /* 子类构造方法. param name 传递至构造方法的参数 param type 传递至构造方法的参数*/ FictionAuthor(String name, String type) super(name); storytype = type; System.out.println(“从 Fiction Author 类输出“); System.out.println(“小说类型为“ + storytype); ,调用父类构造方法,Author(String str) name = str; System.out.println(“从 Author 类输出“); System.out.println(“姓名为 “ + name); ,构造函数的继承,子类可以继承父类的构造函数,构造函数的继承遵循以下的原则: (1) 子类无条件继承父类的不含参数的构造函数。 (2) 如果子类自己没有构造函数,则它将继承父类的无参数构造函数作为自己的构造函数;如果子类自己定义了构造函数,则在创建新对象时,它将先执行继承自父类的无参数构造函数,然后再执行自己的构造函数。 (3) 父类的含参数构造函数,子类可以通过在自己构造函数中使用super关键字来调用,但这个调用语句必须是子类构造函数的第一个可执行语句。,构造函数相互调用,一个类的若干个构造函数之间可以相互调用。当一个构造函数需要调用另一个构造函数时,可以使用关键字this,同时这个调用语句应该是整个构造函数的第一个可执行语句。 例如,上面D200-Card类的后几个构造函数可以改写为: D200-Card(long cn) /一个参数的构造函数,初始化电话卡号 this( ); cardNumber = cn; D200-Card(long cn,int pw) /两个参数的构造函数,初始化电话卡号和密码 this(cn); password = pw; 见例子TThis.java,14,多态性 2-1,所谓多态,是指一个程序中同名的不同方法共存的情况。面向对象的程序中多态的情况有多种,可以通过子类对父类方法的覆盖实现多态,也可以利用重载在同一个类中定义多个同名的不同方法。 多态性是指“多种形式” 它使用不同的实例而执行不同操作 多态包括方法重写和方法重载,15,多态性 2-2,父类,子类 - 绘制和移动三角形,子类 - 绘制和移动矩形,子类 - 绘制和移动五边形,16,方法重载 2-1,方法重载,类中有多个具有相同名称的方法,17,方法重载 2-2,演示:示例 4,public class DisplayNumber /* 无参数可显示/ void display() System.out.println(“无参数可显示!“); /* * param num 传递至 display 方法的参数 * param num1 传递至 display 方法的参数 */ void display(int num, int num1) System.out.println(“两个整数是:“ + num + “ “ + num1); /* * param型的 count 由 display 方法接收 */ void display(double count) System.out.println(“在 display(double)方法内:“ + count) ,public static void main(String arg) int count = 25; DisplayNumber dispObj = new DisplayNumber(); dispObj.display(); dispObj.display(10 , 20); /* 不存在具有一个 int 型参数的方法, *int 型值自动转化为 double 型值 */ System.out.println(“调用 display(double) 方法,“ + “使用 int 变量: “ + count); dispObj.display(count); dispObj.display(25.5); ,18,方法重写 2-1,19,class Rectangle int length; int width; Rectangle(int len , int wid) length = len; width = wid; /* 计算矩形的周长.*/ void getPerimeter() System.out.println(“矩形的周长为“ + (2 * (length + width); ,方法重写 2-2,父类和子类中具有相同名称和类型的方法,public static void main(String arg) Rectangle rectObj = new Rectangle(10, 15); rectObj.getPerimeter(); Rectangle sqObj= new Square(15); sqObj.getPerimeter(); ,调用父类方法,调用子类方法,class Square extends Rectangle Square(int len) length = len; /* 计算周长.*/ void getPerimeter() System.out.println(“正方形的周长为“ + (4 * length); ,20,访问修饰符 3-1,信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因 信息隐藏的原因包括: 对任何实现细节所作的更改不会影响使用该类的代码 防止用户意外删除数据 此类易于使用,访问修饰符,21,访问修饰符 3-2,22,访问修饰符 3-3,访问修饰符可访问性,23,类的修饰符3-1,Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性。类的修饰符分为访问控制符和非访问控制符两大类,有些类的修饰符也可以用来修饰类中的域或方法,本节讨论类的非访问控制符。 类修饰符(Modifier): public:允许其他类(没有限制)访问本类,一个源文件仅可以有一个public类 缺省(friendly):可被当前包中的其他类访问 abstract:没有实例的抽象概念类,是它的所有子类的公共属性和公共方法的集合 final:不能再被扩展,不能有子类的类;易于安全性的实现,或用于创建固定功能的类,24,抽象类3-2,凡是用abstract修饰符修饰的类被称为抽象类。抽象类就是没有具体对象的概念类。 较高层次的概括 抽象类的作用是让其他类来继承它的抽象化的特征。 在程序中不能用抽象类作为模板来创建对象。 抽象类经常要包含某些抽象方法(方法的具体实现要在子类中实现)。 抽象类的优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。 类中的方法不进行实现, 而所有子类必须实现该方法 类中只要有一个抽象方法,则整个类就声明为抽象的 类中至少有一个方法为抽象的,类不能实例化,25,最终类3-3,如果一个类被final修饰符所修饰和限定,说明这个类不可能有子类。 final类一定是没有子类的叶结点(不过叶结点却不一定是final类)。 被定义为final的类通常是一些有固定作用、用来完成某种标准功能的类。 abstract和final修饰符不能同时修饰一个类,因为abstract类自身没有具体对象,需要派生出子类后再创建子类的对象;而final类不可能有子类,这样abstract final类就无法使用,也就没有意义了。不能被当前类的子类重新定义的方法。,26,域4-1,域是类和对象的静态属性. 它可以是基本数据类型的变量,也可以是其他类(系统类或用户自定义类)的对象,所以定义类时定义域的操作就是说明变量或创建对象的操作。 与类相似,域也可以拥有若干修饰符,包括访问控制符和非访问控制符。先讨论非访问控制符。 1). 静态域 用static修饰符修饰的域是仅属于类的静态域。 静态域最本质的特点是:它们是类的域,不属于任何一个类的具体对象。,27,域4-2,它不保存在某个对象的内存区间中,而是保存在类的内存区域的公共存储单元。 换句话说,对于该类的任何一个具体对象而言,静态域是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值;同样任何一个类的对象去修改它时,也都是在对同一个内存单元进行操作。 见例子,28,域4-3,2). 静态初始化器 静态初始化器是由关键字static引导的一对大括号括起的语句组。它的作用与类的构造函数有些相似,都是用来完成初始化的工作,但是静态初始化器在三点上与构造函数有根本的不同: (1) 构造函数是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化。 (2) 构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用执行。 (3) 不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数列表。 例使用了静态初始化器在加载类时初始化类的静态域。,29,域4-4,3). 最终域 final是用来修饰常量的修饰符,一个类的域如果被声明为final,那么它的取值在程序的整个执行过程中都不会改变。 注意: 需要说明常量的数据类型。 需要同时指出常量的具体取值。 因为所有类对象的常量成员,其数值都固定一致,为了节省空间,常量通常声明为static。 例如PhoneCard200类中的接入号码,对于200电话卡是固定的字符串200,根据问题的实际情况,这个数据不需要也不应该被改变,所以可以把它定义为最终域。 static final String connectNumber = 200;,30,方法修饰符,31,static 修饰符 3-1,static修饰符修饰的方法叫静态方法 目的 使该方法独立于类的实例,使用类去访问,而不是类实例,所以也叫类方法,32,static 修饰符 3-2,调用静态方法的语法为: classname.methodname( );,33,演示:示例 6,public static void main(String arg) /*初始化变量*/ double inch = 66; double feet = InchesToFeet.convert(inches); System.out.println(inch + “英寸为 ” + feet + “英尺。“); ,使用类名称调用 static 方法,public static double convert(double in) return (in / inches); ,static 修饰符 3-3,34,final 修饰符,final修饰符所修饰的类方法,是功能和内部语句不能被更改的最终方法,即是不能被当前类的子类重新定义的方法。,35,abstract 修饰符 3-1,由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类 抽象方法必须声明在抽象类中 抽象方法语法: abstract type method_name(parameter_list); 声明抽象类语法: abstract class 使用:父类中的某些抽象不包含任何逻辑,并需要在子类中重写,子类提供这种抽象方法的实现细节,36,abstract 修饰符 3-2,抽象类可以具有指向子类对象的对象引用,37,abstract 修饰符 3-3,演示:示例 7,抽象方法不具有任何实现代码,abstract class Shape . . . . . . . . . . . protected double length; protected double width; . . . . . . . . . . . . . . . . . . . . . . abstract double area(); ,class Square extends Shape /* 构造方法. *param num 传递至构造方法的参数 *param num1 传递至构造方法的参数 */ Square(final double num, final double num1) super(num, num1); /* * 计算正方形的面积. * return double */ double area() System.out.println(“正方形的面积为:“); return length * width; ,38,接口,接口就是某个事物对外提供的一些功能的申明 可以利用接口实现多态,同时接口也弥补了Java单一继承的弱点 使用interface关键字定义接口 一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现 当一个类实现一个接口时,它必须实现接口中定义的所有方法,否则该类必须声明为抽象类。,39,创建接口的步骤 2-1,/ 定义方法的接口 public interface myinterface public void add(int x, int y); public void volume(int x,int y, int z); / 定义程序使用的常量

温馨提示

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

评论

0/150

提交评论