多态

Java继承与多态

天大地大妈咪最大 提交于 2020-03-05 15:35:58
☆ 继承 ☆ 继承是面向对象思想的三大特性之一,使类与类之间产生特殊 - 一般的关系,即is-a关系。 继承是从已有类中派生出新的类,新的类能吸收已有类的属性和方法,并且能拓展新的属性和行为。 在Java中使用extends关键字表示继承,语法表示为: class 子类 extends 父类{}。 子类被称为派生类,父类又被称为超类。 子类继承父类,表明子类是一种特殊的父类,子类拥有父类的属性和方法,并且子类可以拓展具有父类所没有的一些属性和方法。 子类即使不扩展父类,也能维持拥有父类的操作。 优缺点 优点 提高了代码的复用性 提高了代码的维护性 让类与类之间产生了关系,是多态的前提 缺点 增加了耦合性 OOP思想开发原则:高内聚,低耦合 耦合:类与类之间的关系 内聚:自身完成事情的能力 继承特点 Java只支持单继承,不支持多重继承操作(extends A,B,C…) class A { } class B { } class C extends A , B { } // 错误的,一个子类继承了两个父类,Java中不允许 为什么只支持单继承? 多继承会存在安全隐患,因为当继承的多个类都存在相同的属性或方法名相同方法体不同的方法,子类进行调用时,就会产生不知道该调用哪一个类中的方法的情况。 Java支持多层继承(继承体系) class A { } class B extends A

拥抱函数式编程吧,用得非常爽! 几十年来我都在用面向对象的语言编程。我用过的第一个面向对象的语言是 C++,后来是 Smalltalk,最后是 .NET 和 Java。 我曾经对使用继承、封装和多态充

喜夏-厌秋 提交于 2020-03-05 15:31:37
拥抱函数式编程吧,用得非常爽! 几十年来我都在用面向对象的语言编程。我用过的第一个面向对象的语言是 C++,后来是 Smalltalk,最后是 .NET 和 Java。 我曾经对使用继承、封装和多态充满热情。它们是范式的三大支柱。 我渴望实现重用之美,并在这个令人兴奋的新天地中享受前辈们积累的智慧。 想到将现实世界的一切映射到类中,使得整个世界都可以得到整齐的规划,我无法抑制自己的兴奋。 然而我大错特错了。01 继承,倒塌的第一根支柱 乍一看,继承似乎是面向对象范式的最大优势。 所有新手教程讲解继承时都会拿出最简单的继承的例子,而这个例子似乎很符合逻辑。 然后就是满篇的重用了。甚至以后的一切都是重用了。 我囫囵吞下这一切,然后带着新发现兴冲冲地奔向世界了。 1. 香蕉猴子丛林问题 带着满腔的信仰和解决问题的热情,我开始构建类的层次结构然后写代码。似乎一切皆在掌控中。 我永远不会忘记我准备从已有的类继承并实现重用的那一天。那是我期待已久的时刻。 后来有了新的项目,我想起了另一个项目里我很喜欢的那个类。 没问题,重用拯救一切。我只需要把那个类拿过来用就好了。 嗯……其实……不仅是那一个类。还得把父类也拿过来。但……应该就可以了吧。 额……不对,似乎还需要父类的父类……还有……嗯,我们需要所有的祖先类。好吧好吧……搞定了。没问题。 不错。但编译不过,怎么回事?哦我知道了…

第1月5周3天

做~自己de王妃 提交于 2020-03-05 08:18:28
说话简洁渡 说话清楚 表达清楚 pycharm 默认模板 时间,作者,文件,邮箱,使用的环境 多态 什么是多态 多态在python 中的应用 鸭子类型 封装 广义的封装 狭义的封装 1. 私有的 1.原理 2.使用方式,场景 property classmethod staticmethod issubclass isinstance 继承 提高代码的重用性 作用:当你开始编写两个类时,出现重复代码,要通过继承来简化代码,把重复的代码放在父类里。 这之后继承又规范代码,要求继承父类的子类都实现相同的方法:抽象类,接口。 单继承 重用性,减少代码的重复,子类复用父类的方法 派生:子类在父类的基础上又创建了自己的新的方法和属性 子类中有父类的同名方法,只用子类 还希望用父类中的方法:父类,super调用 派生:子类在父类的基础上又创建了自己的新的方法和属性 抽象类 :只能被继承不能被实例化。作为模板,规则 from abc import ABCMeta,abstractmethod #其他函数写在其他的地方,不在内存里,需要从硬盘上读出来。导入模块 class A(metaclass=ABCMeta): @abstractmethod def func(self):pass 多继承 python c++ 有 java / c# 没有 每个类中有每个类能完成的方法

2019-05-26 java学习日记

左心房为你撑大大i 提交于 2020-03-04 15:25:13
面向对象多态的概述及其代码体现 多态(polymorphic):事物存在的多种形态 多态前提 1,要有继承关系。 2,要有方法重写。 3,要有父类引用指向子类对象。 例子 class Demo1_Polymorphic {   public static void main(String[] args) {     Cat c = new Cat(); c.eat();     Animal a = new Cat(); //父类引用指向子类对象      a.eat(); } } class Animal {    public void eat() {     System.out.println("动物吃饭"); } } class Cat extends Animal {   public void eat() {     System.out.println("猫吃鱼"); } } 多态中的成员访问特点: 成员变量 编译看左边(父类),运行看左边(父类) 成员方法 编译看左边(父类),运行看右边(子类)。 这叫做动态绑定, 编译看父类有没有这个方法,运行是运行子类的。 静态方法 编译看左边(父类),运行看左边(父类)。 (静态和类相关,算不上重写,所以,访问还是左边的) 只有非静态的成员方法,编译看左边,运行看右边 (是通过类名点去调用的) 例子 class Demo2

面向对象

杀马特。学长 韩版系。学妹 提交于 2020-03-04 10:24:25
面向对象 1、面向对象的理解   面向对象(Object Oriented)是一种程序设计的思想。   说面向对象之前,我们先来说说面向过程。来最经典的例子,把大象放进冰箱,1、打开冰箱。2、把大象放进去。3、关上冰箱。嗯,看着很合理,但是需要增加一些新的需求,比如大象放进冰箱以前先转个圈、放进去以后只关一半冰箱门、不放大象了放狮子等等一系列需求时,就需要把代码都捋一遍,再去改逻辑,这样的需求越来越多,那么代码就会越来越乱,难以维护。   于是就诞生了面向对象思想,一切皆对象。我们再用面向对象的思想去看上面的问题,可以拆成两个对象,大象和冰箱,冰箱负责开门关门,大象负责进冰箱,这样以后有新需求或者需求变更,我们只用关心具体的对象。   下面说一下面向对象的三个基本特征是:封装、继承、多态。 2、封装   通过上面的例子我们已经简单的用过封装了,将原本复杂混乱的逻辑,封装成一个个对象。每个对象只做自己的事情。再结合上面的例子,冰箱负责开门,你正常开也行,转个圈开也行,你最后只要把门打开就行;大象负责进冰箱,你跳着进走着进,最后你只要在冰箱里面就行。还有我们经常用的U盘,我们不用管它内部是怎么实现的,只需要用它提供的USB接口就行。   2.1 封装的理解   封装(Encapsulation)指一种实现细节部份包装、隐藏起来的方法。封装是为了防止对实现细节的访问

虚函数和模板的用途区别

半腔热情 提交于 2020-03-04 02:49:49
模板是范型编程的基础,所谓范型编程就是用独立与任何特定类型的方式编写代码 所以简单地说,类是对象的抽象,而模板又是类的抽象,也就用模板能定义出具体类 再理解深刻点 在c++里,常说的多态一般分为两种: 一种是运行时的多态,也就是虚函数体现的多态 另一种是编译时的多态,也就是范型编程的多态,体现在参数的多态 在作用上是为了提高编程效率,其实用其他技术也能达到同样的效果 另外贴一篇讲虚函数的存在意义的知乎回答,写的实在太清楚了: 作者:乌索普 链接:https://www.zhihu.com/question/23971699/answer/84332610 虚函数主要是用来实现多态和多重继承的 没有虚函数理论上也可以实现多态,但是太麻烦了,没有虚函数清晰 主要是在多态上使用。 多态是什么呢: 多态就是一个指针指向子类对象,那么他调用的函数就是子类的对象的。 这就实现了什么? 实现了一个函数会根据传入参数的不同有不同的功能。 函数有多个状态。 就是多态 void fuck (Animal *a); 如果没有多态 那么 这个函数 只能fuck Animal 想要fuck多种 就要用重载,写多个同名函数 参数不同 但是有了多态 他可以fuck所有Animal的子类 比如牛 羊 耗子 什么的 根据传进来的参数不同,fuck不同的动物。 这样这个函数就是fuckAnimalYouWant

虚函数和纯虚函数

﹥>﹥吖頭↗ 提交于 2020-03-03 11:56:43
class A { public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; class B:public A { public: void foo() { cout<<"B::foo() is called"<<endl; } }; int main(void) { A *a = new B(); a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! return 0; }   上诉代码是虚函数的一个例子。其中B类继承A类,由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为"虚"函数。而虚函数只能借助于指针或者引用来达到多态的效果。 纯虚函数 一、定义: virtual void funtion1()=0   纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0" 二、引入原因: 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。   为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法

C#学习——3.虚方法实现多态

坚强是说给别人听的谎言 提交于 2020-03-03 06:57:20
1.虚方法实现多态 在类中某个方法前面加上virtual关键字进行修饰,则表示该方法可以在其派生类中进行重写,当然也可以不重写。因此,可以通过在不同派生类中加override关键字进行重写的方式实现多态的效果。 2.示例代码 using System ; using System . Collections . Generic ; using System . Linq ; using System . Text ; using System . Threading . Tasks ; namespace _5 . 多态 { class Program { static void Main ( string [ ] args ) { Person [ ] pers = new Person [ 5 ] ; pers [ 0 ] = new Chinese ( ) ; pers [ 1 ] = new American ( ) ; pers [ 2 ] = new Japanese ( ) ; pers [ 3 ] = new Chinese ( ) ; pers [ 4 ] = new American ( ) ; foreach ( Person item in pers ) { item . SayNationality ( ) ; } Console . ReadKey (

多态

早过忘川 提交于 2020-03-02 22:23:20
1、子类型转换成父类型,称为向上机制/upcasting,或者称为自动类型转换 2、java语法:父类型引用指向子类型对象 3、java程序永远都分为编译阶段和运行阶段 4、先分析编译阶段,再分析运行阶段,编译无法通过,也无法运行 5、 Animal a2=new Cat(); a2.move(); 编译阶段编译器检查a2这个引用数据类型为animal,由于animal.class字节码当中有move方法,所以编译通过,这个过程称为静态绑定,编译阶段绑定,只有静态绑定成功之后才会有后续的运行。。 在程序运行阶段,jvm堆内存当中真实创建的对象是cat对象,name在运行中移动会调用cat对象的move方法,此时发送了动态绑定,运行阶段绑定。 无论是cat类有没有重写move方法,运行阶段移动调用的是cat对象的move方法,因为底层真实对象是cat对象。 父类型引用指向子类型对象这种机制导致程序存在编译阶段绑定和运行阶段绑定两种不同的形态/状态,这种机制可以成为多态语法机制 6、 a2.catchMouse(); 不能调用,因为a2类型是animal类型,由于animal.class字节码当中没有catchMouse方法,所以编译不通过,静态绑定失败 7、以上问题怎么办? a2是无法直接调用,因为a2类型是animal类型,animal

【2017-04-13】面向对象

谁说我不能喝 提交于 2020-03-02 20:58:49
1、面向对象:一种编程思想。 2、面向对象三大特性,类的特性,类的特点 封装、继承、多态。 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。 所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; 所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式