004 抽象、继承、多态共47页

合集下载

第5章 继承性、多态PPT课件

第5章  继承性、多态PPT课件
• sealed class MyClass •{ •} • 当程序中密封了某个类时,其他类是不能继承该
类的,如代码所示。 • 【本示例参考:\示例代码\Chap05\SealedClass1】
2020/10/13
9
5.2.5 方法的隐藏
• 【本节示例参考:\示例代码 \Chap05\HidingMethod】
• operand is type
• 在上述定义中,当type是一个类,而operand也是该类型、或继承 了该类型、或封箱到该类型中时结果为true;当type是一个接口 类型,而operand也是该类型,或者执行该接口的类型结果也为 true;当type是一个值类型,而operand也是该类型,或者被拆箱 到该类型中时结果也为true。如下面的一个简事例:
• 还有一种方法可以实现在派生类中的覆盖,即new 关键字。这种过程叫做方法的隐藏。但是,派生 类和非抽象类的基类方法必须有相同的方法。代 码演示了如何实现方法的隐藏。
• 运行结果: • Study方法被调用 • Person方法被调用 • 方法隐藏的作用就是可以改变基类的方法。如果
一个派生类型被强制向上转换为基类型,基类型 的方法将被调用。
• C# 2008程序是通过使用名空间来组织的。其不仅 可以是应用程序的内部结构体系,同样也可以是 外部结构体系。如果程序中的一些元素要被导出 到其他程序,可以使用命名空间。程序中免不了 会出现错误,这时就会用到C#语言的异常处理机 制。
2020/10/13
1
5.1 继承机制
• 面向对象的重要机制之一继承是可以使用以前建 造类的方法和属性。通过简单的程序代码来建造 功能强大的类,不仅会节省很多编程时间,而且 还可以减少代码出错的机会。

软件技术《4.4多态》

软件技术《4.4多态》
案例代码
接下来将441小节中文件4-19 改为类的方式进行实现,请查看教材文件4-24。
第五页,共六页。
内容总结
在设计一个方法时,通常希望该方法具备一定的通用性。在设计一个方法时,通常希望该方法具备一定的通用性。例如要实现一个动物叫的方法, 由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫类的叫声,传入犬类对象时就发出犬类的叫 声。在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果
第六页,共六页。
案例代码
下面通过一个例子来演示Object类中toString方法的使用,请查看教材文件4-22。第三页 Nhomakorabea共六页。
44 多态
➢ 在Object类中定义了toString方法,在该方法中输出了对象的根本信息,Object类的toString方法 中的代码具体如下:
➢ 为了方便初学者理解上面的代码,接下来分别对其中用到的方法进行解释,具体如下:
➢ 在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象, 根据被引用子类对象特征的不同,得到不同的运行结果。
案例代码
接下来通过一个案例来演示多态的使用,请查看教材文件4-19。
第一页,共六页。
44 多态
多态的类型转换
➢ 在多态的学习中,涉及到将子类对象当作父类类型使用的情况,此种情况在Java的语 言环境中称之为“向上转型〞,例如下面两行代码:
➢ 在前面多态的讲解中,如果方法的参数被定义为一个接口类型,那么就需要定义一个 类来实现接口,并根据该类进行对象实例化。除此之外,还可以使用匿名类来实现接 口。所谓匿名类就是没有名字的类,外表上看起来它似乎有名字,实际那不是它的名 字。当程序中使用匿名类时,在定义匿名类的地方往往直接创立该类的一个对象。

第4章 继承多态与接口PPT课件

第4章 继承多态与接口PPT课件

my.set(4);
my.display( );
}
}
2020/8/17
第4章 继承、多态与接口
20
4.2.4保护访问控制符
用保护访问控制符(protected)修饰的成员变 量可以被三种类所引用:
该类本身; 与它在同一个包中的其他类; 在其他包中的该类的子类。
2020/8/17
第4章 继承、多态与接口
同一类中 同一包中 可直接访问
不同包的子 其他 类中
可直接访问 可直接访问 可直接访问
可直接访问 可直接访问
可直接访问 可直接访问 可直接访问 可直接访问
注意:表中指的访问限制是指类的修饰符为public的情 况下对成员变量的访问限制。
如果类的修饰符缺省,则只限于在本包中的类才能访 问。可以想像,Java API所提供的类均是public修饰,否 则,在其他包中不能访问其任何成员。即便是public成员 ,若类的修饰不是public,则也限制了其访问。
int y=2;
}
class B extends A
{
void m( )
{ System.out.println("x="+x+" y="+y); }
void f(int x1,int y1)
{ x=x1; y=y1; }
}
public class testDemo
{
public static void main(String args[])
2020/8/17
第4章 继承、多态与接口
3
继承是存在于面向对象程序中两个类之间的种关系(子 类与父类关系)。 (1) 被继承的类称为父类或超类,继承父类或超类的所有

第04章 继承性与多态性

第04章 继承性与多态性

第4章继承性与多态性4.1 继承性与派生4.1.1 继承的概念所谓继承(inheritance)就是利用已有的数据类型定义出新的数据类型。

在继承关系中,被继承的类称为基类(base class)或父类,而通过继承关系定义出来的新类则被称为派生类(derived class)或子类。

派生类既可以对基类的性质进行扩展又可以对基类进行限制,从而得到更加灵活、适用的可重用模块,大大缩短了程序的开发时间。

一个派生类既可以从一个基类派生也可以从多个基类派生。

从一个基类派生称为单继承;从多个基类派生称为多重继承。

1.单继承单继承的定义形式如下:class 派生类名:访问方式基类名{派生类中的新成员};其中,派生类名是新定义的类名。

基类名必须是程序中已有的一个类。

在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类。

例如:class A{...};class B:public A{...};2.多重继承所谓多重继承是指派生类从多个基类中派生而来的。

定义多重继承类的方式如下:class 派生类名:访问方式1 基类名1,访问方式2 基类名2……{派生类中的新成员};例如:class A{...第4章继承性与多态性·21·};class B{...};class C:public A,public B{...};从定义格式上来看,多重继承与单继承的区别主要是多重继承的基类多于一个。

3.访问方式不管在单继承还是在多重继承的定义格式中,访问方式,即继承方式,可以为public、private或protected,如果省略,则默认为private方式。

访问方式为public方式时,这种继承称为公有继承;访问方式为private方式时,这种继承称为私有继承;访问方式为protected方式时,这种继承称为保护继承。

4.1.2 派生类的生成过程在给出了派生类的定义和相应成员函数的实现代码后,整个派生类的定义就算完成了,这是就可以利用该类定义相应的对象处理实际问题了。

实验四 多态和抽象

实验四 多态和抽象
e.draw();
}
}
由于子类继承了父类除私有以外的所有属性,所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。
public class TestDemo{
publicstatic void printInfo(TestDemot){
System.out.println(t);
实现继承功能
用于功能实现,实现多重继承
DemoInterface dif=new DemoInterface();
dif.setRadius(3.6);
System.out.println(“圆的面积为:”+dif.getArea()); //输出圆的面积
}
}
三、接口和抽象类比较
比较项目
抽象类
接口
关键字
abstract
interface
interface Circle{ //定义接口
double PI=3.14159; //常量定义
void setRadius(double radius); //定义抽象方法
double getArea(); //定义抽象方法
}
public class DemoInterface implements Circle{ //定义类,并实现接口
成员变量
没有限制
都是常量,必须同时使用public、static和final修饰符。默认为常量
成员方法
至少有一个抽象方法
所有方法均为抽象方法,必须同时使用public、abstract修饰符。默认为抽象方法
构造方法
允许定义构造方法
不能定义构造方法
父类个数
只能由一个直接父类

Abstract封装,继承,多态

Abstract封装,继承,多态

Abstract封装,继承,多态封装:把⼀些数据(字段,属性) 和⾏为(⽅法) 包裹在⼀个单元---Class⾥;对外屏蔽细节(private...);对内公开⼀些属性和⽅法,具体是怎么做的不需要告诉⽤户。

访问修饰符:public 公开访问protected ⼦类访问internal 当前类库访问protected internal ⼦类且是当前类库访问private 私有访问继承:通过继承,⼦类可以拥有⽗类⼀切的属性和⽅法,任何⽗类出现的地⽅都可以⽤⼦类代替。

英⽂原话其实说的是:The Liskov Substitution Principle :(LSP, lsp) is a concept in Object Oriented Programming that states: Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.使⽤任何⽗类指针或者引⽤的地⽅都可以⽤⼦类来替换⽽不⽤知道⼦类是什么。

还可以增加⼀些⽗类没有的属性和⽅法。

好处:代码的重⽤多态:多态是⾯向对象的重要特性,简单点说:“⼀个接⼝,多种实现”,就是同⼀种事物表现出的多种形态。

⾮虚⽅法的调⽤,由编译时决定虚⽅法的调⽤,由运⾏时决定ParentClass instance = new ChildClass();monMethod(); 普通⽅法的调⽤(⾮虚⽅法),调⽤⽗类的,由⽗类指针决定。

instance.VirtualMethod(); 虚⽅法的调⽤,调⽤⼦类的,运⾏时决定。

instance.AbstractMethod(); 抽象⽅法的调⽤,⽗类未实现,调⽤⼦类的。

1using MyAbstract.Abstract;2using System;3using System.Collections.Generic;4using System.Linq;5using System.Text;6using System.Threading.Tasks;78namespace MyAbstract9 {10///<summary>11///封装12///</summary>13public class People14 {15public int Id { get; set; }16public string Name { get; set; }17protected int Salary { get; set; }1819///<summary>20///呼吸:其实是⾝体多个部位协同⼯作的21///</summary>22public void Breath()23 {24 Console.WriteLine("Breath");25 }2627// 呼吸28//public29//protected ⼦类访问30//internal 当前类库访问31//protected internal32//private33 }34///<summary>35///学⽣36///</summary>37public class Student : People38 {39public new void Breath()40 {41 Console.WriteLine("Breath");42 }4344private int Tall { get; set; }4546public void Study()47 {48//base.Salary49 Console.WriteLine("学习.Net⾼级开发");50 }51public void PlayLumia(Lumia phone)52 {53 Console.WriteLine("This is {0} play {1}", , phone.GetType());54 phone.Call();55 phone.Photo();56 }57public void PlayiPhone(iPhone phone)58 {59 Console.WriteLine("This is {0} play {1}", , phone.GetType());60 phone.Call();61 phone.Photo();62 }6364public void PlayiPhone(Oppo phone)65 {66 Console.WriteLine("This is {0} play {1}", , phone.GetType());67 phone.Call();68 phone.Photo();69 }7071///<summary>72///⾯向基类73///</summary>74///<param name="phone"></param>75public void PlayPhone(AbstractPhone phone)76 {77 Console.WriteLine("This is {0} play {1}", , phone.GetType());78 phone.Call();79 phone.Photo();80 }8182public void PlayPhone<T>(T t) where T : AbstractPhone//基类83 {84 Console.WriteLine("This is {0} play {1}", , t.GetType());85 t.Call();86 t.Photo();87 }8889 }9091///<summary>92///⽼师93///</summary>94public class Teacher : People95 {96private int Tall { get; set; }9798public void Teach()99 {100 Console.WriteLine("教授.Net⾼级开发");101 }102103public void PlayiPhone(iPhone phone)104 {105 Console.WriteLine("This is {0} play {1}", , phone.GetType());106 phone.Call();107 phone.Photo();108 }109 }110 }View Code-----------------------------------------------------⽅法类型:void,int...普通⽅法----⼤家都是⼀样的virtual 虚⽅法(可以⽤override重写)---⼤家都有,但个别⼦类不⼀样,需要重写。

Java第04章--1(继承和多态)

存在的多继承关系是采用接口(interface)类型实现的。
所有类都是从系统提供的放在ng程序包中的Object类
继承而来,Object类是所有类的顶级类。换句话说,每个类都 有直接超类,若有的类没有指明它的直接超类,例如我们在以 前所写的许多类,都隐含着直接超类Object。
处于继承链上某个类不仅拥有所有上层类的字段,更重要的
③ 子类对象可以看成其超类的一个实例。
不管是直接子类还是那一层的间接子类,它们的对象都可以看成Point类的对 象,这是实现多态性的重要基础。就象一个大家族的祖师爷,他的子子孙孙 都看成是该家族的一员。
④ 与①的转换相反,把父类的对象引用赋给子类的对象引用必
须用强制类型转换。换句话说,让子类的对象引用去处理父类 的对象,由于子类是父类信息的扩展,不把子类的对象引用强 制转换成父类的对象引用类型,编译时将出现“不兼容的类型” 的错误信息( incompatible types)。
因为访问控制修饰符可以实现继承树中的严密封装,加上Java还 增加有程序包的隐藏机制。
由于子类将继承超类的所有字段(包括成员变量和常量)和
方法,不管它们是公有的、私有的、还是保护的,即超类的所 有字段和方法都自动成为子类的字段和方法,因此,子类体内 只需写出新增的字段和方法。
例如,父类Point的所有公有方法自动成为其子类Circle的公
成员变量,其中,点坐标由Point类继承而来。 这里,Circle 类是Point类的子类(subclass),而Point类是Circle类的直接 超类(direct superclass)简称超类或父类。
在实际编程时通常是一个类编写成一个源代码文件,这样每
个类都可以定义成公有类便于大家共享,

第四章.类的继承和多态


using System ; class Vehicle //定义交通工具(汽车)类 { public int wheels ; //公有成员:轮子个数 protected float weight ; //保护成员:重量 public Vehicle( ){;} Vehicle 作为基类,体 public Vehicle(int w,float g){ 现了"汽车"这个实体具有的 wheels = w ; 公共性质:汽车都有轮子和 weight = g ;} 重量。 public void Speak( ){ Console.WriteLine( “交通工具的轮子个数是可以 变化的! ” ) ;} } class Car:Vehicle //定义轿车类:从汽车类中继承 { int passengers ; //私有成员:乘客数 public Car(int w , float g , int p) : base(w, g) { wheels = w ;weight = g ; passengers=p ; Car 类继承了Vehicle 的 } 全部性质,并且添加了自 } 身的特性:可以搭载乘客
基类继承的成员,因此可以将派生类的值赋给基类对象。
4.2 抽象类和封闭类
4.2.1 抽象类 用关键字abstract修饰的抽象类是一种没有被 完整定义的类,因而它不能用来实例化,或者说,不 能产生对象,设计abstract类的目的是为了被继承, 其意义在于: 1、包含派生类的公有成员,这些成员在抽象类 中定义一次,就可以被反复使用,提高了软件开发的 效率和可维护性 2、规范行为,抽象方法等具体行为特征的成员 实际上是一种建模过程,规定了输入口和输出口,而 将实现的细节留给派生类根据实际情况编程。 同一个抽象类的派生类有许多共性,这使得它 们有了交互的基础。

第4章 继承、多态与接口

Java多态性的两个重要语言机制:方法的覆盖(或重 构)和方法的重载
(1) 如果在同一个类中定义了多个同名的方法,他 们或有不同的形参个数或有不同的形参类型,则称该方 法被重载。在调用时,Java将根据实参个数类型选择匹 配的方法。
2021/7/16
23
签名(signature):就是方法的名称、参数个数及参数 形态的总称。
而重载的方法之间虽然方法名相同,但参数的个 数、参数类型和返回值都不同(签名不同)。不能用方法 返回类的不同来区别方法的重载。
(2) 如果在直接子类中定义的某个方法与其直接超类 的某个方法有相同的名称和参数,则称该子类重构了该 超类的方法,重构也称覆盖。
2021/7/16
24
演示方法的重载
class DemoOverload
如果类的修饰符缺省,则只限于在本包中的类才能访
问。可以想像,Java API所提供的类均是public修饰,否 则,在其他包中不能访问其任何成员。即便是public成员 ,若类的修饰不是public,则也限制了其访问。
2021/7/16
22
4.3 多态性
多态性是程序中统一操作在不同的环境中有不同解 释的现象。它提供了是同一程序有很强的适应不同环境 能力的描述机制。
第4章 继承、多态与接口
4.1 继承
4.1.1 Java继承的实现
1、继承的概述 类的继承是面向对象的程序设计语言所具有的重要技
术。引入继承机制就是利用现有的类来定义新的类。这是 面向对象程序设计的一个原则:不必每次都从头开始定义 一个新的类,而是将这个新的类作为一个或若干个现有类 的扩充或特殊化。如果不使用继承,每个类都必须显式地 定义它所有的特征。然而使用继承后,定义一个新的类时 只需定义那些与其他类不同的特征,那些与其他类相同的 通用特征则可从其他类继承下来,而不必逐一显式地定义 这些通用特征。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档