在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。...LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。...实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。...4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。...1.某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销; 2.省去了new操作符,降低了系统内存的使用频率,减轻GC压力; 3.有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话
半透明装饰模式可以给系统带来更多的灵活性,设计相对简单,使用起来也非常方便;但是其最大的缺点在于不能实现对同一个对象的多次装饰,而且客户端需要有区别地对待装饰之前的对象和装饰之后的对象。...这也就是说,在可能的情况下,我们应该尽量使用透明装饰模式。 (2) 尽量保持具体构件类是一个“轻”类,也就是说不要把太多的行为放在具体构件类中,我们可以通过装饰类对其进行扩展。...这里总结几种常用流的应用场景: 流名称 应用场景 ByteArrayInputStream 访问数组,把内存中的一个缓冲区作为 InputStream 使用,CPU从缓存区读取数据比从存储介质的速率快10...可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,得到功能更为强大的对象。...适用场景: 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式。
在创建类之后,对象可以在外部直接使用.属性名 给对象增加属性,但是这种方式不推荐使用,因为它并没有将属性封装到类的内部中,只是对象临时的属性; 在初始化方法内部定义属性之后,在使用该类创建新对象时,所创建的新对象都会拥有该属性...对象从调用类名()创建时生命周期即开始; 对象生命周期内,既可以访问对象属性,也可以调用对象方法; 对象的__del__方法一旦调用,对象的生命周期即结束; 身份运算符 功能:用于比较两个对象内存地址是否一致...–即判断是否是对同一对象的引用; is和==的区别 is用于判断两个变量引用对象是否为同一个; ==用于判断引用变量的值是否相等; 私有属性与方法 定义方式:属性名或方法名之前增加两个下划线,则定义的属性或方法就是私有属性或方法...覆盖基类方法; 对基类方法进行拓展,需要使用super().父类方法来调用父类方法的执行,然后在方法中其他位置进行对子类方法的扩展; 多继承 语法 class 子类名(父类名1, 父类名2,...):...实例化 每个对象实例化是都有自己独立的内存空间,用于保存各自不同的属性; 而多个对象的方法在内存中只有一份,在调用方法时需要吧对象的引用传递到方法内部; 类方法 语法 @classmethod def
分享给大家供大家参考,具体如下: 一、前言 Reflection(反射)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。...PHP5具有完整的反射API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。...; (3) class = reflectClass- newInstance(); 实例化类,返回目标类实例;也可通过$reflectClass- newInstanceArgs(<参数数组 )传入实例化的构造函数参数进行实例化...getName(); 返回要执行的方法所需参数数组的单个参数名,可通过foreach循环逐一获取和赋值; (4) $reflectMethod- invokeArgs(<类实例 ,<执行该方法所需参数数组...; 4、对于多次继承的类,我们可以通过多次反射探索到基类的结构,或者采用递归的形式反射,实现实例化所有继承类,这即是PHP依赖注入的原理。
LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。...合成复用原则:尽量使用合成/聚合的方式,而不是使用继承。 单例模式 什么是单例模式 保证一个系统中的某个类只有一个实例而且该实例易于外界访问。...,然后定义一个公共的静态方法,对该类的值进行空判断,不为空直接返回,否则重新构建一个。...缺点:当该类被加载的时候,会初始化该实例和静态变量并被创建并分配内存空间,并且会一直占用内存。 2.饱汉式 优点:写起来很简单,在第一次调用的时候才会初始化,节省了内存。...进行同步代码块,防止对象未初始化时,在多线程访问该对象在第一次创建后,再次重复的被创建;然后第二次对该对象实例化时与否判断,如果未初始化,则初始化,否则直接返回该实例。
虚函数的工作原理 友元 了解一下友元函数吧 友元函数是否破坏了类的封装性 什么时候使用友元函数: ---- 基础篇 喜欢用内联函数吗?...);如果p赋值的对象是基类的对象,就会调用基类的析构函数,这样就不会造成内存泄露。...虚函数表中存储了为对象进行声明的虚函数的地址。 例如,基类对象包含一个指针,该指针指向基类中所有虚函数的地址表。派生类对象包含一个指向独立地址表的指针。...简而言之,使用虚函数时,在内存和执行速度方面有一定的成本,包括: 1)每个对象都将增大,增大量为存储函数地址表(数组)的空间。 2)对每个类,编译器都创建一个虚函数地址表(数组)。...友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。
具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。...当该空白类作为基类时,该类的大小就优化为0了,子类的大小就是子类本身的大小。这就是所谓的空白基类最优化。...,但是只能在该函数内进行使用该静态局部变量, extern的作用(作用域扩展) 将全局变量的作用域扩展到其定义之前:如果全局变量不在文件的开头定义,其作用范围只限定于从定义处到文件结尾,如果在定义点之前的函数想引用该变量...,就应该在引用之前使用extern关键字对该变量进行声明,之后该全局变量的作用域就从声明处一直到文件结尾了 将某一个源文件中全局变量的作用域扩展到其他源文件中:一个C++项目很多情况是由多个源文件构成,...如果在一个文件中想引用另一个文件中已定义的全局变量,比如现在两个文件都要使用到同一个全局变量int a,正确的做法应该是:在一个文件中定义变量a,而在另一个文件中使用extern int a;对该变量进行声明
该类的每个对象都将在使用它时创建它自己的变量副本。因此,对该变量所做的任何更改都不会反映在该类的任何其他实例中,而只会绑定到该特定实例。...最终方法 当方法声明为final时,继承类不能覆盖该方法。 最终类 在Java中将一个类声明为final时,任何子类类都不能对其进行扩展,但可以扩展其他类。 Q22。...this() super() 1. this()代表一个类的当前实例 1. super()表示父/基类的当前实例 2.用于调用同一类的默认构造函数 2.用于调用父/基类的默认构造函数 3.用于访问当前类的方法...3.用于访问基类的方法 4.用于指向当前的类实例 4.用于指向超类实例 5.必须是块的第一行 5.必须是块的第一行 Q25。...Java字符串池是指存储在堆内存中的字符串的集合。在这种情况下,无论何时创建新对象,字符串池都会首先检查该对象是否已存在于池中。
那些特例,如鸭嘴兽(生蛋的哺乳动物),则要求我们对缺省的属性或行为进行覆盖。 C++中的继承语法很简单,在子类后加上“:base”就可以了。下面的D继承自基类C。...该变量指向一个全类共享的偏移量表,表中项目记录了对于该类 而言,“虚基类表指针”与虚基类之间的偏移量。 其它的实现方式中,有一种是在派生类中使用指针成员变量。...况且,这种实现方式还有一个大弊端:从多个虚基类派生时,类实例将占用更多的内存空间;获取虚基类的虚基类的地址时,需要多次使用指针,从而效率较低等等。...虚析构函数的特别之处在于:当类实例被销毁时,虚析构函数被隐含地调用。调用地(delete发生的地方)虽然不知道销毁的动态类型,然而,要保证调用对该类型合适的delete操作符。...析构帮助函数调用对该类合适的析构函数,然后为该类有选择性地调用合适的delete操作符。
当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过 加载,连接,初始化,这三个步骤对类进行初始化,如果没有意外,JVM 将会连续完成这三个步骤,所以有时也称为类初始化。...不过需要注意的是,jdk1.9对类加载器进行了改变,并废除了一些方法,本篇博客并没有对 jdk1.9进行概述。...验证: 验证阶段同于检验被加载的类是否有正确的内部结构,就是检查符不符合Java语言规范,并和其他类协调一致。 准备:类准备阶段则负责为类的类变量分配内存,并设置默认初始值。...初始化 虚拟机负责对类进行初始化,主要就是对类 变量 进行初始化,有如下两种初始化方式: 声明类变量时初始化 使用静态初始化为类变量指定初始值 一般初始化一个类包含如下几个步骤: 假如这个类没有被加载和连接...为某个类创建实例的方法会包括:使用new 操作符来创建实例,通过反射来创建实例,通过反序列化的方式来创建实例。
答:结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。 ...Active Directory使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。...垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。 ...39.用最有效的方法算出2乘以8等于几? 答:2<<3. 40.C#是否可以对内存直接进行操作?...答:声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。
可以使用 Kotlin 反射来访各种基于 JVM 语言编写的代码。 下面以 Java 的反射和 Kotlin 的反射进行对比。 一....KClass 类型,KClass 的一个实例表示对 Kotlin 类的引用。...即使多次尝试实例化 KClass, 仍然只能获取同一对象的引用, Kotlin 不会创建新的引用。 二....Kotlin 使用类名::属性来获取扩展属性的引用,并返回 KProperty1 类型的值。...get() = setter.javaMethod 如果要获取对应于 Java 的 Kotlin 类,使用 .kotlin 扩展属性返回 KClass 实例。
1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。...LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。...实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。...4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。...整个应用中只维护一个特定类实例,它被所有组件共同使用。Java.lang.Runtime是单例模式的经典例子。你可以在我的文章Java单例模式的10个问题看到更多的问题和讨论。
Kotlin中可以使用Java中的反射,但是由于Kotlin中字节码.class对应的是KClass类,所以如果想要使用Java中的反射,需要首先获取Class的实例,在Kotlin中可以通过以下两种方式来获取...可以看到Kotlin反射中,可以获取比Java反射更多的关于类的信息。...使用Kotin中反射注意的问题 在Kotlin1.1中如果反射String,Map,List等类型时,会抛出一个built-in Kotlin Types的异常,这是因为在Kotlin1.1版本中还没有对这些类型添加支持...Kotlin关于反射的内容都放在kotlin-reflect的jar包中,这个jar包有2.6M,对于移动端开发,需要占用一定的内存空间。...,谢谢大家对ZaLou.Cn的支持。
动态内存泄露检测:检查new/delete的资源是否正确释放,检查程序运行期间内存是否一直在增长,使用内存检测工具来检测泄露情况。...咋不同文件中:直接引用头文件;使用extern声明变量。 2.13 变量声明和定义的区别 变量声明:告诉编译器有某个类型的变量,但不会为其分配内存。 变量定义:位该类型的变量分配内存。...继承:子类继承父类的方法和属性,继承可以扩展已存在的代码,目的是为了代码重用。...3.9 类成员中只能使用构造函数的初始化列表而不能赋值的有哪些 const成员 引用成员 3.10 函数模板与类模板的区别 函数模板是模板的一种,可以生成各种类型的函数实例,函数模板的实例化是由编译程序在处理函数调用时自动完成的...一个基类的引用可以指向它的派生类实例。 3.12 static成员变量和static成员函数 static数据成员独立于该类的任意对象而存在。
Golang中的继承是通过组合来实现的,下例基类是Base,子类是Foo;子类可以直接调用基类的公有方法,子类也可以定义自己的属性以及实现自己的方法。...设计模式原则# 2.1 单一职责原则# 即一个类只对应一个职责,其职责是引起该类变化的原因,例如类T1只完成F1的功能,类T2只完成F2的功能,T1改变的时候不会影响F2,同理T2改变的时候不会影响F1...目的是为了程序的扩展性好,易于维护,减少因为代码的多次修改而造成各种隐性bug,遵循高内聚,低耦合的原则。...在GO语言中需要用到interface字段对方法进行抽象,做到T1业务和Function和T2业务的Function互不影响,而且还可以扩展新业务而不用从之前的Function的修改 type Abstract...一个类对另一个类的依赖应该建立在最小的接口上。简单地说,就是使用多个专门的接口比使用单个接口要好很多。
静态构造函数只调用一次,在程序所驻留的应用程序域的生存期内,静态类会保留在内存中(即使用Static修饰的类,应用一旦启用静态类就会保留在内存中)。 静态类只包含静态成员 不能包含实例构造函数。...静态成员属于类所有,非静态成员属于类的实例化对象所有。 静态方法里不能使用非静态成员,非静态方法可以使用静态成员。 每创建一个类的实例,都会在内存中为非静态成员新分配一块新的存储。...静态成员无论类创建多少个实例,在内存中只占同一块区域。 静态方法的使用场合 静态方法最适合工具类中方法的定义。 静态变量适合全局变量的定义。 静态方法和非静态方法区别(优/缺点)?...参数在使用 ref 关键字进行引用传递时,必须在方法调用之前对其进行初始化。 ref 关键字既可以在进入方法之前初始化参数的值,也可以在方法内部对参数进行修改。...扩展方法的第一个参数不能有 in 修饰符,除非该参数是结构。 扩展方法的第一个参数,其中该参数是泛型类型(即使该类型被约束为结构。)
单例模式 在对泛型的约束中,最常使用的关键字有where 和 new。 其中where关键字是约束所使用的泛型,该泛型必须是where后面的类,或者继承自该类。...然而,如果你在函数内部对 params 参数数组进行频繁的添加、插入、删除或修改等操作,这些操作可能会导致内存重新分配和释放,从而间接地增加垃圾回收的开销。...因此,在设计代码时,应该尽量避免对 params 参数数组进行频繁的修改操作,或者考虑使用其他数据结构来替代 params 参数数组。...扩展方法还有一些必须遵循的要求: 扩展方法必须在静态类中,而且该类不能是一个嵌套类; 扩展方法必须是静态的; 扩展方法的第一个参数必须是要扩展的类型,而且必须加上this关键字; 不支持扩展属性...在类中,使用 OnMyEvent() 方法来触发事件。该方法首先检查事件处理程序是否为空,如果不为空,则触发事件。
领取专属 10元无门槛券
手把手带您无忧上云