第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

第五章 类的继承和派生 Inheritance/extends/derive. 教学目标 理解继承的概念和作用 派生类的定义 理解访问修饰符 protected 方法的重写 继承下的构造函数的使用 继承下的 finalize 方法的使用 理解超类和子类的关系.
多元評量與 Greenfoot 簡介 南港高中高慧君. 演講大綱 多元評量 高中階段程式設計教學目標與困境 Greenfoot 快速入門 – 袋熊吃樹葉 – 沙灘螃蟹 Greenfoot 臺灣社群介紹 2.
系統分析與設計 楊子青 H-1 H 、物件導向技術 n 物件導向的基本概念 – 物件、類別 – 封裝、繼承 – 同名異式 ( 多型 ) 、超荷 ( 過載 ) n 物件導向分析與設計及塑模工具 n UML 塑模工具.
第3-2章 类与 对象 Java类的特性 教学内容: 类的私有成员与公共成员 方法的重载 构造方法 实例成员与静态成员 重点: 重载 难点:
Java语言的特点 Java开发环境的搭建
单元二:面向对象程序设计 任务二:借书卡程序设计.
第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
项目6 通用堆栈.
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
面向对象的程序设计(一).
面向对象程序设计(Java) 徐志红
第一章 面向对象程序设计.
類別與物件 Class & Object.
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
第7单元 面向过程编程—— 继承与多态.
Ch07 介面與多重繼承 物件導向程式設計(II).
第5章 进一步讨论对象和类.
1 Department of Computing.
第三章 控制结构.
再回首: Java关键字 数据类型:byte boolean char double float int long short ,
Ch08 巢狀類別 物件導向程式設計(II).
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
H、物件導向技術 物件導向的基本概念 物件、類別 封裝、繼承 同名異式(多型) 、超荷(過載) 物件導向分析與設計及塑模工具 UML塑模工具.
物件導向程式設計 (Object-Oriented rogramming)
第四章 在 C# 中实现 OOP 概念.
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Java基础 JavaSE异常.
Classes Lecturer: 曾學文.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第六章 类的扩展与继承.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
Java语言程序设计 第五部分 Java异常处理.
第9章 類別圖與物件圖 9-1 類別圖與物件圖的基礎 9-2 類別圖的符號 9-3 類別關係 9-4 物件圖 9-5 繪製類別圖與物件圖
Java程序设计 第9章 继承和多态.
Ch01 物件與類別複習 物件導向系統實務.
C#面向对象程序设计 $7 继承和多态性.
類別的繼承 Vehicle Car.
SPOTO TM JAVA课程 JAVA中的OO语法
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Ch02-基礎語法.
C/C++/Java 哪些值不是头等程序对象
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
龍老師我不會Debug QQ.
辅导课程十一.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
Class 2005/05/25.
辅导课程十二.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
判斷(選擇性敘述) if if else else if 條件運算子.
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖

目标 理解继承的概念 掌握通过父类创建子类的方法 理解子类和父类构造方法的执行顺序 掌握实现方法覆盖的方法

面向对象特性概述 继承、封装、多态是面向对象程序设计的3个重要特性。 通过继承,以既有类为基础,派生出新类,达到代码重用的目的; 通过封装,对类对象的数据成员进行访问控制,起到数据保护的作用; 通过多态,程序能够动态的匹配同名方法,使程序更加灵活。

继承的基本概念 继承是一种由已有的类创建新类的机制。利用继承,可以先创建一个公有属性的一般类,根据一般类再创建一个具有特殊属性的新类。 新类继承一般类的状态和行为,并根据需要增加它为自己的新的状态和行为。 由此继承而得到的类为子类,被继承的类为父类(超类)。JAVA不支持多继承(子类只能有一个父类)。

人 学生 教师 教辅人员 外语系学生 计算机系学生 旅游系学生 计算机网络专业学生 软件技术专业学生 计算机多媒体专业学生 计算机教育专业学生

class Person // 定义Person类 { protected String name; protected String sex; protected int age; ……Person类的方法 } 通过Person类派生出Student类。Student类继承自Person类,拥有Person类的所有方法和属性。 class Student extends Person { private String department;//系别 private String specialty;//专业 ……Student类的方法 } 通过关键字extends实现继承

Person类的定义 // Ex6_1.java class Person // 定义Person类 { protected String name; //姓名 protected String sex; //性别 protected int age; //年龄 public void register(String n,String s,int a) //设置数据成员 { name=n; sex=s; age=a; } String getName()//获取姓名 { return name; } String getSex()//获取性别 { return sex; } int getAge()//获取年龄 { return age; } public void showMe()//显示人员信息 { System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age); } }

通过extends关键字,由Person类派生出Student类 class Student extends Person { //定义Student类,是Person类的子类。 private String department;//系别 private String specialty;//专业 public void studentRegister(String n,String s,int a,String dep,String spe) { //设置数据成员 register(n,s,a); department=dep; specialty=spe; } String getDepartment()//获取学生所在系 { return department; } String getSpecialty()//获取学生所学专业 { return specialty; } public void showStudent()//显示学生类数据成员 { System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age+",系别:"+department+",专业:"+specialty); 通过extends关键字,由Person类派生出Student类

姓名:张三,性别:男,年龄:18,系别:计算机,专业:软件开发 public class Ex6_1 { public static void main(String args[]) Student student1=new Student(); student1.studentRegister("张三","男",18,"计算机","软件开发"); student1.showStudent(); } 运行结果: 姓名:张三,性别:男,年龄:18,系别:计算机,专业:软件开发 程序分析: 本例中的Person类是父类,它派生出子类Student类。Student类继承了Person类的name属性,sex属性,age属性,GetName()方法,GetSex(),ShowMe()方法等。同时,Student类对Person类进行了功能扩展,又增加了department,specialty属性和GetDepartment()、GetSpecialty()、ShowStudent()等方法。

说明 继承能够使子类拥有(继承)父类的非私有属性和方法(即可以继承public、protected和默认访问属性的成员),而不需要在子类定义时重新定义父类中的这些同名属性和方法。当修改父类中的某个属性和方法时,子类中也会同样得到修改。这样,就可以省去重复定义成员的烦琐,实现代码重用,同时提高了代码的可维护性。 一个父类可以有多个子类,这些子类都是父类的特例,父类描述了这些子类的公共属性和方法。一个子类可以继承它的父类(或祖先类)中的属性和方法,这些属性和方法在子类中不必定义,子类中还可以定义自己的属性和方法。

创建子类的语法格式 [访问权限] class 子类名 extends 父类名 { 类体定义; } “访问权限”是指public,private,protected等;子类名和父类名通过关键字extends联系在一起,形成继承关系

构造方法的继承 通常在定义一个新类的时候,会定义一个相应的构造方法,用来对数据成员进行一些初始化。 构造方法是在创建对象时自动调用,并执行构造方法的内容,构造方法不需从程序直接调用,而是在对象产生时自动执行。 构造方法没有返回值,名称必须与类的名称相同之外。 假如在一个类中定义了构造方法,而由这个类派生出来的子类也定义了构造方法,那生成新的子类对象的时候,构造方法是怎样执行的呢?

Person类的构造方法,输出了字符串“Person() constructor is called!” // Ex6_2.java class Person // 定义Person类 { protected String name; //姓名 protected String sex; //性别 protected int age; //年龄 public Person() System.out.println("Person() constructor is called!"); } public void register(String n,String s,int a)//设置数据成员 name=n; sex=s; age=a; public void showMe()//显示人员信息 System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age); Person类的构造方法,输出了字符串“Person() constructor is called!”

子类Student类的构造方法,用于输出“Student() constructor is called!” class Student extends Person //定义Student类,是Person类的子类 { private String department;//系别 private String specialty;//专业 public Student()//定义学生类的构造方法 System.out.println("Student() constructor is called!"); } public void studentRegister(String n,String s,int a,String dep,String spe) register(n,s,a); department=dep; specialty=spe; public void showStudent()//显示学生类数据成员 System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age+",系别:"+department+",专业:"+specialty); 子类Student类的构造方法,用于输出“Student() constructor is called!”

public class Ex6_2{ public static void main(String args[]){ Student student1=new Student(); student1.studentRegister("张三","男",18,"计算机","软件开发"); student1.showStudent(); } 运行结果: Person() constructor is called! Student() constructor is called! 姓名:张三,性别:男,年龄:18,系别:计算机,专业:软件开发 Person类定义了一个无参构造方法,输出“Person() constructor is called!”。通过Person类派生出了Student类,Student类中也定义了一个无参构造方法,将输出“Student() constructor is called! ”。通过输出结果,明显看出,创建Student对象时,在执行Student类的构造方法之前,调用了Person类的构造方法。这样的执行顺序可以保证子类对象从父类对象继承得到的成员能够进行正确的初始化。

覆盖 覆盖是指在子类中,利用完全相同的方法名,返回类型和参数,重新实现父类的某一成员方法。 当需要对象响应同样的方法,但与超类中原来的方法有不同行为时,需要超越(抑制)该方法。用新的方法体取代原来的方法,但使用相同的方法名 在Ex6_1.java中,Person类通过showMe()方法显示人员信息,而子类Student类通过showStudent()方法显示人员信息。 这两个方法都是用来显示人员信息,只是显示的项目不同而已。实际上,在定义Student类方法的时候,可以定义showMe()方法将父类的showMe()方法覆盖。

覆盖示例 class Person { // 定义Person类 protected String name; //姓名 protected String sex; //性别 protected int age; //年龄 public Person() { } //构造方法 public Person(String n,String s,int a) { name=n; sex=s; age=a; } public void showMe() { //显示人员信息 System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age); 覆盖示例 父类Person中定义了showMe()方法,用来输入类对象基本信息

覆盖示例(续) 由Person类派生出的Student类中重新定义了showMe()方法,覆盖了父类Person类的showMe()方法。 class Student extends Person { //定义Person的子类:Student private String department;//系别 private String specialty;//专业 public Student(String n,String s,int a,String dep,String spe) { name=n; sex=s; age=a; department=dep; specialty=spe; } public void showMe() {//显示学生类数据成员 System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age+",系别:"+department+",专业:"+specialty); 由Person类派生出的Student类中重新定义了showMe()方法,覆盖了父类Person类的showMe()方法。

覆盖示例(续) public class Ex6_3 { public static void main(String args[]) { Person person1=new Person("王兰","女",16); person1.showMe(); Student student1=new Student(“张三”,“男”,18,“计算机”,“网络"); student1.showMe(); } 运行结果: 姓名:王兰,性别:女,年龄:16 姓名:张三,性别:男,年龄:18,系别:计算机,专业:网络 子类中所定义的showMe()方法覆盖了父类的showMe()方法。例6.1中,Person类对象和Student类对象分别调用showMe()和showStudent()方法才能显示各自信息。本例中,两者都可使用showMe()方法显示信息。 利用“覆盖”技术,在子类中可定义和父类中的名称、参数个数与数据类型均完全相同的方法,用以取代父类中原有的方法。

作业 习题6 ——7题、8题、 实验 实验三 类的简单应用