Java中的类与接口.ppt_第1页
Java中的类与接口.ppt_第2页
Java中的类与接口.ppt_第3页
Java中的类与接口.ppt_第4页
Java中的类与接口.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第三章 Java中的类与接口,教授:郭磊,【本章导读】,Java语言其中一个突出特点就是面向对象。所谓面向对象的方法学,就是使我们分析、设计和实现一个系统的方法尽可能地接近我们认识一个系统的方法。包括: 面向对象的分析(OOA, Object-Oriented Analysis), 面向对象的设计(OOD, Object-Oriented Design), 面向对象的程序设计(OOP, Object-Oriented Program)。 本章主要介绍面向对象的基本概念,包括类与对象、抽象类、内部类、匿名类、接口和包等。目的是为以后的Java面向对象的编程打好基础。,【本章要点】,类与对象 抽象类 内部类 匿名类 接口 包,3.1 类与对象,3.1.1类的声明 1、类的声明格式: 类首声明定义类的名字、访问权限以及与其它类 的关系等。 类主体定义类的成员,包括变量(数据)和方法(行为),3.1 类与对象,3.1.2 类首声明: class extends implements class: 类定义的关键字; extends: 表示类和另外一些类(超类)的继承 关系; implements: 表示类实现了某些接口; 修饰符: 表示类访问权限(public)和 类型说明(abstract、final);,3.1 类与对象,3.1.3 成员变量的声明格式: static final static: 表示是一个类成员变量(静态变量); final: 表示是一个常量; 例:final double PI=3.1415926; 修饰符: 表示变量的访问权限(缺省访问friendly、public、protected和private) 作用域:整个类。同一类中的所有方法都可以对其访问。并可简单地通过名字来引用。(在方法体内定义的变量是 局部变量,作用域只能在方法体内),3.1 类与对象,3.1.3 成员方法 方法的定义包括两部分:方法声明和方法体。一般格式为: 方法声明部分 方法体的内容 ,3.1 类与对象,3.1.4 对象的创建与引用 1、对象的创建 创建一个对象包括对象的声明和为对象分配成员变量两个步骤。 (1)对象的声明 对象声明的一般格式为: 类的名字 对象名字; 如: Rect rectangleOne; 这里,Rect是一个类的名字,rectangleOne是我们声明的对象的名字。用类声明的数据称为类类型变量,即对象,如上述Rect类声明的对象rectangleOne。,3.1 类与对象,1、对象的创建 (2 )为声明的对象分配成员变量 为声明的对象分配成员变量,即是给变量分配内存空间。 使用new运算符和类的构造方法为声明的对象分配成员变量,如果类中没有构造方法,系统会调用默认的构造方法(默认的构造方法是无参数的,你一定还记得构造方法的名字必须和类名相同这一规定),上述的Rect类提供了2个构造方法,下面都是合法的创建对象的语句: rectangleOne =new Rect();,3.1 类与对象,2、对象的引用 我们已经知道,当用类创建一个对象时,成员变量被分配内存空间,这些内存空间称做该对象的实体或变量,而对象中存放着引用,以确保这些变量由该对象操作使用。因此,如果两个对象有相同的引用,那么就具有同样的实体。,3.1 类与对象,3.1.5 类的继承与多态 只支持单重继承,不支持多重继承,只能从一个父类继承。 必须从一个类继承 默认是从Object继承 如果类Sub是类Super的子类,则类Sub只继承超类Super中非private的成员变量和方法。 子类Sub中,包括两部分的内容:从超类Super中继承下来的变量和方法,自己新增加的变量和方法。,3.1 类与对象,3.1.5 类的继承与多态 继承的语法 修饰符 class 类名 extends 父类 新属性; 新方法; 重载的方法; 覆盖的方法; ,3.1 类与对象,3.1.5 类的继承与多态 多态是指同一个名字的若干个方法,有不同的实现(即方法体中的代码不一样)。 通过方法的重载和覆盖来实现多态性。 方法的重载 一个类中,有若干个方法名字相同,但方法的参数不同,称为方法的重载。 不正确的方法重载 public void funover(int a, float b) public int funover(int a, float b),3.1 类与对象,3.1.5 类的继承与多态 对于多态,可以总结它为 : (1)使用父类类型的引用指向子类的对象; (2)该引用只能调用父类中定义的方法和变量; (3)如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用) (4)变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。,3.2 抽象类,Java也可以创建专门的类用来当作父类,这种类称为抽象类(abstract class)。即用关键字abstract修饰类称为abstract类(抽象类)。抽象类有点类似“模板”的作用,其目的是要你根据它的格式来修改并创建新的类。不能够通过抽象类直接创建对象,只能通过抽象类派生的新的类,再由新类创建对象。,3.2 抽象类,在Java中,凡是用abstract修饰符修饰的类称为抽象类。它和一般的类不同之处在于: (1) 如果一个类中含有未实现的抽象方法,那么这个类就必须通过关键字abstract进行标记声明为抽象类。 (2) 抽象类中可以包含抽象方法,但不是一定要包含抽象方法。它也可以包含非抽象方法和域变量,就像一般类一样。 (3) 抽象类是没有具体对象的概念类,也就是说抽象类不能实例化为对象。 (4) 抽象类必须被继承。子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。 定义一个抽象类的格式如下: abstract class 类名称 ./类的主体部分 注意:在抽象类中,方法的定义可分为两种:一种是普通方法;另一种是抽象方法,此方法以abstract开头,且只声明了返回值的数据类型、方法名称、所需参数,但没有方法体。这样,抽象方法中的处理方式必须在子类中完全实现。,3.2 抽象类,下面我们通过例子,学习抽象方法的使用。 例3-11 abstract class fatherClass abstract void abstractMethod(); void printMethod() System.out.println(“fatherClass function! “); class childClass extends fatherClass void abstractMethod() System.out.println(“childClass function! “); public class mainClass public static void main(String args) childClass obj=new childClass(); obj. printMethod(); objabstractMethod(); ,3.2 抽象类,例子运行的结果。 在上面的程序中,首先定义了一个抽象类fatherClass,在这个抽象类中,声明一个抽象方法abstractMethod()和一个非抽象方法printMethod(),接着定义了fatherClass的子类childClass,在childClass中重写了abstractMethod()方法,随后,在主类mainClass中生成类childClass的一个实例,并将该实例引用返回到fatherClass类变量obj中。,3.3 内部类,类可以有两种重要的成员:成员变量和方法,类还可以有一种成员:内部类。 Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。内部类同类中声明的方法或成员变量一样,一个类把内部类看作是自己的成员。外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。内部类的类体中不可以声明类变量和类方法。外嵌类可以用内部类声明对象,作为外嵌类的成员 在一个类的内部还可以定义类,这就是内部类,也称为嵌套类。,3.3 内部类,内部类本身是一个类,但它同时又是外部类一个成员。作为外部类的成员,它可以毫无限制地访问外部类的变量和方法,包括private成员。这和private的含义并不矛盾,因为private修饰符只是限制从一个类的外部访问该类成员的权限,而内部类在外部类内部,所以它可以访问外部类的所有资源。,3.3 内部类,3.3.1 内部类的分类 静态内部类、 成员内部类、 本地内部类 匿名内部类。,3.4 匿名类,匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。 这就要采用另一种形式的new语句,如下所示: new 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。,3.4 匿名类,Java中内部匿名类用的最多的地方也许就是在Frame中加入Listner了吧。 如下: import java.awt.*; import java.awt.event.*; public class QFrame extends Frame public QFrame() this.setTitle(“my application“); addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) dispose(); System.exit(0); ); this.setBounds(10,10,200,200); ,3.4 匿名类,内部匿名类,就是建立一个内部的类,但没有给你命名,也就是没有引用实例的变量。 new WindowAdapter() public void windowClosing(WindowEvent e) dispose(); System.exit(0); new 是建立一个 WindowAdapter对象 ,后面一个 表示这个括号中的操作作用于这个默认的对名象,而上面的Java程序中后面是一个函数体。,3.5 接口,Java为了避免C+中随着多重继承所衍生的问题,因而限定类的继承只支持单重继承。但是实际中的较为复杂问题的解决有需要用到多重继承,因此,Java通过接口来实现类间多重继承的功能。,3.5.1 接口的定义,Java中声明接口的语法如下: public interface接口名extends父接口名列表 /接口体 /常量域声明 public static final 域类型域名常量值; /抽象方法声明 public abstract native 返回值方法名(参数列表)throw 异常列表; 一个类只能有一个父类,但是类可以同时实现若干个接口。这种情况下如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承。,3.5.1 接口的定义,定义接口可归纳为如下几点: (1)在Java中接口是一种专门的类型。用interface关键字定义接口。 (2)接口中只能定义抽象方法,不能有方法体,一定是public修饰的。 (3)接口中可以定义变量,但实际上是static final修饰的常量。 (4)接口中不能定义静态方法。 接口是简单的未执行的系列以及一些抽象的方法,你可能会思考究竟接口于抽象类有什么区别。了解它们的区别是相当重要的,它们之间的区别如下: (1)接口不能包含任何可以执行的方法,而抽象类可以。 (2)类可以实现多个接口,但只有一个父类。 (3)接口不是类分级结构的一部分,而没有联系的类可以执行相同的接口。,3.5.2 接口的实现,接口的声明仅仅给出了抽象方法,相当于程序开发早期的一组协议,而具体地实现接口所规定的功能,则需某个类为接口中的抽象方法书写语句并定义实在的方法体,称为实现这个接口。如果一个类要实现一个接口,那么这个类就提供了实现定义在接口中的所有抽象方法的方法体。,3.5.2 接口的实现,一个类要实现接口时,请注意以下问题: (1)在类的声明部分,用implements关键字声明该类将要实现哪些接口。 (2)如果实现某接口的类不是abstract抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表。 (3)如果实现某接口的的类是abstract的抽象类,则它可以不实现该接口所有的方法。但是对于这个抽象类任何一个非抽象的子类而言,它们父类所实现的接口中的所有抽象方法都必须有实在的方法体。这些方法体可以来自抽象的父类,也可以来自子类自身,但是不允许存在未被实现的接口方法。这主要体现了非抽象类中不能存在抽象方法的原则。 (4)个类在实现某接口的抽象方法时,必须使用完全相同方法头。如果所实现的方法与抽象方法有相同的方法名和不同的参数列表,则只是在重载一个新的方法,而不是实现已有的抽象方法。 (5)接口的抽象方法的访问限制符都已制定为public,所以类在实现方法时,必须显式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。,3.5.2 接口的实现,例3-13 interface A int a=1; interface B int b=2; public abstract void pp(); interface MyInterface extends A,B/接口的继承 abstract class AbstractInterfaceExam implements A,B /抽象类实现接口 public class InterfaceExam implements A,B/一般类实现接口 static InterfaceExam obj = new InterfaceExam(); public static void main(String args) System.out.println(“继承接口A中的a=“ + obj.a); obj.pp(); public void pp()/实现抽象方法pp() System.out.println(“继承接口AB中的ab=“ + obj.b); ,3.5.3 接口回调,接口回调是多态的另一种体现,接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称作对象功能的接口回调。不同的类在使用同一接口时,可能具有不同的功能体现,即接口的方法体不必相同,因此,接口回调可能产生不同的行为。,3.5.3 接口回调,下面我们看看使用了接口的回调技术的例子。 例3-14 interface ShowMessage void showTradeMark(); class TV implements ShowMessage public void showTradeMark() System.out.println(“我是电视机“); class PC implements ShowMessage public void showTradeMark() System.out.println(“我是电脑“); public class Example public static void main(String args) ShowMessage sm; /声明接口变量。 sm=new TV(); /接口变量中存放对象的引用。 sm.showTradeMark(); /接口回调。 sm=new PC(); /接口变量中存放对象的引用。 sm.showTradeMark(); /接口回调。 运行结果是: 我是电视机 我是电脑,3.6 包,包是Java提供的文件组织方式。一个包对应一个文件夹,一个包中可以包括很多类文件,包中还可以有子包,形成包等级。Java把类文件放在不同等级的包中。这样一个类文件就会有两个名字:一个是类文件的短名字,另外一个是类文件的全限定名。短名字就是类文件本身的名字,全限定名则是在类文件的名字前面加上包的名字。,3.6 包,3.6.1 比目录更好的选择 可以把一个目录树转化为一个包*.jar文件 也可以把一个包文件还原为目录树 包就是目录树的化身 java访问包中的东西就如同访问目录树一样。,3.6 包,为什么要打成包的格式? 简洁 更容易下载,拷贝;不容易损坏 平台无关 避免平台对目录和文件名的限制 节省 可以选择压缩,节约空间,3.6 包,如何打包? bin目录下提供了实用的工具 jar.exe 能处理打包和解包的问题 jar -cvf 包名 待处理的目录或文件,本章小结,类是Java语言面向对象编程的基本元素,它定义了一个对象的结构和功能。接口是Java语言中特有的数据类型,由于接口的存在,解决了Java语言不支持多重继承的问题。通过本章学习,要求掌握面向对象程序设计的基本概念、多态中的方法重载和覆盖、类的继承的概念和实现,理解继承、抽象类、接口和包的概念。,习 题,一、选择题

温馨提示

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

评论

0/150

提交评论