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