构造函数

js继承

橙三吉。 提交于 2020-02-22 23:37:40
js继承 首先,我们应该理解,什么是继承?所谓继承,通俗讲,就是从某人处得到某些东西,大部分情况下都是儿子从父亲那继承。现在网上也有一句玩笑,叫“你想笑死我,然后继承我的蚂蚁花呗吗”。 js中的继承,同样也可以理解为上述意思,即从子从父那获取属性和方法。 在这里,我们介绍一下使用构造函数继承和prototype继承 1.构造函数继承 此方法是通过使用call或者apply将子构造函数中的this指向变为父构造函数,但是其缺点是父对象中的属性和方法并没有继承。 代码实现: function Computer ( name , type ) { this . name = "电脑" ; this . type = "电器" ; } function Dell ( name , type , color ) { Computer . call ( this , name , type ) ; this . color = color ; } var dell1 = new Dell ( 'blue' ) ; alert ( dell1 . name ) ; //=>电脑 上述代码,通过call方法使得Dell继承了Computer的name和type。在输出子构造函数Dell的构造对象的name时,结果为“电脑”。 2.prototype继承

【集合框架】JDK1.8源码分析之LinkedHashMap(二)

这一生的挚爱 提交于 2020-02-22 20:51:30
一、前言   前面我们已经分析了HashMap的源码,已经知道了HashMap可以用在哪种场合,如果这样一种情形,我们需要按照元素插入的顺序来访问元素,此时,LinkedHashMap就派上用场了,它保存着元素插入的顺序,并且可以按照我们插入的顺序进行访问。 二、LinkedHashMap用法 import java.util.Map; import java.util.LinkedHashMap; public class Test { public static void main(String[] args) { Map<String, String> maps = new LinkedHashMap<String, String>(); maps.put("aa", "aa"); maps.put("bb", "bb"); maps.put("cc", "cc"); for (Map.Entry entry : maps.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } } View Code 说明:以上是展示LInkedHashMap简单用法的一个示例,可以看到它确实按照元素插入的顺序进行访问,保持了元素的插入顺序。更具体的用户可以去参照API。 三

JavaScript 构造函数的继承

橙三吉。 提交于 2020-02-22 18:49:40
JavaScript 构造函数的继承 在上一篇 文章 中讲述了 JS 对象、构造函数以及原型模式,这篇文章来讨论下 JavaScript 的继承 继承是 OO 语言中的一个最为人津津乐道的概念。许多 OO 语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。如前所述,由于函数没有签名,在 ECMAScript 中无法实现接口继承。ECMAScript 只支持实现继承,而且其实现继承主要是依靠原型链来实现的。 一、使用 call 或 apply 假如有一个 "人" 对象,还有一个 "学生" 对象。 function Person(name, age) { this.name = name this.age = age } function Student(subject) { this.subject = "语文" } 我们怎样才能使 "人" 对象继承 "学生" 对象的属性或方法呢。第一种方法,也是最简单的方法,使用 call 或 apply 来改变 this 指向使其调用对象的属性或方法。 function Person(name, age) { this.name = name this.age = age Student.call(this, name, age) } var person1 = new Person("张三",

Spring ApplicationContext.xml配置的12个技巧

浪尽此生 提交于 2020-02-22 08:22:44
转自 http://www.blogjava.net/103335460/articles/260845.html Spring是一个强有力的java程序框架,其被广泛应用于java的程序中。它用POJO提供了企业级服务。 Spring利用依赖注入可以获得简单而有效的测试能力。Spring beans,依赖关系,以及服务所需要的bean都将在配置文件中予以描述,配置文件一般采用XML格式。然而XML配置文件冗长而不易使用,在你进行一 个使用了大量bean的大项目中它将变得难以阅读和控制。 在这篇文章中我将给你展示12种的有关Spring XML配置文件的最佳技巧。它们中的一些具有更多的实际意义,而不仅是最好的技巧。请注意另外一些因素,例如域模型的设计,会影响到XML配置,但是这篇文章更关注于XML配置的可读性和可操控性。 1. 避免使用自动装配 Spring 可以通过bean类的自省来实现自动装配依赖,这样的话你就不必明确地描述bean的属性或者构造函数的参数。根据属性名称活匹配类型,bean属性可以 自动进行装配。而构造函数可以根据匹配类型自动装配。你甚至可以设置自动装配进行自动侦测,这样Spring替你就会选择一个合适的机制。请看下面的例 子: Spring 可以通过bean类的自省来实现自动装配依赖,这样的话你就不必明确地描述bean的属性或者构造函数的参数

初解C#类、结构、弱引用

旧巷老猫 提交于 2020-02-21 09:56:14
一、类 类中的数据和函数称为类的成员 数据成员是包含类的数据----字段、常量和事件的成员。数据成员可以是静态数据、类成员总是实例成员,除非用static进行显示的声明。 事件是类的成员,在发生某些行为(如改变类的字段或属性,或者进行了某种形式的用户交互操作)时,他可以让对象通知调用方,调用方可以包含所谓“事件处理程序”的代码来响应该事件。 函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和终结器(finalizer)、运算符以及索引器。 (1)方法是与某个类相关的函数,与数据成员一样,函数成员默认为实例,使用static修饰符可以把方法定义为静态方法 (2)属性是可以从客户段访问的函数组,其访问方式与访问类的公共字段类似。C#为读写类中的属性提供了专用语法,所以不必使用那些名称中嵌有Get或Set的方法。因为属性的这种语法不同于一般函数的语法,在客户端代码中,虚拟的对象被当作实际的东西 (3)构造函数是在实例化对象时自动调用的特殊函数,它们必须与所属的类同名,且不能有返回类型。构造函数用于初始化字段的值 (4)终结器类似构造函数,但是在CLR检测到不再需要某个对象时调用它,它们的名称与类相同,但前面有一个“~”符号,不可能预测什么时候调用终结器 (5)运算符执行最简单的操作就是加法和减法,C#还允许运算符重载 如下是一个包含静态构造函数和索引的类的定义和测试

创建对象的方法

二次信任 提交于 2020-02-21 06:43:32
创建对象有多种不同的方法: 1. Object构造函数(无法做到 代码复用) var obj1 = new Object ( ) ; obj1 . name = ‘xiaocuo’ ; obj1 . age = 25 ; obj1 . sayHi = function ( ) { alert ( ‘hi,大家好!我叫’ + obj1 . name ) ; } 2. 对象字面量(无法做到 代码复用) var obj3 = { name : ‘laozhao’ , age : 23 , sayHi : function ( ) { alert ( ‘hi,大家好!我叫’ + obj3 . name ) ; } } 3. 工厂模式(解决了代码复用的问题,但是无法解决方法共享,对象类型识别的问题) function createObj ( n , a ) { // 原料 var obj = { } ; // 加工 obj . name = n ; obj . age = a ; obj . sayHi = function ( ) { alert ( ‘hi,大家好!我叫’ + obj . name ) ; } // 出厂 return obj ; } var obj1 = createObj ( ‘小王’ , 23 ) ; var obj2 = createObj ( ‘小李’ , 24

C++ Primer Plus第6版18个重点笔记

╄→尐↘猪︶ㄣ 提交于 2020-02-21 06:32:43
下面是我看《C++ Primer Plus》第6版这本书后所做的笔记,作为备忘录便于以后复习。 笔记部分 C++的const比C语言#define更好的原因? 首先,它能够明确指定类型,有类型检查功能。 其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中。 第三,可以将const用于更复杂的类型,比如数组和结构。 C语言中也有const,其与C++中const的区别是: 一是作用域规则不同;另一个是,在C++中可以用const值来声明数组长度。 不能简单地将整数赋给指针,如下所示: int *ptr; ptr = 0xB8000000; // type mismatch 在这里,左边是指向int的指针,因此可以把它赋给地址,但右边是一个整数。您可能知道,0xB8000000是老式计算机系统中视频内存的组合段偏移地址,但这条语句并没有告诉程序,这个数字就是一个地址。在C99标准发布之前,C语言允许这样赋值。但C++在类型一致方面的要求更严格,编译器将显示一条错误消息,通告类型不匹配。要将数字值作为地址来使用,应通过强制类型转换将数字转换为适当的地址类型: int *ptr; ptr = (int *) 0xB8000000; // type now match 这样,赋值语句的两边都是整数的地址,因此这样赋值有效。 注意

C++ Primer Plus 笔记第十三章

时光怂恿深爱的人放手 提交于 2020-02-21 05:47:21
类继承 本章内容:    is-a 关系的继承;    如何以公有方式从一个类派生出另一个类;    保护访问;    构造函数成员初始化列表;    向上和向下强制转换;    虚成员函数;    早期(静态)联编与晚期(动态)联编;    抽象基类;    纯虚函数;    何时及如何使用公有继承    面向对象编程的主要目的之一是提供可重用的代码;    C++类提供了更高层次的重用性,类库由类声明和实现构成,因为类组合了数据表示和类方法;    C++提供了比修改代码更好的方法来扩展和修改类——类继承; 13.1 一个简单的基类    从一个类派生出另一个类,原始类成为基类,继承类称为派生类;    程序清单13.1 tabtenn0.h  1 #ifndef TABTENN0_H_ 2 #define TABTENN0_H_ 3 4 class TableTennisPlayer 5 { 6 private: 7 enum {LIM = 20}; 8 char firstname[LIM]; 9 char lastname[LIM]; 10 bool hasTable; 11 public: 12 TableTennisPlayer(const char * fn = "none", const char * ln = "none", bool ht = false);

JavaScript OO不XX 学习总结

萝らか妹 提交于 2020-02-21 05:37:38
一、废话 总觉得面向对象这东西,如果做的东西不是十分复杂的话,其实不太有场景能用上。最近重新学习了《JavaScript高级程序设计》中面向对象程序部分的知识,有一些收获,特此记录。 二、JavaScript创建对象最佳实践 2.1 理论 JavaScript是基于原型的语言,创建对象比较常用的方法是采用“构造函数+挂载原型”的方式。 举个例子: var Engineer = function (name) { this.name = name; }; Engineer.prototype.codeWith = function (tools) { return this.name + ' is coding with ' + tools.join(','); }; Engineer.prototype.solve = function (problem) { return this.name + ' is solving ' + problem; }; var a = new Engineer('kohpoll'); var b = new Engineer('xp'); console.log(a, b); console.log(a.codeWith(['vim'])); console.log(a.solve('oo')); 这段代码执行后,事实上的结构是这样的:

C++ 内存分配(new,operator new)详解

做~自己de王妃 提交于 2020-02-20 04:12:10
参考: C++ 内存分配(new,operator new)详解 如何限制对象只能建立在堆上或者栈上 new运算符和operator new() new:指我们在C++里通常用到的 运算符 ,比如A* a = new A; 对于new来说,有new和::new之分,前者位于std operator new():指对new的重载形式,它是一个 函数 ,并不是运算符。对于operator new来说, 分为全局重载和类重载 ,全局重载是void* ::operator new(size_t size),在类中重载形式 void* A::operator new(size_t size)。还要注意的是这里的operator new()完成的操作一般只是分配内存,事实上系统 默认的全局 ::operator new(size_t size)也只是调用malloc分配内存,并且返回一个void*指针 。而构造函数的调用(如果需要)是在new运算符中完成的 new和operator new之间的关系 A* a = new A;我们知道这里分为两步: 1.分配内存,2.调用A()构造对象。 事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),如果没有重载,就调用: