导出类

《java编程思想》多态与接口

我们两清 提交于 2020-04-05 18:56:10
向上转型   定义:把某个对象的引用视为对其基类类型的引用的做法被称为向上转型 方法调用绑定   将一个方法调用同一个方法主体关联起来被称作绑定。   前期绑定:程序执行前进行的绑定叫做前期绑定,前期绑定也是java中默认的绑定方式   后期绑定(动态绑定或运行时绑定):在运行时根据对象的类型进行绑定。在java中除了static方法和final方法之外,其他所有的方法都是后期绑定,也就是说,通常情况下,我们不用判断是否应该进行后期绑定,它会自动发生。 构造器和多态   构造器调用顺序:   (1) 调用基类构造器,此步骤会不断反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,一直到最低层的导出类   (2) 按声明顺序调用成员的初始化方法。   (3) 调用导出类构造器的主体       父类(静态变量、静态初始化块)>子类(静态变量、静态初始化块)>   父类(变量、初始化块)>父类构造器>子类(变量、初始化块)>子类构造器。(变量和初始化块按定义顺序初始化)     构造器内部的多态方法的行为   构造器调用的层次结构带来一个有趣的两难问题,如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法,会发生什么情况呢?众所周知,在一般的方法内部,动态绑定的调用是在运行时才决定的,因为对象无法知道它是属于方法所在的类,还是属于那个类的导出类

设计模式-工厂方法模式

梦想与她 提交于 2020-03-24 09:37:10
在阎宏博士的《JAVA与模式》一书中开头是这样描述工厂方法模式的:   工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。   工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 那么 工厂方法模式 是在什么场景下使用呢,下面就以本人的理解举例说明:( 内容转自此文章 )   相信很多人都做过导入导出功能,就拿导出功能来说。有这么一个需求:XX系统需要支持对数据库中的员工薪资进行导出,并且支持多种格式如:HTML、CSV、PDF等,每种格式导出的结构有所不同,比如:财务跟其他人对导出薪资的HTML格式要求可能会不一样,因为财务可能需要特定的格式方便核算或其他用途。   如果使用简单工厂模式,则工厂类必定过于臃肿。因为简单工厂模式只有一个工厂类,它需要处理所有的创建的逻辑。假如以上需求暂时只支持3种导出的格式以及2种导出的结构,那工厂类则需要6个if else来创建6种不同的类型。如果日后需求不断增加,则后果不堪设想。   这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口

DLL的开发与调用(二)——创建导出类的Win32 DLL

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-17 03:50:50
创建导出类的Win32 DLL DLL的开发与调用(一)介绍了导出函数Win32DLL的创建过程,这也是最常用的DLL。同样,在DLL中定义的类也可以被应用程序的进程访问。下面仍以实现显示Hello,World!和求和为例介绍。 1、创建一个名为SayHello的Win32 DLL的空项目。 2、选择“插入|类”,在弹出的新建类窗口中为工程创建类CSayHello。在类的头文件SayHello.h中,使用关键字_declspec(dllexport)声明导出类,并定义相关的成员变量和成员函数。代码如下: // SayHello.h // class _declspec(dllexport) CSayHello { public: CSayHello(); virtual ~CSayHello(); void Say(char* szWords,int nLen); float Sum(); void SetNum(float fNum1,float fNum2); private: float fNo1; float fNo2; }; 在类的实现文件中实现各成员函数,代码如下: //SayHello.cpp // #include "SayHello.h" #include <string.h> CSayHello::CSayHello() { fNo1=fNo2=0.0; }

JAVA面向对象变成学习!

两盒软妹~` 提交于 2020-03-07 08:39:30
一、抽象过程 Smalltalk 的五个基本特性,这些特性表现了一种纯粹的面向对象程序设计方式: 1. 万物皆为对象。将对象视为奇特的变量,它可以存储数据,除此之外,你还可以要求它 在自身上执行操作。理论上讲,你可以抽取待解问题的任何概念化构件(狗、建筑物、 服务等),将其表示为程序中的对象。 2. 程序是对象的集合,它们彼此通过发送消息来调用对方。要想产生一个对对象的请求, 就必须对该对象发送一条消息。更具体地说,你可以把消息想象为对某个特定对象的方 法的调用请求。 3. 每个对象都拥有由其它对象所构成的存储。你可以通过创建包含现有对象集合的包的 方式来创建新类型的对象。因此,你可以在程序中构建复杂的体系,同时将其复杂性通 过对象的质朴性得以屏蔽。 4. 每个对象都拥有其类型(Type)。按照通用的说法,“每个对象都是某个类(Class)的 一个实例(Instance)”,其中“类”就是“类型”的同义词。每个类中最重要的区别于其它 类的特性就是“你可以发送什么消息给它?” 5. 某一特定类型的所有对象都可以接收(Receive)同样的消息。这是一句意味深长的表述, 你在稍后便会看到。因为“圆形(circle)”类型的对象同时也是“几何形(shape)”类型 的对象,所以一个“圆形”对象必定能够接受(accept)发送给“几何形”对象的消息。这 意味着你可以编写与“几何形

学习《Java编程思想》第二天

自作多情 提交于 2020-01-17 01:53:40
1.6 继承 1.6.1 “是一个”与“像是一个”关系 继承时只覆盖基类的方法,因此导出类和基类是完全相同的类型,因为它们具有完全相同的接口。结果可以用一个导出类对象来完全替代一个基类对象。通常被称为 替代原则 。 有时在导出类型中添加了新的接口元素,这样也就扩展了接口,这个新的类型仍然可以替代基类,但是基类无法访问新添加的方法。 1.7 伴随多态的可互换对象 把一个对象不当作它所属的特定类型来对待,而是将其当作其基类的对象来对待。因此人们可以编写出不依赖于特定类型的代码。 面向对象程序设计语音使用了后期绑定的概念,当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。 为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址调用,这段代码使用在对象中存储的信息来计算方法体的地址,这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。当向一个对象发送信息时,该对象就能够知道对这条消息应该做些什么。 例如: 创建方法: void doSomething(Shape shape){ shape.erase(); shape.draw(); } 调用这个方法: Circle circle = new Circle(); Triangle triangle = new

think_in_java_多态

此生再无相见时 提交于 2020-01-15 05:06:40
向上转型:对象既可以作为它自己本身的类型使用,也可以作为它的基类型使用。 绑定:将一个方法调用同一个方法主体关联起来被称作绑定。若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定。后期绑定:在运行时根据对象的类型进行绑定【动态绑定或运行时绑定】java除了static方法和final方法之外,其他所有方法都是后期绑定。 多态是一项让程序员“将改变的事物与未来的事物分离开来”的重要技术。 对象方法若是静态的,则不具备多态性。 当子类对象转型为父类引用时(Father fa=new Son();//upcast),任何域访问操作都将由编译器解析,故不是多态的。 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。因为构造器具有一项特殊任务:检查对象是否被正确地构造。导出类只能访问自己的成员,不能访问基类成员(private) 一个复杂对象调用构造器要遵守下面的顺序: ①调用基类构造器,这个步骤反复递归,首先是构造这种层次结构的根,然后是下一层导出类,直到最低层的导出类。 ②按声明顺序调用成员的初始化方法。 ③调用导出来构造器的主体。 当覆盖被继承类的dispose()方法时,务必记住调用基类版本dispose()方法;否则,基类的清理动作不会发生(被多态了)。 初始化的实际过程: ①在其他任何事物发生之前

Thinking in Java第八章学习笔记----多态

Deadly 提交于 2020-01-14 12:18:26
封装:   封装就是把对象的行为和属性装在一个类里。 抽象:   抽象是将存在于事物之间共同拥有的元素提取的过程,抽象成类或者接口。抽象分为:   1)数据抽象:用于表示事物的属性,比如人的姓名、年龄等。抽象成属性或者成员变量。   2)过程抽象:用于表示事物的行为,比如人会吃饭等。抽象成方法。 多态:   在面向对象程序设计语言中,多态是继封装和抽象的第三大特性。首先,须清楚多态是一种不能单独来看的特性,它只能作为类中"全景"关系中的一部分,与其他特性协同合作。多态的主要功能是将做什么和怎么做分离开来,从另一角度将接口和数据分离开来。多态不仅能改善代码的组织结构和可读性,还能创建可扩展的程序。   概括来说,多态的作用是消除耦合。没有多态,等号左边和右边需要相互对应,即耦合。有了多态,左边是父类(或者接口),右边是子类(或实现类),我只管调用接口里面的方法就是了,至于你实现类怎么去实现,那是你的事,你要修改一下实现,你只管去把实现类换掉,我这边一行代码都不用变,这就解耦了。 再论向上转型:   把导出类对象的引用视为其基类的引用,这种做法称为向上转型。因为在继承树的画法中,基类是处于上方的。 问题导出:   如果我们只写一个简单的方法,它仅接收基类引用作为参数,而不是写多个以导出类引用为参数的类似方法,并且这个方法对所有的导出类参数都可以正确运行,显然这种做法更好。 问题解决:

读《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方法,不具备多态性。但在构造器内调用方法,存在多态,如果调用的是被覆盖的方法。则动态绑定到子类的方法,此时子类还没有被构造,因此即使代码中成员变量有初始化值

DLL导出类避免地狱问题的完美解决方案 (转)

不羁的心 提交于 2019-12-09 11:17:51
备注:在设计导出类时,在网上找到了这篇文章,非常的好,收藏了!网址: http://club.topsage.com/thread-497586-1-1.html DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序复用,DLL中的函数实现可以被修改而无需重新编译和连接使用该DLL的应用程序。作为一名面向对象的程序员,希望DLL可以导出类,以便在类的层次上实现复用。所幸的是,DLL确实也可以导出类。 然而事实却没这么简单,导出类的DLL在维护和修改时有很多地方必需很小心,增加成员变量、修改导出类的基类等操作都可能导致意想不到的后果,也许用户更新了最新版本的DLL库后,应用程序就再也不能工作了。这就是著名的DLL Hell(DLL地狱)问题。 DLL地狱问题是怎么产生的呢?看下面的例子,假设DLL有一个导出类ClassD1: class ClassD { public: int GetInt(); private: int m_i; }; int ClassD::GetInt() { return m_i; } 应用程序使用现在的代码来使用这个类: ClassD d; printf(“%d”, d.GetInt()); 程序进行正正常,没有什么问题。后来DLL需要升级,对ClassD进行了修改,增加了一个成员变量,如下: class ClassD // 修改后

java编程思想(六)总结

白昼怎懂夜的黑 提交于 2019-12-06 13:21:29
第七章 多态 7.1 多态与封装 多态是分离 “做什么”和“怎么做”,即接口与实现分离,消除类型之间的耦合性 封装是合并特征和行为来创建新的数据类型 7.2 向上转型和向下转型 向上转型即导出类实例转化为基类实例,由于只能调用与基类公共的方法,可能会缩小 “接口”。 向下转型即基类实例转化为导出类实例,由于 java 采用后期绑定策略,因此只有在运行阶段才知道是否能正确转化,因此存在风险。 7.3 转机 前期绑定:由编译器和连接程序实现。 后期绑定:运行时根据对象类型进行绑定。 Java除了static和final方法(private)之外,其他方法均属于后期绑定。 Private方法默认是final,对导出类是屏蔽的,因此不能被覆盖 7.4 抽象类和抽象方法 抽象类一般表示所有导出类的共同部分,抽象类不存在实例对象 7.5 构造器的调用顺序 1.基类构造器 2.组合(属性初始化) 3.自身构造 清理的调用顺序相反 7.6用继承进行设计 除非为了表示父子类关系,即 xx 是一种 xx 或者向上转型,一般选择组合 用继承表达行为间的差异,用组合表达状态的变化 来源: CSDN 作者: MrGeroge 链接: https://blog.csdn.net/MrGeroge/article/details/52625925