引用类型

java基本类型和引用类型

被刻印的时光 ゝ 提交于 2020-03-06 05:12:23
一、基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32767,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-263~263-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0 double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0 char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空 boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false 二、引用数据类型: 类、接口类型、数组类型、枚举类型、注解类型。 引用自:https://blog.csdn.net/weixin_44509889/article/details/93347191 Demo // 引用类型 // 引用类型直接赋值的话,引用对象和被引用对象的值会相互改变 //

go slice切片引用类型详解

守給你的承諾、 提交于 2020-03-06 04:43:45
Golang的引用类型包括 slice、map 和 channel 。它们有复杂的内部结构,除了申请内存外,还需要初始化相关属性。 内置函数 new 计算类型大小,为其分配零值内存,返回指针。而 make 会被编译器翻译成具体的创建函数,由其分配内存和初始化成员结构,返回对象而非指针。 package main func main ( ) { a := [ ] int { 0 , 0 , 0 } // 提供初始化表达式。 a [ 1 ] = 10 b := make ( [ ] int , 3 ) // make slice b [ 1 ] = 10 c := new ( [ ] int ) c [ 1 ] = 10 // ./main.go:11:3: invalid operation: c[1] (type *[]int does not support indexing) } 引用类型 变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配。通过GC回收。 获取指针类型所指向的值,使用:” * “ 取值符号 。比如:var p int, 使用*p获取p指向的值 ** 指针、slice、map、chan **等都是引用类型。 new和make的区别 make 用来创建map、slice、channel new 用来创建值类型 new 和 make 均是用于分配内存:

泛型代码中的 default 关键字

淺唱寂寞╮ 提交于 2020-03-05 20:55:30
在泛型类和泛型方法中会出现的一个问题是,如何把缺省值赋给参数化类型,此时无法预先知道以下两点: l T将是值类型还是引用类型 l 如果T是值类型,那么T将是数值还是结构 对于一个参数化类型T的变量t,仅当T是引用类型时,t = null语句才是合法的; t = 0只对数值的有效,而对结构则不行。这个问题的解决办法是用default关键字,它对引用类型返回空,对值类型的数值型返回零。而对于结构,它将返回结构每个成员,并根据成员是值类型还是引用类型,返回零或空。下面MyList<T>类的例子显示了如何使用default关键字。更多信息,请参见泛型概述。 public class MyList<T> { //... public T GetNext() { T temp = default(T); if (current != null) { temp = current.Data; current = current.Next; } return temp; } } 来源: https://www.cnblogs.com/XiaoRuLiang/p/12422308.html

运行时中的泛型

大憨熊 提交于 2020-03-05 20:51:44
当泛型类或泛型方法被编译为微软中间语言(MSIL)后,它所包含的元数据定义了它的类型参数。根据所给的类型参数是值类型还是引用类型,对泛型类型所用的MSIL也是不同的。 当第一次以值类型作为参数来构造一个泛型类型,运行时用所提供的参数或在MSIL中适当位置被替换的参数,来创建一个专用的泛型类型。[JX3] 例如,假设你的程序代码声名一个由整型构成的栈,如: Stack<int> stack; 此时,运行时用整型恰当地替换了它的类型参数,生成一个专用版本的栈。此后,程序代码再用到整型栈时,运行时复用已创建的专用的栈。下面的例子创建了两个整型栈的实例,它们共用一个Stack<int>代码实例: Stack<int> stackOne = new Stack<int>(); Stack<int> stackTwo = new Stack<int>(); 然而,如果由另一种值类型——如长整型或用户自定义的结构——作为参数,在代码的其他地方创建另一个栈,那么运行时会生成另一个版本的泛型类型。这次是把长整型替换到MSIL中的适当的位置。由于每个专用泛型类原本就包含值类型,因此不需要再转换。 对于引用类型,泛型的工作略有不同。当第一次用任何引用类型构造泛型类时,运行时在MSIL中创建一个专用泛型类,其中的参数被对象引用所替换。之后,每当用一个引用类型作为参数来实例化一个已构造类型时,就忽略其类型

理解javascript中的原型模式

你说的曾经没有我的故事 提交于 2020-03-05 07:06:06
一、为什么要用原型模式。 早期采用工厂模式或构造函数模式的缺点: 1.工厂模式: 函数creatPerson根据接受的参数来构建一个包含所有必要信息的person对象,这个函数可以被无数次的调用,工厂模式尽管解决了创建多个相似对象的问题,却没有解决对象识别的问题(返回的是自定义的一个对象o,不明确对象o的类型)。 2. 构造函数模式: 构造函数的调用和其他oo语言一样,用new操作符来构建一个Person的实例;javascript中的构造函数也是函数(所以也可以直接像普通函数那样直接调用方法名)只不过可以用来创建对象,这是和其他oo语言不一样的地方(其他oo语言的构造函数不是函数,不能直接调用方法名,必须用new操作符来创建对象才可以),相同点是构造函数首字母都要大写,非构造函数首字母都是小写。 构造函数模式解决了创建多个相似对象的问题和对象识别的问题,但是不足的地方是,采用这种模式会创建多个完成同样任务的Function实例。 拿上面的例子来分析内存: 此时person1.isName===person2.isName 是为false的 不同实例上的同名函数是不相等的,我们希望有一种方法,即可以解决创建多个相似对象的问题和对象识别的问题,还能让每个实例共享相同的方法。 上面的例子可以做改进将方法提到构造函数的外面,单独写成一个全局函数,this.isName指向一个指针:

C# String是特殊的引用类型而非值类型

时光怂恿深爱的人放手 提交于 2020-03-04 23:05:51
转载来源:https://www.cnblogs.com/littlewrong/p/9927154.html  关于String为值类型还是引用类型的讨论一直没有平息,最近一直在研究性能方面的问题,今天再次将此问题进行一次明确。希望能给大家带来点帮助,如果有错误请指出。  来看下面例子:  //值类型  int a = 1;  int b = a;  a = 2;  Console.WriteLine("a is {0},b is {1}", a, b);  //字符串  String str1 = "ab";  String str2 = str1;  str1 = "abc";  Console.WriteLine("str1 is {0},str2 is {1}", str1, str2);  Console.Read();  根据上面的例子:你觉得输出结果应该是什么?  输出结果:  //a is 2,b is 1  //str1 is abc,str2 is ab  str2依然是ab,并没有随str1的改变而改变。  如果String是引用类型,按理Str1和Str指针都指向同一内存地址,如果Str的内容发生改变,Str1应该也会相应变化。  此例子,看着String更像是值类型,但是MSDN却说String是引用类型。  引用类型包括:  String  所有数组

C#:装箱和拆箱相关知识整理

大兔子大兔子 提交于 2020-03-04 21:56:02
1、装箱和拆箱是一个抽象的概念 2、 装箱是将 值类型 转换为 引用类型 ;   拆箱是将 引用类型 转换为 值类型    利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来 例如: int val = 100; object obj = val; Console.WriteLine (“对象的值 = {0}", obj); 这是一个装箱的过程,是将 值类型 转换为 引用类型 的过程 int val = 100; object obj = val; int num = (int) obj; Console.WriteLine ("num: {0}", num); 这是一个拆箱的过程,是将 值类型 转换为 引用类型 ,再由 引用类型 转换为 值类型 的过程 注:被装过箱的对象才能被拆箱 3、.NET中,数据类型划分为值类型和引用(不等同于C++的指针)类型,与此对应,内存分配被分成了两种方式,一为栈,二为堆( 注意:是托管堆 ) 值类型只会在栈中分配。 引用类型分配内存与托管堆。 托管堆对应于垃圾回收。 4: 装箱/拆箱是什么? 装箱 :用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的 隐式转换 。 拆箱 :从 object 类型到值类型或从接口类型到实现该接口的值类型的 显式转换

深入浅出 JavaScript 变量、作用域和内存 v 0.5

时光怂恿深爱的人放手 提交于 2020-03-04 16:25:05
本文主要从原理入手分享变量和作用域的相关知识,最后结合本文所分享知识,再次深入了解下闭包的运行原理。 主要参考《JS高级程序设计》 《JS权威指南》 《高性能 JS》 三本书。 目录 1 变量 1.1 变量的声明 1.2 变量类型的特点 2 执行环境和作用域 3 再谈谈闭包 变量 对 JavaScript 稍微有点了解的同学都知道,JavaScript 中的 变量 与其他语言的变量有很大区别。 JS 的弱类型的特性决定了变量只是在特定时间( 生命周期 , 作用域 中)用于保存特定值的一个名字而已。 一个变量可以在生命周期内任意改变类型。(太灵活了以至于好复杂) JavaScript 变量可以用来保存两种类型的值: 基本类型值 和 引用类型值 。 变量的声明 在JavaScript 程序中,使用一个变量之前应该先声明它。变量使用 var 关键字声明的。 如果在声明的时候没有进行初始化,那么默认初始化为undefined。 重复声明和遗漏声明 使用 var 关键字重复声明变量时合法的而且无害的,如果重复声明带有初始化,那么该声明和一条普通的赋值语句没什么两样。 在非严格模式下,给未声明的变量赋值,JS 会在全局作用域中创建一个同名变量,并赋值。(这会造成很多bug,因此应该使用 var 来声明变量。) 保存引用类型值的变量我们可以为其添加、改变和删除其属性和方法 。 var

C#第一节

淺唱寂寞╮ 提交于 2020-03-03 17:24:05
C#是一种简洁、现代、面向对象且类型安全的编程语言。是运行在.Net FarmWork 和 .Net core 之上的编程设计语言 C#开发是一种开发效率高,运行速度快,是有C语言和C++演变而来的。 Java既是一种平台,也是一种语言 .Net core近几年开发的平台,优点是可跨平台运行。编写的语言既可以在Windows平台上运行,也可以在Linux平台上运行,以及其他平台 1、C#和.net 的区别 就像演员和舞台,C#是演员,.Net是平台,平台给演员提供资源,也给其他演员(C++\VB等)提供场地。这名演员只能在平台上表演。但可以表演很多东西(V\B,C\B) 在VS上编写 2、C# 特性: 垃圾回收 (Garbage collection) 将自动回收不再使用 的对象所占用的内存; 异常处理 (exception handling) 提供了结构化和可扩展的错误检测和恢复方法; 类型安全 (type-safe) 的语言设计则避免了读取未初始化的变量、数组索引超出边界或执行未经检查的 类型强制转换等情形。 3、C# 具有一个同一类型系统 (unified type system)。   所有 C# 类型(包括诸如 int 和 double 之类的基元类 型)都继承于一个唯一的根类型:object。因此,所有类型都共享一组通用操作,并且任何类型的值都能够以一致的方式进行存储

java 引用类型

喜你入骨 提交于 2020-03-03 07:18:15
引用分为强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,这4种引用强 度依次逐渐减弱。 强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。 软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK1.2版之后提供了SoftReference类来实现软引用。 弱引用也是用来描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK 1.2版之后提供了WeakReference类来实现弱引用。 虚引用也称为“幽灵引用”或者“幻影引用”,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是