多态

014-Java多态-instanceof关键字

▼魔方 西西 提交于 2019-12-10 14:18:59
目录 多态定义 多态的前提 格式 多态的好处 多态访问成员变量的两种方式 在多态的代码当中,成员方法的访问规则 引用类型转换 向上转型 向下转型 为什么要转型 instanceof关键字 感谢关注 多态是继封装、继承之后,面向对象的第三大特性。 生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是这样的状态。 多态定义 多态: 是指同一行为,具有多个不同表现形式。 多态的前提 1.继承或者实现 2. 方法的重写,不重写是无意义的 3. 父类引用指向子类对象 格式 格式: 父类名称 对象名 = new 子类名称(); 或者: 接口名称 对象名 = new 实现类名称(); 父类类型 变量名 = new 子类对象; 变量名.方法名(); 父类类型:指子类对象继承的父类类型,或者实现的父接口类型。 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。 多态的好处 实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展、性与便利。 多态访问成员变量的两种方式 1. 直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。 2.

java多态小笔记

寵の児 提交于 2019-12-10 09:34:55
含义:多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。 需要条件:继承、重写和向上转型 继承:在多态中必须存在有继承关系的子类和父类。 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。 使用:父类引用指向子类对象 举例: 创建父类对象b //父类b class Testb{ void eat() { System.out.println("吃了吗?"); } } 父类b 创建子类c并重写父类eat方法 //子类c class Testc extends Testb{ void eat() { System.out.println("吃了"); } } 子类c 创建子类d并重写父类eat方法 //子类d class Testd extends Testb { void eat() { System.out.println("没吃"); } } 子类d 创建Test测试程序 public class Test { public static void main(String[] args) { //父类引用指向子类对象 Testb b=new Testc(); func(b

多态&抽象类&接口

守給你的承諾、 提交于 2019-12-10 05:04:17
1.多态的使用方式 父类引用指向子类对象 (同一类型的对象引用指向了不同类型的子类对象,具体方法的实现不同) 调用的方法需要是子类和父类都有的,但是执行的是子类的,就是执行医生类覆盖的(重写的)eat方法 也就是所谓的:编译看左边,执行看右边! 能够调用什么方法,取决于引用的类型,而方法中具体怎么执行,要看被转型的类具体实现 person p = new doctor(); p.方法() 当调用不同参数的方法的时候,有限类型更符合的方法进行调用。 而无论这个方法是继承的还是本类所有的。 1、在多态中成员函数的特点: 在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。 在运行时期:参阅对象所属的类中是否有调用的方法。 简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。 在多态中,成员变量的特点: 无论编译和运行,都参考左边(引用型变量所属的类)。 在多态中,静态成员函数的特点: 无论编译和运行,都参考做左边。 也就是说,向上转型之后,调用方法只能够调用父类中有的,而实现的时候,要去实现子类的方法体。 2.关键字instanceof的使用 接收父类类型的参数,判断之后向下转型,进行具体的方法调用 3.多态方法和成员调用的区别 4.多态类型转型问题 5.抽象类 1)抽象方法必须为public或者protected(因为如果为private

C++之多态性与虚函数

北城以北 提交于 2019-12-10 04:03:01
  面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为。在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体。也可以这样说就是实现了“一个接口,多种方法”。   从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性。前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载。后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容。   1.不过在说虚函数之前,我想先介绍一个有关于基类与派生类对象之间的复制兼容关系的内容。它也是之后学习虚函数的基础。我们有时候会把整型数据赋值给双精度类型的变量。在赋值之前,先把整形数据转换为双精度的,在把它赋值给双精度类型的变量。这种不同类型数据之间的自动转换和赋值,称为赋值兼容。同样的,在基类和派生类之间也存在着赋值兼容关系,它是指需要基类对象的任何地方都可以使用 公有 派生类对象来代替。为什么只有公有继承的才可以呢,因为在公有继承中派生类保留了基类中除了构造和析构之外的所有成员,基类的公有或保护成员的访问权限都按原样保留下来,在派生类外可以调用基类的公有函数来访问基类的私有成员。因此基类能实现的功能,派生类也可以。   那么它们具体是如何体现的呢 ?(1)派生类对象直接向基类赋值,赋值效果

C++ 基础语法 快速复习笔记(3)---重载函数,多态,虚函数

北慕城南 提交于 2019-12-10 02:42:10
1.重载运算符和重载函数: C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。 选择最合适的重载函数或重载运算符的过程,称为重载决策。 a.函数重载: 在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。 b.运算符重载: 您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。 详细例子: https://www.runoob.com/cplusplus/cpp-overloading.html 2.多态: 多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 例子: https://www.runoob

复盘:广州某游戏公司后端校招笔试

我只是一个虾纸丫 提交于 2019-12-10 00:04:55
LN游戏笔试复盘 0. 写在前面 这次笔试应该算是我第一次正式的笔试。这次笔试复盘即使为了查漏补缺,也是为了纪念第一次笔试吧。试题是HR和我约好时间通过邮箱给我发送的,是一份word文档。首先要吐槽一下试卷的格式:竟然是用word文档的方式,现在大家不都是使用第三方公司或者自己研发的考试系统嘛= =。算了看一下题目:一共十道题,时间给了40分钟。其中C++基础概念题(简答题)3道,基础算法题7道。整体来说难度不大,但是题量十分巨大! 1. C++基础概念题 请解释封装、继承和多态。 封装:   封装就是将数据和行为相结合,抽象为一个整体,形成一个类。类中的数据和函数都是类的成员。我们可以使一部分成员充当类与外部的接口,而将其它的成员隐藏起来。这样就限制了外部对成员的访问,也使不同类之间的影响度降低。目的在于将对象的使用者和设计者分开,以提高软件的可维护性和可修改性。 继承:   继承就是新类从已有类那里得到已有的特性。类的派生指的是从已有类产生新类的过程。原有的类成为基类或父类,产生的新类称为派生类或子类。子类继承基类后,可以创建子类对象来调用基类函数,变量等。继承是代码重用的重要工具。 多态:   多态就是一个接口,多种实现。具体体现在调用同一个函数名,可以根据需要实现不同的功能。多态分为两种编译时多态和运行时多态。   静态多态(早绑定、编译时多态、重载)

C++ virtual 析构函数

落花浮王杯 提交于 2019-12-09 22:48:11
C++中虚析构函数的作用 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: 有下面的两个类: [cpp] view plain copy #include <iostream> using namespace std; class ClxBase { public: ClxBase() {}; virtual ~ClxBase() {cout<<"AAA"<<endl;}; virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; }; }; class ClxDerived : public ClxBase { public: ClxDerived() {}; ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; void DoSomething() { cout << "Do something in class ClxDerived!" << endl; }; }; int main() { ClxBase *pTest = new ClxDerived; pTest->DoSomething

Java中的第三大特性-多态性

别等时光非礼了梦想. 提交于 2019-12-09 22:19:02
一、多态性的概念   多态性是以继承为基础上的,举个例子,人属于动物,狗也属于动物,所以动物就是父类,而人和狗都是动物的子类,都属于动物。 二、多态的使用   (1)多态一般用于方法参数或者方法返回值,特别当一个方法中功能是人和狗共有的,这时候利用多态性,将参数设为父类,就可以少写一个方法,而且对于代码来说也比较容易拓展。下面举个例子: class Animal{ public void skill(){ System.out.println("动物拥有属于自己的技巧。。。"); } } class Person extends Animal{ @Override public void skill(){ System.out.println("人拥有属于自己的技巧。。。"); } } class Dog extends Animal{ @Override public void skill(){ System.out.println("狗拥有属于自己的技巧。。。"); } } public class Polymorphism { public static void main(String[] args) { Person person = new Person(); Dog dog = new Dog(); //不使用多态性 System.out.println("=====

Effective C++ Notes(读书笔记)

限于喜欢 提交于 2019-12-09 12:05:57
1,视C++为一种语言联邦,大致分为4个部分: A)C。说到底C++仍是以C为基础。区块、语句、预处理器、内置数据类型、数组、指针等等统统来自C。 B)Object-Oriented C++。这部分也就是C with Classes所诉求的:classes(包括构造函数和虚构函数)、封装、继承、多态,虚函数等等。 C)Template C++。这是C++的范型编程部分,tamplates威力强大,它给我们带来了崭新的编程范型,也就是所谓的TMP模板元编程。 D)STL。STL是个template程序库,它对容器、迭代器、算法以及函数对象的规范有极佳的紧密配合与协调,然后template及程序库也可以其他想法建置出来。 2,尽量使用const,enum,inline代替#define A)#define不被视为语言的一部分,属于预处理指令,编译不会计入符号表无法调试。 B)#define在预处理器处理阶段只做简单的替换,这将带来很多预期意外的行为。如 #define MAX(a, b) ((a)>(b)?(a):(b)) 尽管上述宏定义已将变量用括号括起来了,但是还是不能避免MAX(++a, b+10)这样给a所带来的两次不是预期内的自增行为。以为替换为: template<typename T> inline T Max(const T& a, const T& b) {

C#学习—类的高级应用

柔情痞子 提交于 2019-12-09 04:16:50
继承 class News{} class SportNews:News{} 1、C#只允许的单一继承,即一个派生类只能有一个基类。 2、执行流程:先基类后派生。 3、关键字base,可以访问基类成员和基类构造函数 多态 1、类的多态主要表现在方法的多态性。 2、类方法的三种多态形式 (1)定义同名但参数列表不同的方法,为方法的 重载 ; (2)定义同名且参数列表也相同的方法,在基类中定义虚方法(用 virtual /abstract修饰),在子类中同种方法用 override 重写; (3)与上一个形式类似,但基类没有virtual修饰(方法的隐藏),子类新建同名方法前面用 new 修饰。(不常用) 来源: CSDN 作者: 专治BrIM 链接: https://blog.csdn.net/weixin_40626630/article/details/81638855