多态

Java多态的一些陷阱

丶灬走出姿态 提交于 2020-01-14 10:00:11
Java多态是如何实现的? Java的多态和C++一样,是通过延时绑定(late binding)或者说运行时绑定(runtime binding)来实现的。当调用某一个对象引用的方法时,因为编译器并不知道这个引用到底指向的是变量声明时说明的类型对象,还是该类型子类的对象。因此编译器无法为这次调用绑定到具体的某个方法。只有通过java中的运行时类型识别(RTTI, Runtime type identification)在运行时绑定到具体的方法。下面是一个具体的例子: class shape { public void draw() { print("shape"); } } class triangle extends shape { public void draw() { print("triangle"); } } public class Polymorphism { public static void main(String[] args) { shape s=new triangle(); s.draw(); } 结果是triangle s是一个shape引用,但是在运行时因为是triangle对象,所以还是调用了triangle的draw方法。 Java多态中的一些陷阱 重写私有方法? Java里面是不能重写私有方法的,这个其实很好理解

读《java编程思想》8-多态

落花浮王杯 提交于 2020-01-14 09:59:34
多态的作用是消除类型之间的耦合关系。(依赖于父类,减少子类耦合) 多态也称为动态绑定、后期绑定或者运行时绑定。 1、什么是多态 (1)将一个”方法调用“同一个”方法主体“关联起来称为绑定。 (2)在程序执行前进行绑定(比如编译时),叫前期绑定, C语言属于前期绑定。 (3)在运行时根据对象的类型进行绑定,叫做后期绑定或动态绑定,即为多态,java中除了static方法和final方法(private方法属于final)之外,其他方法都是后期绑定。即 static方法和final方法没有多态。 (4)任何域访问操作都将由编译器解析,属于前期绑定。即 直接访问成员变量没有多态。注意:这里是指的是通过“点”访问成员变量没有多态,如果调用被覆写过的方法(发生多态),方法内访问的成员变量,则访问的是当前方法体所属类的成员变量。即也发生了多态。 2、通常对象的清理由GC负责,如果有某些资源,需要手动清理,那么新增dispose方法,清理顺序和 初始化顺序完全相反即可。 如果对象成员对象存在共享(如:被当做构造参数传入,增加了引用数量),则需要记录引用计数,每次使用则引用加1,如果引用变为0才允许清理。 3、构造器类似static方法,不具备多态性。但在构造器内调用方法,存在多态,如果调用的是被覆盖的方法。则动态绑定到子类的方法,此时子类还没有被构造,因此即使代码中成员变量有初始化值

Java 封装 继承 多态

感情迁移 提交于 2020-01-14 03:25:27
Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 生活中的继承: 兔子和羊属于食草动物类,狮子和豹属于食肉动物类。 食草动物和食肉动物又是属于动物类。 所以继承需要符合的关系是:is-a,父类更通用,子类更具体。 虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。 类的继承格式 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下: 类的继承格式 class 父类 { } class 子类 extends 父类 { } 为什么需要继承 接下来我们通过实例来说明这个需求。 开发动物类,其中动物分别为企鹅以及老鼠,要求如下: 企鹅:属性(姓名,id),方法(吃,睡,自我介绍) 老鼠:属性(姓名,id),方法(吃,睡,自我介绍) 企鹅类: public class Penguin { private String name; private int id; public Penguin(String myName, int myid) { name = myName; id = myid; }

面向对象

社会主义新天地 提交于 2020-01-13 21:43:59
案例引入:五子棋 面向过程:将事务按照一定的步骤实现,通过函数方式执行步骤。 1、开始游戏 2、执黑先行 3、绘制图形 4、判定输赢 ... 游戏结束 优缺点:效率高,可维护性低,耦合度低 eg:单片机、嵌入式开发、Linux操作系统。 面向对象:把构成的事务划分成一个个对象来处理。 1、游戏用户 2、棋盘对象 3、规则对象 优缺点:效率低,可维护性高 (耦合度低) eg:应用系统 面向对象 1、类 类是抽象的,起到描述事物的。(不占内存) 2、对象 对象时具象的,是类的实例化(占内存) 属性:静态的(固有特征) 行为:动态的(方法) 3、类和对象之间的关系 类是对象的描述 对象时类的实例 4、类的结构 1、属性 2、方法 3、构造器 5、面向对象的特征 封装:将事物的内部细节隐藏起来,对外暴露访问的接口 继承:子类可以用于父类的属性和行为 多态:同一个动作作用于不同对象产生的不同形态 多态类型:编译时多态,运行时多态 三个条件:继承、重写、向上转型 Java程序执行流程 1、将编写的Java源程序(.Java)通过编译器生成个字节码文件(.class)。 2、通过JVM类加载器加载所有字节码文件 3、加载完字节码文件后交给JVM执行引擎执行Java程序。 注:所有的Java程序最终都是在运行时数据区来运行 Java的内存结构 1、方法区 类的信息(访问修饰符 类名(包名加类名)

重载,继承,重写和多态的区别

人走茶凉 提交于 2020-01-13 14:06:27
继承是子类获得父类的成员。 多态则是为了避免在父类里大量重载引起代码臃肿且难于维护(多态则是父类使用子类的方法)。 重写是继承后重新实现父类的方法。 重载是在一个类里一系列参数不同名字相同的方法。 来源: CSDN 作者: sutong_first 链接: https://blog.csdn.net/sutong_first/article/details/103952640

java多态

那年仲夏 提交于 2020-01-13 09:57:52
Java 多态 多态的优点 消除类型之间的耦合关系 可替换性 可扩充性 接口性 灵活性 简化性 多态存在的三个必要条件 继承 重写 父类引用指向子类对象 //抽象类定义 public abstract class animal { public abstract void eat(); } //猫实现类 public class cat extends animal { @Override public void eat() { System.out.println("猫吃小鱼干"); } public void work() { System.out.println("猫抓老鼠"); } } //狗实现类 public class dog extends animal{ @Override public void eat() { System.out.println("狗吃屎!"); } public void work() { System.out.println("狗看门!"); } } public class 实现向上转型 { public static void main(String[] args) { //向上转型,将猫当做动物,小转大绝对安全! animal obj = new cat(); obj.eat(); } } public class 实现向下转型 {

JAVA学习---------多态

馋奶兔 提交于 2020-01-13 09:53:36
乐器与乐符的关系 package polymorphisn.music; public enum Note { MIDDLE_C, C_SHARP, B_FLAT; } ///////////////////////////// package polymorphisn.music; import static net.mindview.util.Print.*; class Instrument{ public void play(Note n){ print("Instrument.play()"); } } public class Wind exends Instrument{ public void play(Note n){ System.out.println("Wind.play()"+n); } } ///////////////////////////// package polymorphisn.music; public class Music { public static void tune(Instrument i){ i.play(Note.MIDDLE_C); } public static void main(String[] args){ Wind flute = new Wind(); tune(flute); } } //Output:

C++多态

吃可爱长大的小学妹 提交于 2020-01-13 02:59:38
静态多态:函数重载和运算符重载 静态多态也叫函数地址早绑定,在编译阶段确定函数地址。 动态多态 动态多态满足条件: 有继承关系 子类重写父类的虚函数 多态的使用: 父 类 的 指 针 或 引 用 指 向 ( 接 收 ) 子 类 对 象 \color{red} 父类的指针或引用指向(接收)子类对象 父 类 的 指 针 或 引 用 指 向 ( 接 收 ) 子 类 对 象 空类大小是1个字节 加上virtual后变成4字节,本质是一个 虚 函 数 ( 表 ) 指 针 \color{red} 虚函数(表)指针 虚 函 数 ( 表 ) 指 针 vfptr指向虚函数表,表内记录虚函数的地址。子类继承虚函数指针以后,在自己的空间也复制了一份虚函数表,如果重写了虚函数,则在虚函数表中替换掉父类中的虚函数地址。 # include <iostream> using namespace std ; class Animal { public : virtual void speak ( ) { cout << "动物在说话" << endl ; } } ; class Cat : public Animal { public : void speak ( ) { cout << "猫在说话" << endl ; } } ; void dospeak ( Animal & animal ) {

C++编译期多态与运行期多态

一曲冷凌霜 提交于 2020-01-12 21:18:02
前言 今日的C++不再 是个单纯的“带类的C”语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分。在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态;在泛请添加链接描述 型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态。在本文中,我们将了解: 什么是运行期多态 什么是编译期多态 它们的优缺点在哪 运行期多态 运行期多态 的设计思想要归结到类继承体系的设计上去。对于有相关功能的对象集合,我们总希望能够抽象出它们共有的功能集合,在基类中将这些功能声明为虚接口(虚函数),然后由请添加链接描述 子类继承基类去重写这些虚接口,以实现子类特有的具体功能。典型地我们会举下面这个例子: class Animal { public : virtual void shout() = 0; }; class Dog :public Animal { public: virtual void shout(){ cout << "汪汪!"<<endl; } }; class Cat :public Animal { public: virtual void shout(){ cout << "喵喵~"<<endl; } }; class

多态的实现原理

我的梦境 提交于 2020-01-12 13:18:38
#include<iostream> using namespace std; class A { public: int i; virtual void func(){} virtual void func2(){} }; class B:public A { int j; void func(){} }; int main() { cout<<sizeof(A)<<","<<sizeof(B)<<endl; return 0; } 在64位环境下,指针占8个字节,但是该程序是运行在32位VC++中,所以指针占4个字节,整型数占4个字节,所以在基类中,基类的大小是4+4=8个字节。 知识点: 派生类对象中包含基类成员变量,而且基类成员变量的存储位置位于派生类对象新增的成员变量之前。 所以,派生类的大小是4+4+4=12个字节 为何没存在字节对齐的原因? 来源: https://www.cnblogs.com/wsdsg/p/12182279.html