java期末复习课件第04讲面向对象程序设计.ppt

上传人:本田雅阁 文档编号:3481824 上传时间:2019-09-01 格式:PPT 页数:42 大小:214.02KB
返回 下载 相关 举报
java期末复习课件第04讲面向对象程序设计.ppt_第1页
第1页 / 共42页
java期末复习课件第04讲面向对象程序设计.ppt_第2页
第2页 / 共42页
java期末复习课件第04讲面向对象程序设计.ppt_第3页
第3页 / 共42页
java期末复习课件第04讲面向对象程序设计.ppt_第4页
第4页 / 共42页
java期末复习课件第04讲面向对象程序设计.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《java期末复习课件第04讲面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《java期末复习课件第04讲面向对象程序设计.ppt(42页珍藏版)》请在三一文库上搜索。

1、JAVA 语言,第4讲 面向对象程序设计(2) 继承,2019年9月1日,上一讲回顾,1. 面向对象的基本特征(封装、继承和多态); 2.类的定义、对象的创建和引用方法; 3.定义类时的各种细节,构造函数的定义和使用; 4.各种修饰符的使用方法。,2019年9月1日,学习要点,理解继承的概念,超类和子类的关系,掌握它们在继承中的应用; 掌握类中有关private成员的访问控制方法; 理解方法重载和方法重写的区别和使用方法;,2019年9月1日,4.1 包,包是由.class文件组成的一个集合,2019年9月1日,4.1.1 定义包,构建包语句的语法是: package pkg1.pkg2.pk

2、g3; 例如:package com.javaworld; package语句作为Java源文件的第一条语句。如果没有package语句,则为缺省无名包。 则该语句的前面只能有注释或空行。而且一个文件中最多有一条package语句。 包名有层次关系,全部用小写字母,各层之间用点分割.,2019年9月1日,包是类的容器,用于分割类名空间。 如果不指定,默认就存在当前文件夹里面。 当使用包说明时,程序不需要再引入同一个包或者该包的任何元素。 如果包声明是: package com.sun.java; 则此文件必须存放在Windows的comsunjava目录下。,2019年9月1日,包名必须唯一

3、主要是为了交流,和便于大家的协同合作。 一个使用较多的办法是反转域名,如 com.sun.util; 包名的解释 Java解释器的执行顺序是:首先找到环境变量classpath,利用classpath包含的一个或者多个目录,把他们作为一种特殊的“根”使用,从这里开始搜索,搜索时会把“.”替换成“”(Windows)。,2019年9月1日,4.1.2 导入包,import的语法是: import pkg1.pkg2.pkg3.(类名| * ); 例如:import java.awt.*; 引入整个包时,可以方便的访问包中的每个类。 但是引入所有的包会占用过多的内存。因此,我们建议只引入需要的类。

4、 程序中不一定有引入语句。当需要引用某个类与当前类存储在一个物理目录下的时候,就可以直接使用,而不需要引入。,2019年9月1日,4.1.3 类路径(CLASSPATH),编译时:javac d CLASSPATH路径 Myclass.java 例如:javac d d:Myjava myclass.java 则直接在d:Myjava下创建在myclass.java中指明的包目录,并把myclass.class拷到该目录下。 运行:java 包名.类名 如 java pk1.pk2.类名A 示例 CircleDemo2.java,2019年9月1日,jdk中常用的包 java.lang-包含一

5、些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。 java.awt-包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。 java.applet-包含applet运行所需的一些类。 -包含执行与网络相关的操作的类。 java.io-包含能提供多种输入/输出功能的类。 java.util-包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。,2019年9月1日,4.1.4 访问控制,2019年9月1日,4.2 继承,面向对象的编程允许从现

6、有类派生出新类,这称为继承。 使用继承,程序员可以创建一个定义了多个相关项目共有特性的通用类,然后,其它较为具体的类可以继承该类,同时再添加自己的独有特性。 在Java中定义的每一种类都是从现有类派生来的,或者是显式或者是隐式(如从Object类派生),2019年9月1日,13,4.2.1 超类和子类,在Java术语中,如果类C2是从另一个类C1派生出来的,那么C2称为子类,C1称为超类。,C1,C2,C3,派生,派生,超类,子类,声明一个继承超类的子类的格式: class subclass-name extends superclass-name /body of calss 示例:Simp

7、leInheritance.java,2019年9月1日,/ SimpleInheritance.java class A int i, j; void showij() System.out.println(“i and j: “ + i + “ “ + j); /创建一个继承超类A的子类B class B extends A int k; void showk() System.out.println(“k: “ + k); void sum() System.out.println(“i+j+k: “ + (i+j+k); ,关键字extends,2019年9月1日,class Simp

8、leInheritance public static void main(String args) A superOb = new A(); B subOb = new B(); / The superclass may be used by itself. superOb.i = 10; superOb.j = 20; System.out.println(“Contents of superOb: “); superOb.showij(); System.out.println(); /* The subclass has access to all public members of

9、its superclass. */ subOb.i = 7; subOb.j = 8; subOb.k = 9; System.out.println(“Contents of subOb: “); subOb.showij(); subOb.showk(); System.out.println(); System.out.println(“Sum of i, j and k in subOb:“); subOb.sum(); ,2019年9月1日,超类指父类或者基类,子类指孩子类、扩展类或者派生类。 子类从它的超类中继承所有的实例变量和方法,并且可以创建新的数据和方法。 因此,子类总是比

10、其超类具有更多功能。,2019年9月1日,4.2.2 成员访问和继承,类的实例变量经常被声明为private,以防止未经认可的使用或滥用。 尽管子类包括超类的所有成员,但它不能访问超类中被声明为private的成员。 示例1,2019年9月1日,/创建一个超类A class A int i; /public be default private int j; /private to A void setij(int x,int y); i=x; j=y; class B extends A int total; void sum() total=i+j; /出现错误,j不能在子类B中的方法访问

11、 ,2019年9月1日,继承的优点:一旦创建了超类,可以用它创建任意数量更具体的子类。 示例 InfoPerson.java。,2019年9月1日,4.3 super关键字,示例InfoPerson.java,从Person类派生的类并没有体现出它们的实际上是多么有效和强大。 Country的构造函数明确的初始化了Person类的name、sex成员。 这些重复的代码在它的超类中已经存在,这样做效率很低,而且,这意味着子类必须被同意具有访问这些成员的权力。,2019年9月1日,既然封装是面向对象的基本属性,Java提供了在子类中用关键字super引用它直接的超类。 super有两种通用形式。第

12、一种调用超类的构造函数。第二种用来访问被子类的成员隐藏的超类成员。,2019年9月1日,4.3.1 使用super调用超类构造函数,子类可以调用超类中定义的构造函数方法,用super的下面形式: super(parameter-list); parameter-list是超类中构造函数所用到的所有参数。 super( )必须是在子类构造函数中的第一个执行语句。 示例:DemoSuper.java,2019年9月1日,与属性方法不同,超类的构造函数不能在子类中被继承,只能使用关键字super从子类的构造函数中被调用。 如果没有明确地使用关键字,那么会自动调用超类中默认的构造函数。 示例:C1.j

13、ava 注意构造函数调用的先后顺序:先执行超类构造函数,后执行子类构造函数,2019年9月1日,4.3.2 使用super访问超类成员,Super的第2种形式,除了总是引用它所在子类的超类,它的行为有点像this。这种用法有下面的通用形式: super.member 这里,member既可以是1个方法也可以是1个实例变量。 示例:UseSuper.java,2019年9月1日,4.3.3 创建多级层次结构,到目前为止,仅用到了只含有一个超类和一个子类的简单类层次结构。 程序员可建立包含任意多层继承的类层次。 例如,给定三个类A,B和C。C是B的一个子类,而B又是A的一个子类。 当这种类型的情形

14、发生时,每个子类继承它的所有超类的属性:C继承B和A的所有方面。 示例:MultiInhert.java Super()总是引用最接近的超类的构造函数。,2019年9月1日,4.3.4 何时调用构造函数,类层次结构创建以后,组成层次结构的类的构造函数以怎样的顺序被调用? 假设给定一个名为B的子类和超类A,是A的构造函数在B的构造函数之前调用,还是情况相反?,从C1.java中执行结果可以发现?,答案:在类层次结构中,构造函数以派生的次序调用,从超类到子类。且尽管super( )必须是子类构造函数的第一个执行语句,无论你用到了super( )没有,这个次序不变。 如果super( )没有被用到,

15、每个超类的默认的或无参数的构造函数将执行。CallingCons.java,2019年9月1日,27,4.4 方法重载和方法重写,1).应用程序不必为每一个派生类(子类)编写功能调用,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性。 2). 派生类的功能可以被基类的引用变量引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。以前写的程序可以被后来程序调用不足为奇,现在写的程序(如callA方法)能调用以后写的程序(以后编写的一个类A的子类, 如类D)就了不起了。,2019年9月1日,28,4.4.1 方法重载(overload),同一个类中的两个或多个方法

16、可以共享同一个名称,只要它们的参数声明不一样就可以。可如下形式所示: public void println(int i); public void println(float f); public void println(); 参数表必须不同,返回类型可以不同 方法重载是Java实现多态性的一种方式,2019年9月1日,/演示方法重载 public class OverLoad int i = 3, j=4; int sum( ) return i+j; int sum(int a, int b) return a+b; int sum(int a,int b, int c) return

17、 a+b+c; double sum(double a, double b) return a+b; ,2019年9月1日,public static void main(String args) OverLoad o = new OverLoad(); System.out.println(o.sum(); System.out.println(o.sum(5,6); System.out.println(o.sum(5,8,4); System.out.println(o.sum(3.2,2.15); ,2019年9月1日,4.4.2 方法重写(覆盖),方法覆盖(override) 子类可

18、以修改从父类继承来的行为 子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回类型、 参数表。 子类也能创建一个与父类方法有不同功能的方法,但具有相同的名称,不同的参数表时,有不同的返回类型。 覆盖发生在子类与父类之间。,2019年9月1日,class A int i, j; A(int a, int b) i = a; j = b; / 输出i和j void show() System.out.println(“i and j: “ + i + “ “ + j); ,2019年9月1日,class B extends A / 创建一个类继承A. int k; B(int a, i

19、nt b, int c) super(a, b); k = c; void show(String msg) / 重写方法 show() System.out.println(msg + k); class Override public static void main(String args) B subOb = new B(1, 2, 3); subOb.show(“This is k: “); / 调用B中的方法show() subOb.show(); / 调用 A中的方法show() ,2019年9月1日,超类中的方法仅当实例可访问时的,才可被重写 如果重新定义超类中的静态方法,则超

20、类中的方法被屏蔽。,2019年9月1日,4.4.3 重写的方法支持多态性,方法覆盖形成了动态方法分配,实现运行时的多态性。 示例:DynDispDemo.java 方法覆盖实现多态性的 “单界面,多方法”,2019年9月1日,4.4.4 方法覆盖的约束条件,子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致。,public class Base public void method() public class Sub extends Base public int method() /编译错误,返回类型不一致 return 0; ,2019年9月1日,方法覆盖的约

21、束条件,子类方法不能缩小父类方法的访问权限,但可以扩大访问权限,public class Parent public void method() public class Child extends Parent private void method() /编译错误 ,2019年9月1日,方法覆盖的约束条件,子类方法不能抛出比父类方法更多的异常 class ExceptionA extends Exception class ExceptionB extends ExceptionA class ExceptionC extends ExceptionB public class Paren

22、t void method() throws ExceptionB public class Child1 extends Parent void method()throws ExceptionA /非法 public class Child2 extends Parent void method()throws ExceptionC /合法 ,2019年9月1日,小结,1. 超类和子类的关系,掌握它们在继承中的应用; 2.理解方法重载和方法重写的区别和使用方法;,2019年9月1日,课外任务,1. 根据大作业的要求,分析问题中所需的类,确定类与类之间的关系,并定义这些类。 2. P130.

23、 6-1,2019年9月1日,3. 设计点圆圆柱体层次的类Point、Circle、Cylinder。其中Point类中含有privte的实例变量x、y,访问它们的方法为set/get及toString,使子类可继承上述非private的方法访问超类的private成员;Circle类增加privte的实例变量radius及求圆的周长getcircumference、面积getArea的方法; Cylinder类则增加privte的实例变量height及求圆柱体getVolume的体积方法。子类中都应重写toString方法,输出相应信息。 编写相应的测试类TestCylinder ,测试上述设计。,2019年9月1日,4. 完成、修改给定程序,实现多继承。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1