java面向对象特性(学Java必看).ppt

上传人:max****ui 文档编号:8301714 上传时间:2020-03-28 格式:PPT 页数:75 大小:1.26MB
返回 下载 相关 举报
java面向对象特性(学Java必看).ppt_第1页
第1页 / 共75页
java面向对象特性(学Java必看).ppt_第2页
第2页 / 共75页
java面向对象特性(学Java必看).ppt_第3页
第3页 / 共75页
点击查看更多>>
资源描述
第3章面向对象程序设计 更多免费资料 进群514167678 内容摘要 面向对象的思维就是以面向对象为中心来思考问题 此时会将与问题相关的种种元素视作为一个个的对象 问题的发生是由对象的交互所产生 而问题的解答也有某些对象彼此合作来完成 面向对象是一种对问题的思考方式 与任何的程序语言没有任何直接的关系 面向对象也绝不仅用于程序设计领域 对对象信息进行封装 我们使用了类 本章首先从面向对象与面向过程的比较入手 介绍对象概念和面向对象开发过程 然后中的介绍如何在Java中创建Java类 方法和变量 接下来介绍Java对象 方法和继承 最后介绍内部类和抽象类 共享资料和课程 进群514167678 学习目标 理解面向过程和面向对象区别掌握对象概念了解面向对象开发过程熟练掌握Java类的创建掌握类中的方法和变量的创建掌握创建对象和对象引用熟练掌握常用的基本方法 如静态方法和最终方法掌握继承概念掌握内部类和抽象类的使用 3 1面向过程与面向对象 现在 作为程序员肯定听说过面向对象编程 OOP 这个奇妙的术语 OOP是当今软件开发中最热门的 种方法 面向对象编程与面向过程相比较 是一个全新的编程方式 本节就会介绍编程思路的发展和面向对象编程特点 3 1 1编程思路的发展 要明白面向对象编程给程序员带来的好处 是需要了解编程技术发展的历史 在早些时间的计算机年代里 编程是一个十分花费精力的过程 计算机要做的每一步都必须详细入微 没有错误 地编写程序 早期的语言是著名的机器语言 后来进化为汇编语言 面向过程面向过程编程是程序开发首先选择的思路 这些过程语言把代码做成叫做过程或函数的块 每个块的日标是完成某个任务 结构化程序设计面向对象 3 1 2面向对象设计 非面向对象与面向对象的区别非面向对象的数据不能隐藏 而且数据与方法不够紧密面向对象的思想面向对象是一种思想 是指用什么样的思路去写程序 做软件 真正的面向对象是指用面向对象的思想去在现实生活中解决问题 将现实中解决问题的思想与计算机思想更好地统一起来 能够让计算机模拟现实生活中解决问题的办法 通过语言来编写程序 模拟人类解决问题的方法思路 而解决问题的最好思想就是在现实中已形成的思想 计算机就是要解决现实中的问题 把现实的问题迁移到计算机中解决 面向对象解决问题的方法思想例 写一个数组排序程序ArraySort java分析java的面向对象传统的程序员写排序代码则一般都会思考怎么排序 用什么循环 如何移用元素等 自己写代码实现排序功能作为一个java程序员 java是纯粹的面向对象的编程语言 则无需自己写代码实现 一定要转变思想 当java程序员遇到一个问题 要实现一个功能时 则不要一味地想到自己怎么解决问题 而是先想想java中有没有现成的哪个类的哪个方法可以实现和解决问题 这就是面向对象的思想 也就是java的程序设计思想 3 1 2面向对象设计 Java语言其实就是由很多的类组成 每个类有不同的对象 每个对象又有很多方法 所以我们解决问题 编写程序就是调用这些方法来解决问题 排序数组可使用java util Arrays sort 数组名 来实现 调用的java类的方法都是经过测试的 sun公司不断更新的方法 肯定是最好的 所以一定要学会运用不同类的不同方法 3 1 2面向对象设计 3 2对象入门 类与对象什么是对象对象是现实世界中客观存在的 是类的实例 万事万物皆是一个对象 任何一个对象都有2种特性 特征和行为一个对象它具有什么特征 我们称它具有什么属性 用属性表示一个对象它有自己的行为 它具有什么行为 我们称它具有什么方法 用方法表示任何一个对象都是有属性 有方法的 3 2对象入门 什么是类类是同一类型事物数据的抽象 是对象共性的抽象 是客观对象在人脑中的主观反映 对象则是类的具体化 是类的实例 类是对象的模板 即类是对一组有相同数据和相同操作的对象的定义 一个类所包含的方法和数据描述一组对象的共同属性和行为 java中的类与对象的使用在java中 我们一定是写类 因为对象太多 无法写 只能写一个类来代表所有对象在java中 我们一定是使用对象 因为类是一个抽象 没有实现 在现实生活中只有具体的对象 所以我们一定是用对象 3 2对象入门 面向对象主要特征 封装性封装是指对一件物品的描述信息是这个物品所特有的 是不能让外界看到的一些成员变量和方法 在Java里成员变量和方法就被封装在类里 需要通过一些特有的方法访问它们 继承性继承是发生在类与类之间的 继承可以是单继承 也可以多层继承 多态性对象根据所接受的消息而做出的动作 同一消息被不同的对象接受时可以产生完全不同的行为 这种现象称为多态 3 3面向对象开发过程 当我们遵照面向对象方法学的思想进行软件系统开发时 首先要行面向对象的分析 OOA ObjectOrientedAnalysis 其任务是了解问题域所涉及的对象 对象间的关系和作用 即操作 然后构造问题的对象模型 力争该模型能真实地反映出所要解决的 实质问题 在这一过程中 抽象是最本质 最重要的方法 针对不同的问题性质选择不同的抽象层次 过简或过繁都会影响到对问题的本质属性的了解和解决 3 3面向对象开发过程 OOA面向对象的分析方法 OOA 是在一个系统的开发过程中进行了系统业务调查以后 按照面向对象的思想来分析问题 OOA与结构化分析有较大的区别 OOA所强调的是在系统调查资料的基础上 针对OO方法所需要的素材进行的归类分析和整理 而不是对管理业务现状和方法的分析 OOD面向对象的设计 OOD ObjectOrientedAnalysis 即设计软件的对象模型 根据所应用的面向对象软件开发环境的功能强弱不等 在对问题的对象模型的分析基础上 可能要对它进行一定的改造 但应以最少改变原问题域的对象模型为原则 然后就在软件系统内设设计各个对象 对象间的关系 如层次关系 继承关系等 对象间的通信方式 如消息模式 等 总之是设计各个对象应做些什么 3 3面向对象开发过程 OOI 又可以称为OOP 面向对象的实现 OOI ObjectOrientedZmplementation 即指软件功能的编码实现 它包括 每个对象的内部功能的实现 确立对象哪一些处理能力应在哪些类中进行描述 确定并实现系统的界面 输出的形式及其它控制机理等 总之是实现在OOD阶段所规定的各个对象所应完成的任务 面向对象的实现 OOI 又称作面向对象的编程 OOP OOP ObjectOrientedProgramming 工作就是用一种面向对象的编程语言把OOD模型的每个成分书写出来 3 3面向对象开发过程 面向对象编程 ObjectOrientedProgramming OOP 面向对象程序设计 是一种计算机编程架构 OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 OOP达到了软件工程的三个主要目标 重用性 灵活性和扩展性 为了实现整体运算 每个对象都能够接收信息 处理数据和向其它对象发送信息 3 4类 在Java中 完成对功能操作封装的单位称为类 类是有共同特性 属性 和操作 行为 定义的实体 类是用于组合各个对象所共有操作和属性的一种机制 可以根据类具有的属性和方法 赋予类不同的数值 来创建不同的对象实例 3 4 1类定义 类是构造面向对象程序的基本单位 是抽取了同类对象的共同属性和方法形成的对象或实体的 模板 而对象是现实世界中实体的描述 对象要创建才存在 有了对象才能对对象进行操作 类是对象的模板 对象是类的实例 类是Java的核心 由于类定义了一个对象的形式与属性 因此整个Java语言建立在这个逻辑结构之上 同样 类构成了Java面向对象程序设计的基础 任何希望在Java程序中实现的想法都必须封装在类中 在一个类中 程序的作用体现在方法中 方法是Java创建一个有名字的子程序的方法 当定义一个类时 就声明了该类确切的形式和属性 通过指定类中包含的数据和对这些数据进行操作的代码来定义一个类 3 4 1类定义 创建类的一般格式 修饰符 class类名 extends父类名 implements接口名列表 成员变量声明成员方法声明 其中 class extends和implements都是Java的关键字 保留字 类的修饰符主要有public abstract final及缺省访问修饰符等四种 注意 一个类可以同时有多个修饰符 但是不能有相同的修饰符 当一个类有多个修饰符时 这些修饰符无先后顺序 可任意排列 在java中允许定义没有任何成员的空类 类的名称要符合标识符的命名规则 不能为Java中的关键字 不能包含空格或点号 可以以下划线 字母或 符号开头 类的名称的第一个单词的第一个字母通常是大写 第二单词的第一个字母大写 以此类推 3 4 2属性和方法 在类体中 包含的是成员变量和成员方法 成员变量通常表示一个类所具有的属性 通过声明成员方法可以定义类的行为 行为表示一个对象能够做的事情或者能够从一个对象取得的信息 类的各种功能操作都是方法来实现 属性只不过提供了相应的数据 一个完整的方法通常包括方法名称 方法主体 方法参数和方法返回类型 其结构如图3 1所示 3 4 2属性和方法 图3 1构成方法元素 3 4 2属性和方法 在类体中创建方法 其语法格式如下 方法以是否拥有返回值 是否带有参数 可以划分不同的方法形式 其常用的四种形式如下 voidisN voidsetN intnum intgetN StringgetM inta intb 例 定义一个名为Box表示立方体的类 仅包含double类型的长length 宽width和高height三个成员变量 classBox doublelength doublewidth doubleheight 通过例 我们可以看到 在类中进行成员变量的声明与一般变量的声明形式完全相同 成员变量的类型可以是任意的 成员变量的名字在一个类中应该保证唯一性 例的类没有任何方法 下面再看一个有成员方法的类 例 定义一个名为Box表示立方体的类 包含double类型的长length 宽width和高height三个成员变量以及设置立方体长 宽 高值的方法initBox 计算立方体体积的方法getVol classBox 定义Box类doublelength doublewidth doubleheight doublegetVol 计算立方体体积的方法getVol returnlength width height voidinitBox doublel doublew doubleh 初始化立方体长宽高值length l width w height h 例 定义一个名为Box表示立方体的类 包含double类型的长length 宽width和高height三个成员变量以及设置立方体长 宽 高值的方法initBox 计算立方体体积的方法getVol classBox 定义Box类doublelength doublewidth doubleheight doublegetVol 计算立方体体积的方法getVol returnlength width height voidinitBox doublel doublew doubleh 初始化立方体长宽高值length l width w height h 练习 创建一个电视机类 它包含 属性 尺寸 型号 生产厂商方法 打开 关闭 欣赏节目 3 5对象 一旦定义了所需的类 就创建了一种新的数据类型 使用类类型定义的变量叫对象 对象创建类的变量称为类的实例化 对象是类的一个实例 类的对象是在程序运行中创建生成的 其所占的空间在程序运行中动态分配 当一个类的对象完成了它的使命 为节省资源 Java的垃圾回收程序就会自动收回这个对象所占的空间 即类对象有自己的生命周期 Java对象的生命周期大致包括三个阶段 对象的声明和创建 对象的使用 对象的清除 如 Boxbox1 定义的box1是一个对类型为类Box的对象的引用 box1不是对象本身 可理解为指针 可以指向类Box的某一个具体的对象 实例 1 创建对象创建类的对象一般需要两步 第一步 声明该类型的一个变量 第二步 用new运算符为对象动态分配 即在运行时分配 内存空间 并返回对它的一个引用 这个引用被存储在该变量中 利用new创建类的对象的通用形式如下 类对象名 new类名 例如 创建一个Box类的对象myBox可用以下语句BoxmyBox 声明一个对象myBox newBox 创建一个对象 3 5 1对象定义 new运算符允许与类声明结合使用来创建一个类的对象 如上面两行语句可组合为 BoxmyBox newmyBox 定义好后 可以把myBox作为类Box的对象来使用 而实际上myBox仅是保存了实例对象的地址 利用它来间接的引用实例对象 注 创建一个对象需要该类的构造方法和new关键字 缺一不可 New主要作用是在创建对象时 开辟一块内存 而内存空间的大小由构造函数决定 2 使用对象创建了类的对象后 就可以对对象的各个成员进行访问 以进行各种处理 访问对象成员的通用形式为类对象名 成员变量名类对象名 成员方法名 括号不能省略运算符 称为成员运算符 在类对象名和成员变量名 成员方法之间起到连接的作用 以此指明是哪个对象的成员 从上面的访问形式 可以看出 要使用对象变量首先要构造对象 获得类对象名 即类变量名 例 利用上例定义的Box类 计算长 宽 高分别为5 4 3的立方体体积 publicclassBoxDemoOne publicstaticvoidmain Stringargs BoxmyBox newBox doublevol myBox length 5 myBox width 4 myBox height 3 vol myBox length myBox width myBox height System out println 立方体的体积是 vol 注意 要编译成功 必须将例5 1定义的Box类置于本程序中 以生成Box class和BoxDemoOne class两个字节码文件 程序运行结果如下 长方体的体积是 60 0当程序需要更多的类对象时 可用new运算符多次创建该类的对象 然后按例5 3中的代码形式进行长方体体积的运算 这样一来 程序中对成员变量的访问赋值语句会很多 显得程序不够紧凑 更好的方法是在类定义中加入可对成员数据进行操作的成员方法 如例所定义的类Box 可使程序更加有效率 例p90 3 清除对象在java中 有自动内存管理系统的垃圾收集器 会定时或在内存不足时 自动回收垃圾对象所占的内存 程序员使用new关键字来为对象分为配空间释放对象时 只需要将对象所有引用赋值null 其语法格式如下所示 objPerson null 当使用不同的构造方法或参数数据创建对象时 就会产生大量的 不同的对象 但这些对象有一个特点 就是都是来源于同一个类 这些对象之间 可以进行相应的引用 例 classObj doubled publicObj doubledd d dd publicvoidgetD System out println d publicstaticvoidmain Stringargs ObjObj1 newObj 2 34 ObjObj2 newObj 3 34 Obj1 getD Obj2 getD Obj1 Obj2 对象引用Obj1 getD 3 5 2对象引用 练习 定义Circle类的成员变量r和常量PI及方法 classExample1 定义Box类floatr finaldoublePI 3 14 publicdoublearea returnPI r r publicvoidsetR floatx r x publicdoubleperimeter return2 PI r publicstaticvoidmain Stringargs doublex y Example1cir newExample1 cir setR 2 3f x cir area y cir perimeter System out println 圆面积 x 园周长 y 3 5 3构造方法 构造方法是类中一种特殊的方法 用来初始化该类的一个新的对象 Java中的每个类都有构造方法 如果没有指定构造方法 则系统会调用默认的构造方法 默认的构造方法不带有任何一个参数 构造方法具有和类名相同的名称 而且不返回任何数据类型 在构造方法的实现中 也可以进行方法重写 构造方法负责对象的初始化工作 为实例变量赋予合适的初始值 构造方法必须满足以下语法规则 方法名必须与类名相同 不要声明返回类型 不能被static final synchronized abstract和native修饰 3 5 3构造方法 构造方法可以分为参数化构造方法和隐式构造方法 参数化构造方法即在构造方法中带有参数 隐式构造方法就是系统默认的构造方法 一个类被实例化 也就是被new的时候 最先执行的是构造函数 如果你有留心 你会发现很多类里面根本没有写构造函数 在java类中 如果不显示声明构造函数 JVM会给该类一个默认的构造函数 构造函数的主要作用 一是用来实例化该类 二是让该类实例化的时候执行哪些方法 初始化哪些属性 例 利用构造方法实例 publicclassGou 定义Box类inta 2 intb 3 intc 4 publicGou System out println System out println a b c publicGou inte intf intg a e b f c g System out println System out println a b c publicstaticvoidmain Stringargs Gougg newGou Gougg1 newGou 7 8 9 Gougg2 newGou 11 12 13 无参数构造函数 有参数构造函数 调用构造方法Gou 调用构造方法Gou int int int 注 如果定义类的时候不自己写构成方法 系统编译器会自动给你一个不带参数的构造方法 但是如果自己写了一个带参数的构造方法 系统就不再为你弄那个不带参数了 要自己写哦 否则会出错 3 6基本方法 在面向对象的编程中 方法是对象行为的表现 除了上面介绍的普通方法之外 还有其它类型的方法 如静态方法 最终方法等 方法之间还可以重载 这极大的表现了Java的多态性 3 6 1this this关键字是Java中常用的关键字 可用于任何实例方法内 指向当前对象 也可指向对其调用当前方法的对象或在需要当前类类型的对象引用时使用 this关键字用来处理成员变量和参数重名的情况 例 publicclassExample1inta intb publicExample1 inta intb this a a this b b publicvoidgetA inta this a a System out println this a publicstaticvoidmain Stringargs Example1t newExample1 1 2 System out println 下面输出的是变量值 System out println t a System out println t b System out println 下面调用方法的值 t getA 9 System out println t a 3 6 2方法重载 在Java中 同一个类中的2个或2个以上的方法可以有同一个名字 只要它们的参数声明不同即可 在这种情况下 该方法就被称为重载 overloaded 这个过程称为方法重载 methodoverloading 方法重载是Java实现多态性的一种方式 调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法 这就是多态性 3 6 2方法重载 当一个重载方法被调用时 Java用参数的类型和 或 数量来表明实际调用的重载方法的版本 因此 每个重载方法的参数的类型或数量必须是不同的 虽然每个重载方法可以有不同的返回类型 但返回类型并不足以区分所使用的是哪个方法 当Java调用一个重载方法时 参数与调用参数匹配的方法被执行 在使用重载要注意以下的几点 在使用重载时只能通过不同的参数样式 不能通过访问权限 返回类型 抛出的异常进行重载 方法的异常类型和数目不会对重载造成影响 对于继承来说 如果某一方法在父类中的访问权限是priavte 那么就不能在子类对其进行重载 如果定义 也只是定义了一个新方法 而不会达到重载的效果 publicclassExample1 定义Box类voidtest System out println 没有参数 voidtest inta System out println 值a a voidtest inta intb System out println 值a b a b b doubletest doublea System out println double值a a returna a publicstaticvoidmain Stringargs Example1ex newExample1 doubled ex test ex test 10 ex test 10 20 d ex test 2 2 System out println double值a的平方 d classOverloadDemo voidtest System out println Noparameters voidtest inta System out println a a voidtest inta intb System out println aandb a b doubletest doublea System out println doublea a returna a publicclassGouzao publicstaticvoidmain Stringargs OverloadDemoob newOverloadDemo doubleresult ob test ob test 10 ob test 10 20 result ob test 123 25 System out println Resultofob test 123 25 result 3 6 3静态变量和方法 在Java语言中 没有实际意义上的全局变量 变量最大作用域范围就是类 如果两个类或多个类之间需要共享数据 单纯依靠参数进行传递 就会花费大量的代码去完成 实际上 我们完全可以利用Java语言的静态变量实现数据的共享 在Java语言中 被static关键字修饰的块 方法和变量被称为静态块 静态方法和静态变量 类中的静态变量 方法或代码块属于类 而不属于某个特定的对象 3 6 3静态变量和方法 static修饰符static 静态 修饰符用来修饰类的成员变量和成员方法 以使它们成为静态成员 又称为类成员 静态成员存储于类的存储区 属于整个类 而不属于一个具体的对象 因为静态成员属于整个类 所以它被所有该类对象共享 在不同的类对象中访问静态成员 访问的是同一个 用static修饰的成员变量又称为类变量 不加static修饰的成员变量又叫实例变量 实例变量依附于具体的对象实例 它的值因具体对象实例的不同而不同 类变量为该类的所有对象所共享 它的值不因类的对象不同而不同 用static修饰的方法为静态方法 又叫类方法 无static修饰的方法为实例方法 类方法是该类的所有对象共享的方法 对静态成员的使用一般应注意以下两点 静态方法不能访问属于某个对象的成员变量 而只能处理属于整个类的成员变量 即静态方法只能处理静态变量 可以使用两种方式调用静态成员 它们的作用相同 静态方法不能使用this和super 静态方法不能被覆盖为非静态方法注意 在一个类中 静态方法能够直接调用静态成员变量 而对于实例变量 则必须通过对象名来调用 变量 类名 变量名或类对象 变量名方法 类名 方法名 或类对象 方法名 classExample1 定义Box类staticintx 0 Example1 x publicstaticvoidmain Stringargs System out println Example1 x Example1a1 newExample1 Example1a2 newExample1 System out println Example1 x a1 x 100 System out println Example1 x Example1 x 200 System out println a2 x 类名 静态变量 对象名 静态变量 publicclassex1 staticinti 10 intj staticvoidsetvalue intx j x System out println i voidsetvalue1 intx ex1 setvalue 19 System out println i j publicstaticvoidmain String args ex1 setvalue 9 System out println i setvalue 87 System out println j 3 6 4常量和最终方法 final关键字表示对象是最终形态 对象是不可改变的意思 final在应用于类 方法和变量时意义不同 但本质一样 final表示不可改变 用在变量的前面表示变量的值不可以改变 此时该变量可以被称为常量 final 最终 修饰符用来修饰类 成员方法和成员变量 final的含义为终极或最终 它修饰的类不能被继承 即final类无子类 当在类中定义变量时 如果其前面加上final关键字 其初始化可以在两个地方 一是其定义处 也就是说在final变量定义时直接给其赋值 二是在构造函数中 这两个地方只能选其一 要么在定义时给值 要么在构造函数中给值 不能同时既在定义时给了值 又在构造函数中给另外的值 classExample1 定义Box类finalintx 1 publicfinalvoidgetX x 9 出现错误System out println x publicvoidnum System out println x 1 练习 编程创建一个Point类 在其中定义两个变量表示一个点的坐标值 再定义构造函数初始化为坐标原点 然后定义一个方法实现点的移动 再定义一个方法打印当前点的坐标 并创建一个对象验证 提示 关键代码如下 voidmove intnewX intnewY x newX y newY voidprint System out println name x x y y p print p move 50 50 System out println aftermoving p print callmethodofanobject 3 7继承 继承是面向对象语言的主要特征之一 继承 Inheritance 可以使程序的整个架构具有相当的弹性 更具有层次 并提高了代码的可重用性 并减少了设计程序的难度 在本节中 将会详细介绍继承的概念和使用 3 4 1Java中实现继承 继承是面向对象编程技术的一块基石 因为它允许创建分等级层次的类 运用继承 能够创建一个通用类 它定义了一系列相关项目的一般特性 该类可以被更具体的类继承 每个具体的类都增加一些自己特有的东西 在Java术语学中 被继承的类叫超类 superclass 继承超类的类叫子类 subclass 因此 子类是超类的一个专门用途的版本 它继承了超类定义的所有实例变量和方法 并且为它自己增添了独特的元素 3 4 1Java中实现继承 继承是类和类之间的关系呈现了一个层次的结构 当一个子类继承父类的时候 此时子类就具有了父类的所有的成员 除了父类的私有成员 在Java中继承只允许是单根继承 一个类只能继承一个类 不能一次性的继承多个类 继承类的关键字为extends 继承的语法格式为 classsubClass nameextendssuperClass name bodyofclass classStu 定义Box类Stringname 李丽 Stringsex 女 intid 001 Stu voidshowDetail System out println 从父类中显示信息 System out println 名称 name System out println 性别 sex classStudextendsStu Stud voidshow System out println 从子类中显示信息 System out println 名称 name System out println 性别 sex System out println 学号 id publicclassStudent Student publicstaticvoidmain Stringargs Studs newStud s show s showDetail 3 4 2方法重写和变量隐藏 当子类继承父类时 可以拥有父类的成员方法和成员变量 这样就可以通过子类的实例化对象 调用父类的成员变量和方法 我们知道在子类中 可以创建属于子类自己的成员 如果创建了一个成员方法 该方法名称和父类中某成员方法名称相同 我们把这种情况称为方法重写 overidingmethod 子类如果不想原封不动地继承父类的方法 而是想作一定的修改 这就需要采用方法的重写 方法重写又称方法覆盖 3 4 2方法重写和变量隐藏 在重写方法时 需要遵循下面的规则 参数列表必须完全与被重写的方法相同 否则不能称其为重写而是重载 返回的类型必须与被重写的方法返回类型相同 否则不能称其为重写而是重载 访问修饰符的限制一定要大于被重写方法的访问修饰符 public protected default private 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常 同样 如果子类中创建了一个成员变量 而该变量和父类中的一个变量名称相同 我们称作变量隐藏 classA Stringstr1 初三班班长为 Stringname 刘华 publicvoidgetName System out println str1 name classBextendsA Stringname 刘宏伟 publicvoidgetName System out println str1 name publicvoidgetS System out println str1 publicvoidgetN System out println str1 super name publicclassExtend publicstaticvoidmain Stringargs Bb newB b getName b getS b getN Aa newB a getName 声明父类的一个对象 调用子类实例化 A称为上转型对象 只能使用父类的方法或子类中重写的父类方法 3 4 3使用super 讲到继承 我们不得不要熟悉一个关键字super super关键和this作用类似 能够使被屏蔽的成员变量或者成员方法变为可见 或者说用来引用被屏蔽的成员变量和成员方法 不过super是用在子类中 目的是访问直接父类中被屏蔽的成员 注意是直接父类 就是类之上最近的超类 super有两个用途 一个是访问父类的构造函数 一个是访问被子类的成员覆盖的父类的成员 如被重写的方法和隐藏的变量 关键字super的作用是用来引用它直接的父类 它有两种通用形式 调用父类的构造函数 super 参数列表 注意 每个子类的构造方法都隐含了一条super 语句 用来调用父类的构造方法 若父类中没有无参构造方法 该程序将出错 访问被子类的成员隐藏的父类成员 super 成员 这里的成员既可以是一个方法也可以是一个实例变量 classSuperA intx y SuperA intx inty 父类中的构造方法this x x this y y voidshowXY 父类中的方法showXY System out println 输出的x和y分别是 x y classSubBextendsSuperA 类SubB继承自类SuperAintk SubB intx inty intk super x y 调用父类构造方法 是子类构造方法中第一个可执行语句this k k voidshowXY super showXY 调用父类的方法 System out println 输出的k是 k voidsum System out println 输出的x y k是 super x super y k publicclassSuperDemo publicstaticvoidmain Stringargs SubBsubObj newSubB 10 20 30 subObj sum subObj showXY 子类继承了父类的非私有方法showXY 程序结果 注 派生类初始化在创建派生类的对象时 使用派生类的构造方法对其初始化 不但要对自身的成员变量赋初始值 还要对父类的成员变量赋初始值 Java语言中 子类调用父类构造方法的原则 在子类的构造方法中 系统会自动添加一条语句 super 它将调用父类的无参构造方法 若父类中没有无参构造方法时 会出错 如父类是有参数的构造方法 子类可以通过在自己的构造方法中使用super 参数 来调用它 且该语句必须是子类构造方法的第一个可执行语句 3 8内部类 当在程序的一个类中定义另一个类时 被定义的类就称为嵌套类 Nestedclass 嵌套类的范围由装入它的类的范围限制 例如 如果类ClassB被定义在类ClassA之内 那么ClassB为ClassA所知 然而不被ClassA的外面所知 嵌套类可以访问嵌套它的类的成员 包括private成员 但是 包围类 外层类 不能访问嵌套类的成员 简单的内部类定义如下所示 classA classB 嵌套类一般有两种类型 前加static修饰符的嵌套类不加static修饰符的嵌套类嵌套类最重要的类型是内部类 Innerclass 内部类是非static的嵌套类 它可以访问它的外部类的所有变量和方法 它可以直接引用它们 就象外部类中的其它非static成员的功能一样 这样 一个内部类完全在它的包围类的范围之内 内部类是一个有用的特征 因为它允许将逻辑上同属性的类组合到一起 并在另一个类中控制一个类的可视性 注意 带有static的嵌套类不能直接引用它包围类的成员 只能通过对象来访问 因为有这个限制 所以static嵌套类很少使用 3 8内部类 3 8内部类 创建内部类时 须要注意下面几个原则 一个内部类的对象能够访问创建它的外部类对象的所有属性及方法 包括私有部分 对于同一个包中的其他类来说 内部类能够隐藏起来 将内部类用private修饰即可 内部类可以定义在方法中 称为局部内部类 但它只能使用方法中的final常量 内部类可以被定义为抽象类 非静态内部类不能声明本类的static成员 publicclassInner inta 10 publicvoidgetB Inninn newInn System out println inn b publicvoidgetN Inninn newInn inn getA inn getS privateclassInn intb 5 publicvoidgetA System out println a publicvoidgetS getB publicstaticvoidmain Stringargs Innerinner newInner inner getB inner getN 3 9抽象类 这种超类没有任何具体的实例 只具有一些抽象的概念 这样的类称为抽象类 抽象类介绍在面向对象领域 抽象类主要用来进行类型隐藏 我们可以构造出一个固定的一组行为的抽象描述 但是这组行为却能够有任意种可能的具体实现方式 这个抽象描述就是抽象类 而这一组任意种可能的具体实现则表现为所有可能的派生类 模块可以操作一个抽象体 由于模块继承或依赖于一个固定的抽象体 因此模块中的成员可以不允许修改 同时 通过从这个抽象体派生 也可扩展此模块的行为功能 3 9抽象类 在Java中抽象类的语法格式为 abstract抽象类Demo abstractvoidmethod1 abstractvoidmethod2 一个类之所以成为抽象类 关键在于该类是否包含一个或多个抽象方法 无论该抽象方法是本身具有的还是从别的类继承过来的 一个类或者一个方法如果是抽象的 需要用关键字abstract修饰 抽象类与抽象方法abstract修饰的抽象类需要子类继承 在子类中实现抽象类中的抽象方法 抽象类被派生 抽象方法被子类实现后才有意义 抽象方法是只有返回值类型 方法名 方法参数而不定义方法体的一种方法 抽象方法的方法体在子类中才编写实现 注意 不能用abstract修饰构造方法 静态方法和私有方法 也不能覆盖父类中的抽象方法 抽象方法必须定义在抽象类中 抽象类是一种未实现的类 抽象类不能用new实例化一个对象 例抽象类与抽象方法应用 abstractclassFigure 抽象类doubledimX doubledimY Figure doublea doubleb dimX a dimY b abstractdoublearea 抽象方法 classRectangleextendsFigure Rectangle doublea doubleb super a b doublearea System out println InsideAreaforRectangle returndimX dimY classTriangleextendsFigure Triangle doublea doubleb super a b doublearea System out println InsideAreaforTriangle returndimX dimY 2 classAbstractAreasDemo publicstaticvoidmain Stringargs Rectangler newRectangle 10 5 Trianglet newTriangle 5 8 Figurefigure figure r System out println Areais figure area figure t System out println Areais figure area
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!