精华内容
下载资源
问答
  • C++中继承与多态Java中继承与多态的区别

        因为现在有得开始使用java做课程设计了,发现自己都忘记的差不多了(诶,还是得多多练习哈。)然后,觉得为了突破语言的限制,还是得对比一下我已经学过的语言。这个将是我在大学做的一个长期工作。加油,加油,加油!!!

    java中的继承

        java中的继承使用extends来实现的。继承的时候没有继承的方式限制,默认就是public 继承。那么,java中继承后实现访问控制的就是依据父类中的成员的访问权限来决定的。例如,在父类中有一个成员变量,private int a=10; 那么,你在继承这个父类之后,你在子类中也是没有办法来访问这个变量的。这得提醒大家一误区(可能仅仅只有我之前这么想过)。就是子类没有方法来访问父类的成员,并不是没有继承。也就是说,继承之后,所有的都会继承,没有继承不了的成员这个说法。继承的概念就是,子类会拥有父类所有成员,不管是成员变量还是成员函数。但是,拥有归拥有,能不能是使用就是另一个问题了。就好比你有你父辈那里传下来的一个一个宝藏图,但是没有破译上面文字的方法,那么你还是无法得到上面的宝藏。这里可以给大家看一下这个ideal编译器,在调试的时候,就可以充分说明这一点。
    在这里插入图片描述
    怎么看是否可以访问捏?直接看在子类中直接调用一个父类的private的时候,是否报错,报错说明是不可以引用的。看是看上图:
    在这里插入图片描述
    在这里插入图片描述
    解决这个问题只要把父类中的访问权限设置为protected就好了,当然public也是可以的。

    C++中的继承

        C++中继承的方式有public,protected,private继承。这里是和Java中不一样的。和java中的一样,C++中的继承也都是全部都会继承,这个也是之后C++中的多重继承中引发二义性的一个原因。能否调用就是子类对父类的访问权限的问题。不同的继承方式和原来父类成员的访问权限的组合,会导致子类的访问父类成员的问题。所以,一般来说,使用的还是public继承比较多。我觉得这个也是为什么java就将extends就设计为public的吧。

    C++中的多态

        因为我觉得c++的多态复杂一点,所以先讲。之后,大家才能体会到java帮我们做了一些什么改变。

        C++中实现多态的前提条件。1.有继承;2.重写父类方法 ;3.该方法要被virtual修饰; 4.父类指针或者引用指向子类对象。有了这样的条件后,才可能出现多态。这里多讲一点我老师和我讲的C++的知识点,可能总结的不太对,希望大家多多指正。

            1.因为对于一个指针来说,是有自己的访问范围的。也就是说,一个int型指针只能访问4个字节的空间(假设是在sizeof(int)=4的电脑上),一个 struct student *p的指针,也仅仅只能访问sizeof(struct student)字节的空间。这里和指针仅仅只有4个字节是不相互冲突的(32位机器上)。这个应该是设计者在设计时的用意吧。

            2.我们只能将子类的对象赋值给基类的指针或者引用,此时他们就仅仅与子类对象的内存公用一小块地方。也很好理解,因为我子类对象成员至少是>=父类对象的,所以子类只给一部分给父类(这样好理解一点)。但是对于子类来说,你把父类对象给子类,子类还有很多成员变量没有值,所以这样的操作是不合法的。所以,这个也是为什么在c++中没有加上virtual关键字,你访问的只是子类从父类那里继承过来的函数。这里给出C++书本上的一幅图,就比较好理解了。
    在这里插入图片描述
            但是现实生活中有这样的需求,我们的使用父类的指针或者引用去访问子类自己的函数。但是这个明显就违背了上面我们说的1,2点。但是为了实现这个功能,c++指定者们想到了是用来virtual函数来实现这个功能。至于虚函数实现大概的一个原理是什么,这个我也打算写一篇文章记录一哈。但是今天(2019.4.29)没有写。

        多态的好处大家可以看到了,因为对象本身我们是要在堆内存中开辟一段空间来使用的。但是,有时候我想要既可以访问子类成员,又可以访问父类成员。这个时候就是可以使用多态了!但是缺点就是不能访问子类特有的方法成员。从上面的拍的一张书本上的图可以看到,其实这个指针仅仅只能指向子类从父类那里继承过来的方法和变量。你要它能去动态的访问子类覆写的方法,这个时借助了虚函数。但是子类自己独有的一个函数,父类指针或者引用肯定时访问不到的。上图看:
    在这里插入图片描述
    可看到我上面的代码,我们可以使用强制转化就可以访问了。其实这个也就是Java中的向下转型。一开始学java的时候,还觉得这个名词好高级,还是自己太天真了。
    在这里插入图片描述

    java中的多态

        java中实现多态的前提条件。1.有继承;2.重写父类方法;3.父类引用指向子类对象。可以明显的看到,java中时不要你为函数申明virtual函数的。因为Java内部默认在继承中的函数都是虚函数。这样有好处,也有坏处。因为虚函数的实现,是需要虚表和虚指针的。这样子是会降低速度的。所以c++和c语言的执行速度也是比其他语言快的原因之一。

        其他的和C++区别不大。要访问子类特有的数据的时候也是得向下转型。这里还得注意一点:在C++和java中对于成员变量是没有多态性可言的。你如果一定要访问子类的成员,就得向下转型(c++中强制转化)不然的话,访问的肯定式父类的成员变量。也只有子类的对象赋值给父类的引用。在java中我相信很多老师都是这么说的,java中的多态:
    成员函数:编译看左边,运行看右边。
    成员变量:编译和运行都参考等号的左边。
    静态成员:编译和运行都看左边。(其实对于静态成员没有必要使用对象引用来调用,直接类名调用就好。)
    但是你看了我上面的分析,其实这三句话就不难理解了。

    =========== 我觉得之后应该还有补充,先画一个分割线 ================

    展开全文
  • 当然有些学过java的应该知道,在java中会输出两次in Derived::init() 由于多态的原因。 那为什么在C++中而是一次in Base::init() 一次in Derived::init()呢? 一位大佬解释说 “在基类的构造函数中调用init(),执行...

     

     今天看到一个面试题:下面输出什么

     

     

    答案是:

    in Base::init()
    in Derived::init()

    当然有些学过java的应该知道,在java中会输出两次in Derived::init() 由于多态的原因。

    那为什么在C++中而是一次in Base::init() 一次in Derived::init()呢? 一位大佬解释说 “在基类的构造函数中调用init(),执行程序首先判断出当前对象的实际类型是Base(Derived还没构造出来,当然不会是Derived),所以这里调用的是Base::init()。”

    我又做了如下实验在Base构造函数里面用typeid(this).name 输出当前对象指针的类型,

    输出P4Base。

    然后又在Derive构造函数尝试:

    输出P7Derived。 那解释就很简单了, C++在调用父类函数时,指针类型会退化成父类。所以执行的函数一定是父类的函数。所以是父类的init()。

    那有些人问c++多态时this会是什么类型

    输出是 P4Base , P7Derived。 所以虽然d是Base类型指针,但是在调用虚函数时,转换成Derived类型从而调用Derived的函数。

     

    展开全文
  • 面向对象之多态Java) 面向对象是Java学习中最基础,也是最重要的一部分,其中它的三大特征包括: 封装 继承 多态 今天让我们一起来学习面向对象的三个特征的最后一大特征-- 多态 吧! 何为多态 把子类的实例...

    面向对象之多态(Java)

    面向对象是Java学习中最基础,也是最重要的一部分,其中它的三大特征包括:

    1. 封装
    2. 继承
    3. 多态

    今天让我们一起来学习面向对象的三个特征的最后一大特征-- 多态 吧!


    何为多态

    把子类的实例化对象赋值给父类的引用类型

    1. 继承 Fu f=new Zi(); Pet p=new Dog(); Pet p=new Penguin();
    2. 重写 f.a();

    多态 = 继承 + 重写

    多态的接地气的理解:父类作为形参,子类类型作为实参。


    多态的实现

    • 通过案例学习吧!
    public class Fu {
    
       public void a(){
           System.out.println("父类的实例方法!");
       }
    
       public static void b(){
           System.out.println("父类的静态方法!");
       }
    }
    
    public class Zi extends Fu{
        public void a(){
            System.out.println("子类的实例方法!");
        }
    
        public static void b(){
            System.out.println("子类的静态方法!");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            //测试父类
            Fu f1 = new Fu();
            f1.a();
            f1.b();
            System.out.println("===================");
            //测试子类
            Zi z1 = new Zi();
            z1.a();
            z1.b();
            System.out.println("===================");
            //测试多态
            Fu zi = new Zi();
            zi.a();
            zi.b();   //静态不能被覆盖
        }
    }
    

    运行结果:
    在这里插入图片描述

    我们可以看到,在多态中,子类的实例方法会覆盖父类的实例方法,但是静态方法无法被覆盖,所以调用b(),输出的是父类的静态方法。

    展开全文
  • 什么是多态JAVA多态 方法必须要被所在类或对象调用才有意义 若方法含有参数: 形参:方法声明时的参数。 实参:方法调用时实际传给形参的参数值。 JAVA里将实参数值传入方法的传递机制只有 值传递 在值...

    什么是多态,JAVA 中多态的实现机制

    首先声明啊,这里的多态不是生物学和物理学上的多态性,这个是指编程语言中的多态。

    官方说明:

    • 多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口.
    • 多态是允许你将父对象设置成为一个或更多的他的子对象相等的技术。
    • 我们在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编程的时候并不确定,当处于运行期间才确定。就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。

    看完是不是很懵逼?

    懵逼
    说人话就是:

    允许将子类类型的指针赋值给父类类型的指针,把不同的子类对象都当作父类来看。就比如你在一个京剧世家,有人邀请你们家出个人来唱一出戏,邀请函上写的是你父亲的名字,但很不凑巧你父亲病了,你只能穿上你父亲的戏服,装作你父亲去登台唱戏。台下的人只知道是你们家的人登台,可能你父亲,也可能是你家人代替你父亲。你为了不被发现是代替你父亲,你就要隐藏起来其他技能。这就是多态。


    多态又分为 编译时多态和运行时多态:

    • 编译时多态(静态):重载
    • 运行时多态(动态):重写

    演示代码如下:

     public class Father {	//父类
    
        void sing (){
            System.out.println("我是爸爸,我会唱京剧" + "\n");
        }
    }
    
    class Son extends Father{	//子类,继承父类
        void sing (){
            System.out.println("我是儿子,我会唱京剧" + "\n");
        }
    
        void kungFu (){
            System.out.println("我是儿子,我会武术" + "\n");
        }
    }
    
    class test{	//测试类
        public static void main(String[] args) {
            Father father = new Son();		//多态的表现
            father.sing();
        }
    }  
    

    在使用 “father.” 调用方法时能发现,弹出的方法里根本没有Son类的kungFu方法:
    方法提示框
    运行结果如下:
    结果
    儿子:嘻嘻,没被发现,装父亲成功了!
    描述


    扩展

    1.多态的实现机制

    术语版本:
    我们将引入Java静态分派和动态分派这个概念。

    • 静态分派:所有依赖静态类型来定位方法执行版本的分派动作。静态分派发生在编译阶段,因此确定静态分派的动作实际上不是由虚拟机来执行的,而是由编译器来完成。(编译时多态)
    • 动态分派:在运行期根据实际类型确定方法执行版本的分派动作。(运行时多态)

    简单版本:
    原理也很简单,父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,由于程序调用方法是在运行期才动态绑定的,那么引用变量所指向的具体实例对象在运行期才确定。所以这个对象的方法是运行期正在内存运行的这个对象的方法而不是引用变量的类型中定义的方法。

    如果想深入的同学可以参考可以参考《深入理解Java虚拟机》。

    2.里氏代换原则

    里氏代换原则(LSP): 子类对象能够替换父类对象,而程序逻辑不变。

    里氏替换原则有至少以下两种含义:

    1. 里氏替换原则是针对继承而言的,如果继承是为了实现代码重用,也就是为了共享方法,那么共享的父类方法就应该保持不变,不能被子类重新定义。子类只能通过新添加方法来扩展功能,父类和子类都可以实例化,而子类继承的方法和父类是一样的,父类调用方法的地方,子类也可以调用同一个继承得来的,逻辑和父类一致的方法,这时用子类对象将父类对象替换掉时,当然逻辑一致,相安无事。
    2. 如果继承的目的是为了多态,而多态的前提就是子类覆盖并重新定义父类的方法,为了符合LSP,我们应该将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时,父类就是不能实例化,所以也不存在可实例化的父类对象在程序里。也就不存在子类替换父类实例(根本不存在父类实例了)时逻辑不一致的可能。不符合LSP的最常见的情况是,父类和子类都是可实例化的非抽象类,且父类的方法被子类重新定义,这一类的实现继承会造成父类和子类间的强耦合,也就是实际上并不相关的属性和方法牵强附会在一起,不利于程序扩展和维护。

    如何符合LSP?总结一句话 —— 就是尽量不要从可实例化的父类中继承,而是要使用基于抽象类和接口的继承。


    如有问题欢迎指正
    参考:
    https://blog.csdn.net/sunxianghuang/article/details/52280002
    https://www.zhihu.com/question/27191817/answer/145013324

    展开全文
  • 多态 (Java)

    2020-10-14 16:21:39
    多态 (综合了 继承, 重写, 向上转型) 继承关系的两个类中,有方法重写,父类引用指向子类对象,调用了其中的经过重写的方法,就会发生多态,根据子类实际对象调用对应的方法。(提高程序的扩展性) ...
  • 今天记录一下学习过程中golang与java多态的对比。 一、Golang 在golang中,多态主要是通过接口实现的。 可以按照同一的接口来调用不同的实现,这时接口变量就呈现不同的形态 并且相对于java,少了extends和...
  • 文章传送门:Java基础|1-05-接口与多态 @面向对象篇 内容:导图笔记 | Java后端005(接口与多态) 制作:2021.1.31日 by艾伦
  • 文章目录多态的定义格式多态中成员变量的使用特点成员方法的使用特点使用多态好处 面向对象三大特点:分装性,继承性,多态性。extends继承或者implements接口的实现,是多态性的前提。 一个对象既是子类又是父类...
  • Polymorphism(多态) Java面向对象特征之一 概念 多态,取字面意思就是,多种形态。 同一事物表示出多种不同的形态就是多态。 同一事物表现出多种不同的形态就是多态。 编译时多态 编译时多态:在编译阶段就表现出...
  • 编译期多态和运行期多态(JAVA版)  上一篇讲述了C++中的多态性,由于多态性是面向对象编程中常用的特性,所以JAVA作为面向对象的主流语言自然也有多态性,它的多态性其实和C++的概念差不多,只是实现形式和表现...
  • Java基础知识点(三大特性:封装,继承、多态Java 控制语句,Java容器) 一、封装,继承、多态 封装 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏 信息的操作和访问...
  • java中的多态跟Python中的多态是有区别的。总感觉python 中的多态多少有点牵强。java中的多态定义: 多态存在的三个必要条件 一、要有继承; 二、要有重写;三、父类引用指向子类对象。 前面都好理解,但这第三条。...
  • 起先向单刀直入的解决 Java 泛型的相关概念和应用,发现有一些概念不是很理解,于是发现是被卡在“协变和逆变”的概念上了,接着看,终于发现根源是在 Java多态Java多态 Java多态分为三种情况 ...
  • python中多态java多态

    千次阅读 2014-02-17 14:32:37
    python中多态  A function that can operate on more than one type. If all the operations in a function can be applied to a type, then the function can be applied to a type. 一个函数可以使用在不同...
  • 多态Java 和 C++ 中的实现比较 上文分别对于多态Java 和 C++ 中的实现做了比较详细的介绍,下面对这两种语言的多态实现的异同做个小结: · 单继承情况下,两者实现在本质上相同,都是使用方法表,通过...
  • C++与Java多态的区别同 子类重写父类的函数,程序运行时根据不同对象执行相应函数 异 C++中子类只有重写父类的virtual函数时,此函数才具备多态特性来两个简单列子说明:C++#include <iostream>c
  • 多态 Java

    千次阅读 2019-04-20 19:37:42
    Java中: 同一个方法在不同的对象中体现出来不同的状态 内存中: 父类引用指向子类对象 多态实现的必要条件 1.存在继承关系 2.存在方法重写 3.父类引用指向子类对象 多态访问成员的特点 成员变量: 编译时期:看左边...
  • 8多态-Java编程思想

    2016-09-03 17:04:12
    C语言是前期绑定,Java除了static方式和final方法都是动态绑定。使用final就是声明关闭动态绑定。 将接口与实现分离开来,改善代码的组织结构和可读性,创建可扩展的程序。 封装通过合并特性和行为来...
  • 多态 JAVA

    2016-05-28 23:01:00
    多态Java) 一、多态 1、什么是多态? 不同的对象对于同一个操作,做出的响应不同 具有表现多种形态的能力的特征 2、使用多态的优点 : 为了实现统一调用 二、子类到父类的转换(向上转型) ① 将...
  • java 中除了static方法和final方法(private方法属于final方法)之外,其他的所有方法都是后期绑定   只有非private方法才可以被覆盖   只有普通的方法调用可以使多态的.   当子类对象转换为父类引用时候,任何...
  • 一、封装,继承、多态 ...Java中的多态主要指引用多态和方法多态。 引用多态是指:父类引用可以指向本类对象,也可指向子类对象。引用多态的强大主要体现在调用属性、方法时,可以根据引用具体指向..
  • 题:请举例说明多态Java实际开发中的应用 首先,多态的代码体现在一个子类对象既可以给这个子类的引用变量赋值,也可以给这个子类的父类变量赋值,最终体现为父类引用变量可以指向子类对象。即:父类类型 变量名 ...
  • 上一篇文章初探类的加载和初始化顺序,这一篇文章继续总结在继承的场景中,我们构造对象的...)),给自己解答当年的疑惑,对于虚拟机里面多态的实现机制,我们会在深入java虚拟机。原创不易,转载请注明出处:http://
  • java 多态

    2020-05-19 13:43:02
    java 多态
  • 多态 java 1614787331

    2021-03-04 00:02:55
    多态 java 1614787331 生活中的多态 程序中的多态 多态中的方法覆盖 多态的应用 作为参数的情况 作为返回值的情况 装箱 向上转型 拆箱 向下转型 类型转换异常 判断类型 instanceof 总结
  • class Fu{ int i = 10; } class Zi extends Fu{ int i = 20; } class Test{ public static void main(String[] args) { Fu test = new Zi(); System.out.println(test.i); } }...
  • Java多态

    2021-04-19 09:25:12
    Java多态
  • 代码中过多if、else if语句会使代码维护和阅读带来麻烦,一般超过三个if就可以改为switch,超过十个可以改多态或者一些设计模式,下面是我利用map和多态来消除过多的if语句。 接口: import java.util.Map; ...
  • java多态

    2012-08-29 12:41:29
    java多态
  • 接口多态 java

    2021-03-18 14:34:22
    接口多态 java 编写一个动物类 定义一个子类 狗 定义一个能力 跑 定义一个能力 游泳 让狗具有游泳和跑的能力 测试类 把这个狗的类实例化 关注它自己所具有的方法 多态开始 动物类定义的变量指向狗对象 接口...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 203,154
精华内容 81,261
关键字:

多态的好处java

java 订阅