多态

继承--方法覆盖--多态

依然范特西╮ 提交于 2019-12-16 10:36:22
继承extends java只支持单继承,但是可以间接继承别的类,默认继承Object 继承的作用:代码重用,重要的作用是:方法的覆盖override和多态机制。 多态的前提是继承 向上转型:等号右边是子类 左边是父类 向下转型:等号右边是父类 左边是子类 向上转型:父类引用指向了(等号左边)子类的内存地址 向下转型:强制类型转换所以需要加强制类型转换符 向下转型存在ClassCastException类转换异常,所以需要加instanceof 判断一下类型: Animal a3=new Bird(); if(a3 instanceof Cat){ Cat c1=(Cat)a3; c1.catchMouse(); }else if(a3 instanceof Bird){ Bird b1=(Bird)a3; b1.fly(); } package test; public class Test { public static void main(String[] args) { Animal a=new Animal(); a.move(); Cat c=new Cat(); c.move(); /** * Animal这个是父类 * Cat这个是子类 * 子类向父类转成为自动转换类型向上转 * 在编译期a1是Animal类型 * 在运行期a1是引用指向了Cat *

虚函数

非 Y 不嫁゛ 提交于 2019-12-16 09:19:30
C++中并没有方法的概念。方法(method)实际上是java的概念。在C++中,方法被称为函数。 所以虚方法的准确说法是虚函数。在C++中,是一种特别的类成员函数。 在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体}; 实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。 也就是说被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。 示例代码: #include using namespace std; class Pet{ public: virtual void play() //定义函数为虚函数 { cout<<“它正在玩!”<<endl; } }; class Dog : public Pet //继承Pet类 { public: void play(); }; void Dog::play() { Pet::play(); cout<<“它正在追猫!”<<endl; } int main() { Pet *dog = new Dog; dog->play(); 在这里

Java—(多态、内部类)

我与影子孤独终老i 提交于 2019-12-15 20:14:09
一、多态 多态:可以理解为同一个事物在不同的场合具有不同的形态 分为两种: 编译时多态:在编译期间编译器根据函数实参的类型确定要调哪个函数(这个我们之前已经接触过了,和函数重载差不多,是同名函数,但是参数不同)编译时的多态性是通过函数重载或运算符重载来实现的。 运行时多态:在程序运行期间才会去判断到底会调用哪个函数。这里我们主要讲的就是动态多态。运行时的多态性是通过虚函数与基类指针共同作用实现的。 作用: 静态多态的作用:减少了名字(比如:函数名)的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。 动态多态的作用:多态技术允许将基类指针或基类引用指向子类对象,根据对象的动态类型来决定调用的是哪个子类中的这个同名方法,从而解决了同名覆盖问题,写出了通用的代码,即扩展性优秀的代码,以适应需求的不断变化。 简单举个例子: 猫 x=new 猫(); 动物 y=new 猫(); 1.多态的体现 父类的引用指向自己的子类对象; 父类的引用也可以接收自己的子类对象。 2.多态的前提 必须是类与类之间的关系,要么是继承(extends),要么是实现(implements),通常还有一个前提,就是存在覆盖(重写)。 3.多态的好处 多态的出现大大的提高了程序的可扩展性。但是只能使用父类的引用,访问父类的成员。 4.类型转换(向上转型,向下转型) Anmial a=new Cat();/

《Java编程思想》第八章 多态

纵饮孤独 提交于 2019-12-15 16:00:02
在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。“封装”通过合并特征和行为来创建新的数据类型。多态也成为 动态绑定 , 后期绑定 或 运行时绑定 。 再论向上转型 对象既可以作为它自己本身的类型使用,也可以作为它的基类型使用。而这种把某个对象的引用是为对其基类型的引用的做法被称为向上转型。 传记 方法调用绑定 将一个方调用同一个方法主体关联起来被称作绑定。若在程序执行前进行绑定,叫做 前期绑定 。 后期绑定 就是在运行时根据对象的类型进行绑定。后期绑定也叫做动态绑定或运行时绑定。Java除了static方法和final方法外,其他所有的方法都是后期绑定。 例如,有一个基类Shape以及多个导出类—Circle,Square,Triangle。 向上转型的经典语句就是: Shape s = new Circle(); 这里,创建一个Circle对象,并把得到的引用立即赋值给Shape,这样做看似是错误的,但实际是没有问题的,因为通过继承, Circle 就是一种 Shape 。 缺陷:“覆盖”私有方法 public class PrivateOverride{ private void f(){print("private f()");} public static void main

多态与抽象类

流过昼夜 提交于 2019-12-15 09:01:02
多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。 对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。 Java 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。 继承:在多态中必须存在有继承关系的子类和父类。 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法 来源: CSDN 作者: xiaoxuan2020 链接: https://blog.csdn.net/xiaoxuan2020/article/details/103450610

java面试题

痞子三分冷 提交于 2019-12-15 04:40:07
Java面试题(一) 1、面向对象的特征有哪些方面? 2、访问修饰符 public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 4、float f=3.4;是否正确? 5、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 6、Java 有没有 goto? 7、int 和 Integer 有什么区别? 8、&和&&的区别? 9、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。 10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? 11、switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上? 12、用最有效率的方法计算 2 乘以 8? 13、数组有没有 length()方法?String 有没有 length()方法? 14、在 Java 中,如何跳出当前的多重嵌套循环? 15、构造器(constructor)是否可被重写(override)? 16、两个对象值相同(x.equals(y) == true),但却可有不同的 hashcode,这句话对不对? 17、是否可以继承 String 类? 18

c++类内存分布

两盒软妹~` 提交于 2019-12-14 19:07:17
我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。 工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来: 先选择左侧的C/C+±>命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局。近期的VS版本都支持这样配置。 class Base { int a ; int b ; public : void CommonFunction ( ) ; } ; 然后编译一下,可以看到输出框里面有这样的排布: 这里不想花精力在内存对齐因素上,所以成员变量都设为int型。 从这里可以看到普通类的排布方式,成员变量依据声明的顺序进行排列(类内偏移为0开始),成员函数不占内存空间。 再看下继承,往后面添加如下代码 class DerivedClass : public Base { int c ; public : void DerivedCommonFunction ( ) ; } ; 编译,然后看到如下的内存分布(父类的内存分布不变,这里只讨论子类成员变量的内存分布): 可以看到子类继承了父类的成员变量,在内存排布上,先是排布了父类的成员变量

面向对象特征:继承、多态、封装、抽象

随声附和 提交于 2019-12-14 11:48:41
面向对象特征:继承、多态、封装、抽象 一、继承: 继承是根据已有类创建新类的机制。已有类被称为父类(基类),新类称为子类。子类拥有父类的方法和属性,也有自己特有的方法和属性,子类可以重写父类的方法。 子类只能继承父类的非私有成员变量与方法 ,子类中不能访问私有成员变量和方法,但是子类对象的确包含父类的私有成员 子类不能继承父类的构造函数,但是可以通过super关键字去访问父类构造函数 类只能单继承,接口支持多继承 final修饰的类不能被继承,如:String 加载顺序:父类static修饰的静态代码块>>子类static修饰的静态代码块>>父类构造器>>子类构造器 子类重写父类方法是需要注意: 方法名,参数表一定和父类中的相同,返回类型相同,或者是父类返回类型的子类。 访问权限一定不低于父类的实例方法 抛出的异常一定是父类方法抛出的异常相同,或者是父类抛出异常的子类。 static修饰的方法可以被继承,但是不能重写。因为静态方法可以直接使用类调用,如果子类定义了相同的静态方法则父类的方法会被隐藏。 二、多态 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,因为执行的实例不同得到不同的响应。 多态有三要素: 要有继承关系 要有子类重写父类成员方法 要有父类数据类型引用至子类 多态中的重写是不能够重写成员变量及satic修饰的成员变量或方法

java的今世前生

怎甘沉沦 提交于 2019-12-13 11:45:08
1. java语言是什么? Java是一门面向对象的程序设计语言,它自问世以来,受到了前所未有的关注,并成为计算机移动电话、家用电器等领域中最受欢迎的开发语言之一。 2. Java 语言有哪些特点? 1.简单易学; 2.面向对象(封装,继承,多态); 3.平台无关性( Java 虚拟机实现平台无关性); 4.可靠性; 5.安全性; 6.支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持); 7.支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java语言不仅支持网络编程而且很方便); 8.编译与解释并存; 3. 面向对象和面向过程的区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了; 面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承

[C++系列] 68.多态基础及虚函数、抽象类详解

别说谁变了你拦得住时间么 提交于 2019-12-13 08:59:16
文章目录 1. 多态的概念 1.1 概念 2. 多态的定义及实现 2.1 多态定义的构成条件 2.2 重载、覆盖(重写)、隐藏(重定义)的对比 3. C++11 override 和 final 4. 抽象类 4.2 接口继承和实现继承 1. 多态的概念 1.1 概念 多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优 先买票。 再举个栗子: 最近为了 争夺在线支付市场 ,支付宝年底经常会做诱人的扫 红包-支付-给奖励金 的活动。那么大家想想为什么有人扫的红包又大又新鲜8块、10块…,而有人扫的红包都是1毛,5毛…。其实这背后也是一个多态行为。支付宝首先会分析你的账户数据,比如你是新用户、比如你没有经常支付宝支付等等,那么你需要被鼓励使用支付宝,那么就你扫码金额 = random()%99;比如你经常使用支付宝支付或者支付宝账户中常年没钱,那么就不需要太鼓励你去使用支付宝,那么就你扫码金额 = random()%1;总结一下: 同样是扫码动作,不同的用户扫得到的不一样的红包,这也是一种多态行为 。ps:支付宝红包问题纯属瞎编,大家仅供娱乐。 2. 多态的定义及实现 2.1 多态定义的构成条件 多态是在不同继承关系的类对象,去调用同一函数