精华内容
下载资源
问答
  • 用最简单的一句话就是:父类型的引用指向子...而我们什么要是有多态呢?首先讲下封装和继承:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面,他把实现的细节影藏起来了,比如你在java中去实现...

    用最简单的一句话就是:父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。这就是多态。

    这句话很好理解:Person person = new Student("张三");但是这个多态有什么作用呢?而我们又为什么要是有多态呢?

    首先讲下封装和继承:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面,他把实现的细节影藏起来了,比如你在java中去实现一个类,这个类中提供了一些功能方法,你只需要知道你需要传递什么样的参数,会达到什么样的效果,实现细节在类中定义好了。从而使得代码模块化;而继承可以扩展已存在的代码模块,而目的就是为了代码重用。

    那么多态除了代码的复用,还可以解耦。然而为什么要解耦?耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。

    多态有什么好处?

    有两个好处:

    1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承

    2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,

    多态在什么地方用?

    可以用在方法的参数中和方法的返回类型中。

    在方法中的参数,请看下面的例子:

    public abstract class Driver

    {

    public void run();//让子类来运行

    }

    class SBenz : Driver

    {

    public void run()

    {

    Console.WriteLine("Benz在以200迈的速度在run");

    }

    }

    class JD : Driver

    {

    public void run()

    {

    Console.WriteLine("JD is running...");

    }

    }

    class Person

    {

    private Driver driver;

    public Person()

    {

    }

    public Person(Driver driver)

    {

    this.driver = driver;

    }

    public void drive()

    {

    driver.run();

    }

    public void setDriver(Driver driver)

    {//运用参数多态,以后不管买什么车都可以

    this.driver = driver;

    }

    }

    static void Main(string[] args)

    {

    Person p = new Person();

    JD jd = new JD();//刚开始没钱就买辆JD吧

    p.setDriver(jd);

    p.drive();

    SBenz benz = new SBenz();//有钱换车了

    p.setDriver(benz);

    p.drive();

    }

    在方法的返回类型中,请看下面的例子:

    上面的例子中,不管是JD还是Benz都是我们自己直接new出来的.我们可以设计一个工厂类,专门生成汽车

    /**

    *   我们将多态使用在方法的返回类型中

    *   Driver可以是抽象类,也可以是接口,JD和Benz分别继承该类或实现该借口

    */

    public class CarFactory

    {

    public Driver factory(String carName)

    {

    if (carName.Equals("JD"))

    {

    return new JD();

    }

    else if (carName.Equals("Benz"))

    {

    return new SBenz();

    }

    else

    {

    Console.WriteLine("对比起,不伺候");

    return null;

    }

    }

    }

    类型的参数.,传入参数的时候,可以传入任何一个类的对象,只要是对应的类的对象名称就可以了

    这就是多态的应用!

    展开全文
  • 多态什么

    2021-01-17 12:23:54
    多态(Polymorphism)按字面的意思就是“多bai种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等...
    1. 多态(Polymorphism)按字面的意思就是“多bai种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。
    2. 多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。
    3. 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
    4. C++中,实现多态有以下方法:虚函数,抽象类,重载,覆盖,模板。
    5. Oc中的多态:不同对象对同一消息的不同响应.子类可以重写父类的方法。
    6. 多态就是允许方法重名 参数或返回值可以是父类型传入或返回。
    7. 把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
    8. 赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。
    9. 举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。
    10. 比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类对象的引用,或者将子对象地址赋给基类指针,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。
    11. 使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象当作基类的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。
    12. 简单的说,建立一个父类的对象,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个对象调用这个函数的时候,定义这个对象的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。通俗点说就是父类不加virtual关键字,那么子类的同名函数将会被覆盖。
    展开全文
  • Java中的多态什么多态? 多态性是面向对象编程的三大重要特征之一,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中...

    Java中的多态:什么是多态?

    多态性是面向对象编程的三大重要特征之一,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

    对面向对象来说,多态分为编译时多态和运行时多态。 其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。

    Java实现多态有 3 个必要条件:继承、重写、父类(或接口)的引用指向子类对象(向上转型)。

    • 继承:在多态中必须存在有继承关系的子类和父类。
    • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
    • 向上转型:在多态中需要将父类引用指向子类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

    下面通过一个例子来演示重写如何实现多态性。例子使用了类的继承和运行时多态机制,具体步骤如下。

    1)创建 Figure 类,在该类中首先定义存储二维对象的尺寸,然后定义有两个参数的构造方法,最后添加 area() 方法,该方法计算对象的面积。代码如下:

    public class Figure {
        double dim1;
        double dim2;
        Figure(double d1, double d2) {
            // 有参的构造方法
            this.dim1 = d1;
            this.dim2 = d2;
        }
        double area() {
            // 用于计算对象的面积
            System.out.println("父类中计算对象面积的方法,没有实际意义,需要在子类中重写。");
            return 0;
        }
    }
    

    2)创建继承自 Figure 类的 Rectangle 子类,该类调用父类的构造方法,并且重写父类中的 area() 方法。代码如下:

    public class Rectangle extends Figure {
        Rectangle(double d1, double d2) {
            super(d1, d2);
        }
        double area() {
            System.out.println("长方形的面积:");
            return super.dim1 * super.dim2;
        }
    }
    

    3)创建继承自 Figure 类的 Triangle 子类,该类与 Rectangle 相似。代码如下:

    public class Triangle extends Figure {
        Triangle(double d1, double d2) {
            super(d1, d2);
        }
        double area() {
            System.out.println("三角形的面积:");
            return super.dim1 * super.dim2 / 2;
        }
    }
    

    4)创建 Test 测试类,在该类的 main() 方法中首先声明 Figure 类的变量 figure,然后分别为 figure 变量指定不同的对象,并调用这些对象的 area() 方法。代码如下:

    public class Test {
        public static void main(String[] args) {
            Figure figure; // 声明Figure类的变量
            figure = new Rectangle(9, 9);
            System.out.println(figure.area());
            System.out.println("===============================");
            figure = new Triangle(6, 8);
            System.out.println(figure.area());
            System.out.println("===============================");
            figure = new Figure(10, 10);
            System.out.println(figure.area());
        }
    }
    

    从上述代码可以发现,无论 figure 变量的对象是 Rectangle 还是 Triangle,它们都是 Figure 类的子类,因此可以向上转型为该类,从而实现多态。

    5)执行上述代码,输出结果如下:

    长方形的面积:
    81.0
    ===============================
    三角形的面积:
    24.0
    ===============================
    父类中计算对象面积的方法,没有实际意义,需要在子类中重写。
    0.0
    
    展开全文
  • 什么多态

    千次阅读 2021-02-09 16:11:26
    多态首先是建立在继承的基础上的,先有继承才能有多态多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。多态成立的另一个条件是在创建子类时候必须...

    文字是复制的百度的,代码是自己敲的,便于理解。黑体字需要重点考虑。
    可以理解一下文字之后,看我敲得代码。

    这是多态的网址

    多态首先是建立在继承的基础上的,先有继承才能有多态。多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。多态成立的另一个条件是在创建子类时候必须使用父类new子类的方式。

    多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。

    简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。

    拓展资料:

    多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。

    多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

    C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。

    OC中的多态:不同对象对同一消息的不同响应.子类可以重写父类的方法。

    多态就是允许方法重名 参数或返回值可以是父类型传入或返回。

    多态也指生物学中腔肠动物的特殊的生活方式。水螅态与水母态的世代交替现象。

    把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

    赋值之后,父类型的引用就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。

    使用继承性的结果就是当创建了一个类的家族,在认识这个类的家族时,就是把子类的对象当作基类的对象,这种认识又叫作upcasting(向上转型)。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。

    简单的说,建立一个父类对象的引用,它所指对象可以是这个父类的对象,也可以是它的子类的对象。java中当子类拥有和父类同样的函数,当通过这个父类对象的引用调用这个函数的时候,调用到的是子类中的函数。

    举个例子:
    比如有一个父类superClass,它有2个子du类subClass1,subClass2。superClass有一个方法func(),两个子类都重写了这个方法。那么我们可以定义一个superClass的引用obj,让它指向一个子类的对象,比如superClass obj = new subClass1();那么我们调用obj.func()方法时候,会进行动态绑定,也就是obj它的实际类型的func()方法,即subClass1的func()方法。同样你写superClass obj = new subClass2();obj.func()其实调用的是subClass2的func()方法。这种由于子类重写父类方法,然后用父类引用指向子类对象,调用方法时候会进行动态绑定,这就是多态。多态对程序的扩展具有非常大的作用,比如你要再有一个subClass3,你需要改动的东西会少很多,要是使用了配置文件那就可以不动源代码了。

    代码:

    父类:
    在这里插入图片描述

    子类:
    在这里插入图片描述

    测试类:
    在这里插入图片描述
    运行结果:
    在这里插入图片描述
    这是因为子类将父类的run()方法重写的缘故。

    后续我会出一些java学习的心得,有兴趣的小伙伴可以关注一下,互相探讨,共同进步。

    展开全文
  • 什么叫多态呢?按照字面意思理解就是多种形态的意思。还是举昨天的那个例子:动物园里动物都得吃食物,兔子吃胡萝卜,猫吃鱼,狗吃肉。同一行为(吃东西),通过不同的事物(兔,猫,狗),可以体现出不同的形态(兔子吃...
  • C#多态的三种实现方式

    千次阅读 2021-02-16 10:18:22
    C#实现多态主要有3种方法,虚方法,抽象类,接口 1 虚方法 ​ 在父类的方法前面加关键字virtual, 子类重写该方法时在方法名前面加上override关键字,例如下面的Person类的SayHello方法 class Person { public ...
  • 多态的本质

    2021-04-12 15:36:23
    要理解多态,不妨我们来举一个例子,比如我们家养了一只宠物,它的名字毛毛,根据这段信息来看的话并不能得出这只毛毛是个什么动物,但是如果说它是发出喵喵喵的叫声,那么根据这个信息我们不难判断毛毛是一只猫咪,如果...
  • 在面向对象的Collection中处处体现泛型和多态的思想,且慢,由于泛型和多态两者之间本身就有一定的相似性,让我们先认清楚泛型和多态之后再进入话题。多态是面向对象最基本的概念之一,即要模糊父类和之类之间的区别...
  • Java基础之多态和泛型浅析一、前言:楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结二、什么多态多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口(这里...
  • java学习日记四之多态

    2021-08-28 09:05:36
    多态是面对对象的一特征,多态就是同一个对象在不同的时刻表现出不同的状态,当父类引用指向不同的子类对象时,它的运行结果也不同。例如:老师让一个班的同学写同一个题目的作文,不同的学生会写出不同的文章,...
  • 展开全部多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实32313133353236313431303231363533e58685e5aeb931333366306538现方式即为多态。引用Charlie Calverts对多态的描述...
  • 请不要解释什么叫多态多态的原理我已经很清楚了。只是暂时还没完全体会到它给我带来的好处,我现在就有个小疑问,比如说下面的程序:classComputer{publicvoidturnOn(){}}classPCex...请不要解释什么叫多态多态...
  • java之多态值得注意的小细节 首先,JVM特性 : 多线程,跨平台,面向对象,自动垃圾回收机制 面向对象特性 : 封装性,继承性,动态性(多态),抽象 多态相关知识点 : 软件设计六大原则 里氏替换原则 : 能够使用父类的地方就...
  • 点击上方「蓝字」关注我们0x01:模板模式模板模式(Template),又叫模板方法模式(Template Method),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方...
  • 什么多态 概念: 多态什么好处? 虚函数的底层实现原理 文章2(直白解析) 1. 概述 2. 虚函数表构造过程 3. 虚函数调用过程 4. 多重继承 5. 菱形继承 虚析构函数的作用及其原理 面试常见问题 内存分布...
  • 继承和多态

    2021-03-26 21:38:17
    3、既实现了数据隐藏,方便继承,实现代码重用。 派生类和基类: 1、派生类的对象可以赋值给基类的对象,是把派生类对应从基类继承来的隐藏对象赋值给基类,反过来不行,因为派生类的新对象无值可赋; 2、可以将...
  • C 和java多态的区别

    2021-02-12 18:52:06
    大家知道在C++中,如果父类中的函数前边标有virtual,才显现出多态。如果父类func是virtual的,则Super *p =new Sub();p->func(); // 调用子类的func如果不是virtual的,p->func将调用父类原来的函数。而在...
  • 什么多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承、多态、重载和重写。继承(inheritance)简单的说,继承就是在一个现有类型的基础上,通过增加新的...
  • Java中的封装,继承和多态(详解)

    千次阅读 多人点赞 2021-05-21 22:07:08
    目录封装继承 封装 所谓的封装就是把类的属性和...在看这张图之前,我们先来看看四者都提到的包,那么包什么呢,包可以简单理解为一个文件夹,把类放到放到包里面,也就相当于是专门的文件夹里面,这不是我们说的
  • Java的多态浅谈

    2021-03-17 20:40:29
    如果非要用专业术语来描述什么多态的话多态是指程序中定义的引用变量所指向具体类型和通过该引用变量发出的方法调用在编译的时候并不确定,而是程序运行期间才确定,就是说一个引用变量到底指向哪一个类的实例对象...
  • 多态

    2021-03-18 09:29:39
    多态 本节目标 多态的概念 多态的定义及实现 抽象类 C++11中的 override 和 final 多态的原理 单继承和多继承关系中的虚函数表 多态的常见面试题 需要声明的,下列的代码以及代码中的解释都是在vs...
  • 面向对象编程及面向对象编程语言的关键就是理解其四大特性:封装、抽象、继承、多态。 1. 封装(Encapsulation) 所谓封装性,封装也叫做信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能...
  • 简单了解java中的多态

    2021-03-10 09:54:59
    我们说到多态,应该肯定会想到java的几个基础特性,下面就对这四大基础特性做简单的了解。一、JAVA的四大基础特性:1、抽象现实生活中的事物被抽象成对象,把具有相同属性和行为的对象被抽象成类,再从具有相同属性...
  • 一、怎么理解JAVA中封装、继承、多态他是一个“司机”,他的平时行为还有“开车”,我们再次划分出了“哺乳动物”这个类,一个类只能继承另一个类(或抽象类)但可以实现多个接口。打个比方封装,“鱼”等等),接着,...
  • python之多态

    2021-05-21 10:01:45
    多态 ​​​​​​​
  • 理解方法覆盖之前,我们回顾一下方法重载(Overload),什么情况下考虑使用方法的重载呢?带着同样的疑问,怎么进行方法的覆盖呢?请看如下代码进行体会: public class People{ private String name; public ...
  • 而面向对象的基本特性就是封装、继承、与多态。一、继承extends 关键字表示继承某个已存在的类,已存在的类称为“超类”、“基类”、或“父类”,而新继承的类称为“子类”、“派生类”。子类可以方...
  • Java多态

    2021-04-09 22:48:08
    * 面向对象特征:封装性、继承性、动态性(多态)、抽象 * * 多态相关知识点: * 软件设计六大原则 * 1 单一职责原则:功能职责单一,只拥抱一种变化 * 2 里氏替换原则:所有在使用父类的情况下,都可以使用子类 * 3...
  • 「Java」继承 & 多态

    多人点赞 热门讨论 2021-05-22 17:48:24
    在很多刚接触面向对象编程初学者来说,可能不太理解这三大特性是什么意思,那么本期博主就围绕三大特性中的继承与多态来介绍。关于封装,博主已经在前面的一篇博客中讲解了,有兴趣的同学可以去看看,链接: Java类和...
  • 反射和多态事实上,反射和多态这两种技术并无直接联系,之所以把它们放在一起说,是因为,在Java技术体系中所提供的能够让我们在运行时识别对象和类的类型信息的方式,一共有两种:即反射和多态关键...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,874
精华内容 17,149
关键字:

多态又叫什么