多态

Java接口与多态

一笑奈何 提交于 2020-02-19 01:56:40
接口 可以理解为一种特殊的类,里面全部是由全局常量(static final)和公共的抽象方法所组成 接口的定义格式 接口的数据成员,只允许被public, static, final修饰。 接口的方法成员,只允许被public, abstract修饰。 Interface 接口名称{   private static final int var1=1; //error   public static final int var2 = 2;   public abstract void fun1();   private abstract int fun2(); //error. } 接口中的数据成员都为static final类型,必须进行初始化,且接口的数据成员的值不能被修改,允许省略static, final关键字。 接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字 public interface A{   int num; //error. 没初始化   String name = “test”;   public void getName( ) {……} //error.不允许定义方法体 } 接口的实现 接口不能用new运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象 与抽象类一样,接口要使用也必须通过子类

c++复习 多态

偶尔善良 提交于 2020-02-19 00:55:27
虚函数 什么是虚函数? 指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用其相应的函数,这个函数就是虚函数,用virtaul修饰函数名。 虚函数的作用是在程序运行阶段动态地选择合适的成员函数 在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型,(参数顺序也要一致),以实现统一接口, 如果派生类中没有重新定义虚函数,则它集成基类的虚函数 虚函数的重写 虚函数的重写:派生类中有一个跟基类的完全相同虚函数,我们就称子类的虚函数重写了基类的虚函数,完全相同是指:函数名、参数、返回值都相同。另外虚函数的重写也叫作虚函数的覆盖。 class Person { public : virtual void BuyTicket ( ) { cout << "买票-全价" << endl ; } } ; class Student : public Person { public : virtual void BuyTicket ( ) { cout << "买票-半价" << endl ; } } ; void Func ( Person & p ) { p . BuyTicket ( ) ; } int main ( ) { Person ps ; Student st ; Func ( ps ) ; Func ( st ) ; return 0 ; } 不规范的重写行为

面向对象的三大特征

南楼画角 提交于 2020-02-18 13:05:51
面向对象这个编程思想主要有三大特征,分别是:封装,继承和多态。 首先什么是封装呢? 是将累的状态信息隐藏在内部,不允许外部程序直接访问操作。换句话说也就是把类中的细节进行包装,对外提供定义好的接口。 那么封装有什么好处呢? 封装对实现细节进行隐藏,使用者需要通过规定的访问来访问数据,这样避免了使用者进行不合理的赋值操作 继承? 什么是继承,在生活中,你可能听说继承遗产啊,子承父业等词,和程序中其实差不多,继承是从已有的类中得到一些需要继承的信息创建新类的过程,提供继承信息的称为父类(超类,基类),接受继承信息的类称为子类(派生类)。 继承有什么好处? 继承使得系统在变化中有了延续性,同时继承也是封装过程中可变的因素。另外通过继承还可以缩小代码量。 多态? 多态是指允许不同的子类类型的对同意消息做出不同的行为。可以这么说把,同样的类型,接收到同样的条件,做出了不同的反馈。举一个例子:老师是父类,语文老师和数学老师都是他的子类,都是老师,当听到上课铃声想起,语文老师去上的语文课,而数学老师上的数学课。 多态的好处? 多态可以大量减少代码量 提高代码的维护性和扩展性 来源: https://www.cnblogs.com/mrluve/p/12325295.html

java 继承 多态(override->重写(=覆盖)、overload->重载、polymorphism -> 多态)

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-17 18:53:56
. package edu.javase.buffer;class demo1 { public demo1() { System.out.println("fun1 constend"); } public demo1(int i) { System.out.println("fun1 int i constend:" + i); } // 重载(同类) public void fun1() { System.out.println("fun1"); } public void fun1(int i, String s) { System.out.println("fun1 int string"); } public void fun1(String s, int i) { System.out.println("fun1 string int "); } public int fun1(int i) { System.out.println("fun1 return int "); return i; } public final void finalfun() { System.out.println("fun1 finalfun"); }}class demo2 extends demo1 { public demo2() { super();// 载入父类构造器

JAVA RTTI

泄露秘密 提交于 2020-02-16 20:34:56
  基础类可接收我们发给派生类的任何消息,因为两者拥有完全一致的接口。我们要做的全部事情就是从派生上溯造型,而且永远不需要回过头来检查对象的准确类型是什么。所有细节都已通过多态性获得了完美的控制。   但经过细致的研究,我们发现扩展接口对于一些特定问题来说是特别有效的方案。可将其称为“类似于”关系,因为扩展后的派生类“类似于”基础类——它们有相同的基础接口——但它增加了一些特性,要求用额外的方法加以实现。如下所示: 尽管这是一种有用和明智的做法,但它也有一个缺点:派生类中对接口扩展的那一部分不可在基础类中使用。所以一旦上溯造型,就不可再调用新方法: 若在此时不进行上溯造型,则不会出现此类问题。但在许多情况下,都需要重新核实对象的准确类型,使自己能访问那个类型的扩展方法。 下溯造型与运行期类型标识:   由于我们在上溯造型期间丢失了具体的类型信息,所以为了获取具体的类型信息——亦即在分级结构中向下移动——我们必须使用 “下溯造型”技术。然而,我们知道一个上溯造型肯定是安全的;基础类不可能再拥有一个比派生类更大的接口。因此,我们通过基础类接口发送的每一条消息都肯定能够接收到。 但在进行下溯造型的时候,我们并不真的知道是什么具体类型。   为解决这个问题,必须有一种办法能够保证下溯造型正确进行。只有这样,我们才不会冒然造型成一种错误的类型。   在某些语言中(如C++),为了进行保证

C++多态

青春壹個敷衍的年華 提交于 2020-02-16 09:51:28
1概念 多态 :不同类型对象调用相同接口完成不同的行为。 1.1覆盖(重写override)成立的三个条件 1.继承 2.子类覆盖(重写)父类虚函数 3.父类指针/引用指向子类 1.2虚函数定义规则: 如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,有无const. 那么 即使加上了virtual关键字,也是不会覆盖。 只有 类的成员函数才能说明为虚函数 ,因为虚函数 仅适合 用与有继承关系的类对象,所以普通函数不能说明为虚函数。 静态成员函数不能是虚函数 ,因为静态成员函数的特点是不受限制于某个对象。 内联(inline)函数不能是虚函数 ,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义,但是在编译的时候系统仍然将它看做是非内联的。 构造函数不能是虚函数 ,因为构造的时候,对象还是一片未定型的空间,只有构造完成后,对象才是具体类的实例。 析构函数可以是虚函数 ,而且通常声明为虚函数。 1.3多态的实现原理分析 当类中声明虚函数时,编译器会在类中生成一个 虚函数表(基类和派生类中各自都会生成一个) 1.4虚函数表 虚函数表是一个 存储类成员函数指针 的数据结构 虚函数表是由 编译器自动生成和维护 的 virtual函数会被 编译器 放入虚函数表中 存在虚函数时,每个对象当中都有一个 指向虚函数表的指针 (vptr指针) 1

python面向对象之多态

安稳与你 提交于 2020-02-16 01:31:11
python面向对象之多态 多态: 同类对象的多种形态(子类化) 实现多态的步骤: 实现继承关系 重写父类方法 使用子类对象执行父类处理 class People : """人""" def dance ( self ) : print ( "跳舞" ) def play ( self ) : # 在不改变该方法的情况下, 让不同人跳不同舞 self . dance ( ) class OldMan ( People ) : """老人""" def dance ( self ) : print ( "跳广场舞" ) class Boy ( People ) : """少年""" def dance ( self ) : print ( "跳街舞" ) p1 = People ( ) p1 . play ( ) laowang = OldMan ( ) laowang . play ( ) # 老人跳广场舞 xiaohu = Boy ( ) xiaohu . play ( ) # 少年跳街舞 来源: CSDN 作者: 鞋子不会飞 链接: https://blog.csdn.net/weixin_45651336/article/details/104317609

Java学习笔记(十一)面向对象---多态

跟風遠走 提交于 2020-02-15 22:17:21
多态的体现 父类的引用指向了自己的子类对象。 父类的引用也可以接受自己的子类对象。 代码体现 abstract class Animal { public abstract void eat(); } class Cat extends Animal { @Override public void eat() { System.out.println("eat fish"); } } class Dog extends Animal { @Override public void eat() { System.out.println("eat bone"); } } class Monkey extends Animal { @Override public void eat() { System.out.println("eat banana"); } } public class Demo { public static void main(String[] args) { /* Animal c = new Cat(); function(c); */ function(new Cat()); /* Animal d = new Dog(); function(d); */ function(new Dog()); /* Animal m = new Monkey();

Java多态性理解

本秂侑毒 提交于 2020-02-15 21:08:07
Java中多态性的实现 什么是多态 面向对象的三大特性 :封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 多态的定义 :指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用) 实现多态的技术称为 :动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。 多态的作用 :消除类型之间的耦合关系。 现实中,关于多态的例子不胜枚举 。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。 下面是多态存在的三个必要条件,要求大家做梦时都能背出来! 多态存在的三个必要条件 一、要有继承; 二、要有重写; 三、父类引用指向子类对象。 多态的好处 : 1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。 2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性

多态

醉酒当歌 提交于 2020-02-15 20:22:19
多态 什么是多态? 概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。 简单的说:就是用基类的引用指向子类的对象。 举个例子: 电脑上的 F1 按键,当不打开任何文件点击 F! 显示的是系统的帮助文档,当打开 word 文档点击 F1 显示的是 word 文档的帮助,同一个按钮但是能实现不同的处理方式。 为什么要用多态? 我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了代码重用。 而多态除了代码的复用性外,还可以解决项目中紧偶合的问题 , 提高程序的可扩展性 . 。 如果项目耦合度很高的情况下,维护代码时修改一个地方会牵连到很多地方,会无休止的增加开发成本,降低耦合度可以保证程序的拓展性。 可替换性( substitutability )。多态对已存在代码具有可替换性。例如,多态对圆 Circle 类工作,对其他任何圆形几何体,如圆环,也同样工作。 可扩充性( extensibility )。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。 开发中在什么地方用多态,怎么实现的多态? 接口实现、抽象类、继承父类进行方法重写