引用类型

原型链和继承

与世无争的帅哥 提交于 2019-11-29 17:23:58
原型链: 它是继承的主要方法,其基本思想是让一个引用类型继承另外一个引用类型的属性和方法。 每个构造函数都一有一个prototype属性,它指向它的原型对象 原型对象包含了 该构造函数所创建的 所有实例 共享的 属性和方法 假如让一个原型对象等于另外一个类型的实例,那么该对象的实例可以访问另外一种原型的属性和方法。从而形成原型链 当我们调用一个对象的属性和方法时,首先在该对象自身属性查找,如果不存在就去自己的原型对象里找,如果还不存在,就向原型对象所关联的另外的原型对象里寻找。。如果有就返回,如果找到原型链的终点null时还没有找到,就返回undefined。 Object.prototype是所有对象的原型。 继承共有6种方法 原型链继承就是让子类型的原型等于父类型的实例,这种方法无法向超类型传递参数并且存在超类型包含引用类型的属性的问题,所以这种方法很少单独使用。 还有一种就是构造函数继承,就是在子类型当中使用call()来调用超类型的构造函数,这种方法解决了上述两种问题,但是函数复用无从谈起。 接下来是最常用的一种方法,组合使用原型链继承和构造函数继承,它综合了上述两种方法的优点,还解决了函数复用,引用类型属性,传递参数的问题。 其基本思想就是,使用原型链继承超类型的方法,使用构造函数继承超类型的属性。 这样一来,既可以让两个子类型的不同实例拥有自己的属性

理解JS原型和原型链

[亡魂溺海] 提交于 2019-11-29 17:23:19
本文通过对《JavaScript高级程序设计》第六章的理解,加上自己的理解,重组了部分内容,形成下面的文字。 理解了原型这个概念,你的JS世界会清明很多。 为什么要为JS创造原型这个概念 在没有原型概念之前,我们可以通过创建各种形式的函数来模拟类,但总有这样那样的不足,比如下面的 function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName(){ alert(this.name); } var person1 = new Person("Nicholas", 29, "Software Engineer"); var person2 = new Person("Greg", 27, "Doctor"); person1.sayName===person2.sayName; // true 其中的sayName()函数虽然可以被构造函数Person的多个实例共享,但无法被其他构造函数继承。 什么是原型 要想弄清楚原型链,需要先理解原型。 所谓原型,是其他OO语言中类和继承的JS自家解决方案。JS以引用类型数据特性为基础,通过为构造函数自动创建prototype对象属性,实现类和继承

JS - 变量和类型

拜拜、爱过 提交于 2019-11-29 14:55:07
导读 变量和类型是学习 JavaScript 最先接触到的东西,先看下面几个问题: JavaScript 中的变量在内存中的具体存储形式是什么? 0.1+0.2 为什么不等于 0.3 ?发生小数计算错误的具体原因是什么? Symbol 的特点,以及实际应用场景是什么? [] == ![] 、 [undefined] == false 为什么等于 true ?代码中何时会发生隐式类型转换?转换的规则是什么? 如何精确的判断变量的类型? 如果你还不能很好的解答上面的问题,那说明你还没有完全掌握这部分的知识 一、Javascript数据类型 ECMAScript标准 规定了 7 种数据类型,其把这 7 种数据类型又分为两种:原始类型和对象类型。 原始类型 Null :只包含一个值: null Undefined :只包含一个值: undefined Boolean :包含两个值: true 和 false Number :整数或浮点数,还有一些特殊值( -Infinity 、 +Infinity 、 NaN ) String :一串表示文本值的字符序列 Symbol :一种实例是唯一且不可改变的数据类型 (在 es10 中加入了第七种原始类型 BigInt ,现已被最新 Chrome 支持) 对象类型 Object :除了常用的 Object , Array 、 Function

数据类型

南楼画角 提交于 2019-11-29 12:24:26
整数类型:byte(1) short(2) int(4) long(8) 字符类型:char(2) 用单引号括起来,例如'a'; java采用 Unicode字符集。 浮点类型:float(4) double(8) 布尔类型:boolean(ture ,false ),未规定其所占字节。 2.引用类型:数组,枚举,类,注解等。 3.简单类型所对应的引用类型: byte -> Byte short -> Short int ->Integer long ->Long float ->Float double ->Double char ->Character boolean ->Boolean 简单类型定义的变量,存放在栈中,并且存放的都是数值,引用类型定义的变量中(new出来的对象)存放在堆中,并且存放的都是其地址。 该程序上面输出为ture;下面输出为false。 该程序的结果为ture.其原因是包含了intValue()方法,有一个拆包的过程。 该程序输出为ture.虽然是引用类型存放的为地址。其中包含着一个处理过程 Integer.valueOf(10) 来源: https://www.cnblogs.com/128-cdy/p/11517605.html

流程控制和数组

随声附和 提交于 2019-11-29 12:18:32
本人博客园链接 https://www.cnblogs.com/zongmin/p/11339013.html 流程控制 break结束多重循环 public static void main ( String [ ] args ) { outer : for ( int i = 0 ; i < 5 ; i ++ ) { for ( int j = 0 ; j < 3 ; j ++ ) { System . out . println ( "i的值为:" + i + " j的值为:" + j ) ; if ( j == 1 ) { break outer ; } } } } //输出: //i的值为:0 j的值为:0 //i的值为:0 j的值为:1 当运行到 break outer; 时,直接结束 outer 这个标签标识的循环。 Contine忽略多重循环 public static void main ( String [ ] args ) { outer : for ( int i = 0 ; i < 5 ; i ++ ) { for ( int j = 0 ; j < 3 ; j ++ ) { System . out . println ( "i的值为:" + i + " j的值为:" + j ) ; if ( j == 1 ) { continue outer ; }

JAVA语言中的引用类型

安稳与你 提交于 2019-11-29 11:43:39
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存。C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存。这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题。一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果。开发人员有可能忘记显式的调用释放内存的函数而造成内存泄露。而自动的内存管理则是把管理内存的任务交给编程语言的运行环境来完成。开发人员并不需要关心内存的分配和回收的底层细节。Java平台通过垃圾回收器来进行自动的内存管理。 Java垃圾回收机制 Java的垃圾回收器要负责完成3件任务:分配内存、确保被引用的对象的内存不被错误回收以及回收不再被引用的对象的内存空间。垃圾回收是一个复杂而且耗时的操作。如果JVM花费过多的时间在垃圾回收上,则势必会影响应用的运行性能。一般情况下,当垃圾回收器在进行回收操作的时候,整个应用的执行是被暂时中止(stop-the-world)的。这是因为垃圾回收器需要更新应用中所有对象引用的实际内存地址。不同的硬件平台所能支持的垃圾回收方式也不同。比如在多CPU的平台上,就可以通过并行的方式来回收垃圾

JVM指令手册

蓝咒 提交于 2019-11-29 11:22:09
文章目录 栈和局部变量操作 将常量压入栈的指令 将栈中的值存入局部变量的指令 wide指令 通用(无类型)栈操作 类型转换 整数运算 逻辑运算 移位操作 按位布尔运算 浮点运算 对象和数组 对象操作指令 数组操作指令 控制流 条件分支指令 比较指令 无条件转移指令 表跳转指令 异常 方法返回指令 线程同步 JVM指令助记符 栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4压入栈 iconst_5 将int类型常量5压入栈 lconst_0 将long类型常量0压入栈 lconst_1 将long类型常量1压入栈 fconst_0 将float类型常量0压入栈 fconst_1 将float类型常量1压入栈 dconst_0 将double类型常量0压入栈 dconst_1 将double类型常量1压入栈 bipush 将一个8位带符号整数压入栈 sipush 将16位带符号整数压入栈 ldc 把常量池中的项压入栈 ldc_w 把常量池中的项压入栈(使用宽索引) ldc2_w

Java 内存分配全面浅析

纵然是瞬间 提交于 2019-11-29 09:40:11
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java。这类文章网上有很多,但大多比较零碎。本文从认知过程角度出发,将带给读者一个系统的介绍。 进入正题前首先要知道的是Java程序运行在JVM(Java Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要 性。所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提。 简单通俗的讲,一个完整的Java程序运行过程会涉及以下内存区域: l 寄存器: JVM内部虚拟寄存器,存取速度非常快,程序不可控制。 l 栈: 保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的 实例 ,即堆区 对象 的引用(指针)。也可以用来保存加载方法时的帧。 l 堆: 用来存放动态产生的数据,比如new出来的 对象 。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。 l 常量池: JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的 符号引用

深入浅出理解 . 深拷贝 . 浅拷贝

给你一囗甜甜゛ 提交于 2019-11-29 05:04:35
前言 百科定义:拷贝就是拷贝指向对象的 指针 ,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这个内存空间的所有指针需要重新定义,不然会造成指针错误。 拷贝内容总结 数据类型与堆栈的关系 基本类型与引用类型 . 基本类型:undefined,null,Boolean,String,Number,Symbol . 引用类型:Object,Array,Date,Function,RegExp等 存储方式 . 基本类型:基本类型值在内存中占据固定大小,保存在栈内存中(不包含闭包中的变量) . 引用类型:引用类型的值是对象,保存在堆内存中。而栈内存存储的是对象的变量标识符以及对象在堆内存中的存储地址(引用),引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。 . 注意: 闭包中的变量并不保存在栈内存中,而是保存在堆内存中。这一点比较好想,如果闭包中的变量保存在了栈内存中,随着外层中的函数从调用栈中销毁,变量肯定也会被销毁,但是如果保存在了堆内存中,内存函数仍能访问外层已销毁函数中的变量。看一段对应代码理解下: function A() { let a = 'koala' function B() {

Java深拷贝与浅拷贝

帅比萌擦擦* 提交于 2019-11-29 03:15:22
一、创建对象的方式 1. new关键字,A a=new A(); 2. Constructor类的newInstance()方法,反射实现 3. Class类的newInstance()方法,内部还是调用Constructor类的newInstance()方法,反射实现 4. clone()方法,复制对象产生一个新对象 5. 序列化反序列化 二、引用拷贝 vs 对象拷贝 A a1=new A(); A a2=a1; // a2和a1是同一个对象,内存地址相同,即引用相同 三、浅拷贝:值类型拷贝值,引用类型只拷贝了引用而不拷贝引用的对象,拷贝出来的对象和原对象共用引用 1. 当前类实现Cloneable接口 2. 引用类型使用的还是同一个引用 四、深拷贝:值类型和引用类型都复制,拷贝出来的对象和原对象相互独立 1. 除了类本身要实现Cloneable接口,类中的其他引用类也要实现Cloneable接口,比较麻烦 2. 对a1序列化,反序列化到a2,可以实现深拷贝 参考: https://www.cnblogs.com/ysocean/p/8482979.html 来源: https://www.cnblogs.com/june0816/p/11421457.html