引用类型

C#类型转换

百般思念 提交于 2019-11-29 02:17:08
  一、由于C#是强类型语言,变量在声明后不能重新声明为其它类型,但可以通过类型转换(Type Conversion)将符合转换条件的其它类型的变量转换为目标类型的变量,有以下几种类型的转换方式:   二.隐式转换(Implicit Conversion):该转换是一种安全的类型转换,不会导致数据丢失,因此不需要任何显式操作;从较低精度/较小范围类型到较高精度/较大范围类型的转换以及从派生类到基类和所实现接口的转换都是隐式转换;   1.隐式转换在代码中不需要任何显式操作,对于值类型: double myDouble = 1f; //1   ※所有数值类型之间的隐式转换关系详见;   2.对于引用类型,一种类型的变量或对象可以直接隐式转换为任何一个直接或间接基类和所实现接口类型的变量: public class MyBaseClass { } public interface IMyInterface { } public class MyClass : MyBaseClass, IMyInterface { } MyClass myClass = new MyClass(); MyBaseClass myBaseClass = myClass; //派生类变量隐式转换为基类变量 IMyInterface myInterface = new MyClass(); /

JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

烂漫一生 提交于 2019-11-29 01:47:07
前言 想写好前端,先练好内功。 栈内存与堆内存 、浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然。 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。 栈 定义 后进者先出,先进者后出,简称 后进先出 (LIFO),这就是典型的 栈 结构。 新添加的或待删除的元素都保存在栈的末尾,称作 栈顶 ,另一端就叫 栈底 。 在栈里,新元素都靠近栈顶,旧元素都接近栈底。 从栈的操作特性来看,是一种 操作受限 的线性表,只允许在一端插入和删除数据。 不包含任何元素的栈称为 空栈 。 栈也被用在编程语言的编译器和内存中保存变量、方法调用等,比如函数的调用栈。 堆 定义 堆数据结构是一种树状结构。 它的存取数据的方式,与书架与书非常相似。我们不关心书的放置顺序是怎样的,只需知道书的名字就可以取出我们想要的书了。 好比在 JSON 格式的数据中,我们存储的 key-value 是可以无序的,只要知道 key,就能取出这个 key 对应的 value。 堆与栈比较 堆是动态分配内存,内存大小不一,也不会自动释放。 栈是自动分配相对固定大小的内存空间,并由系统自动释放。 栈,线性结构,后进先出,便于管理。 堆,一个混沌,杂乱无章,方便存储和开辟内存空间。 栈内存与堆内存 JavaScript

gcnew 与 new 的区别

和自甴很熟 提交于 2019-11-29 00:41:40
C++/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用^来替换* ,就语义上来说他们的区别大致如下: gcnew返回的是一个句柄(Handle),而new返回的是实际的内存地址. gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放. 那什么又是托管堆呢? 内存格局通常分为四个区 全局数据区:存放全局变量,静态数据,常量 代码区:存放所有的程序代码 栈区:存放为运行而分配的局部变量,参数,返回数据,返回地址等, 堆区:即自由存储区 值类型变量与引用类型变量的内存分配模型也不一样。为了理解清楚这个问题,读者首先必须区分两种不同类型的内存区域:线程堆栈(Thread Stack)和托管堆(Managed Heap)。 每个正在运行的程序都对应着一个进程(process),在一个进程内部,可以有一个或多 个线程(thread),每个线程都拥有一块“自留地”,称为“线程堆栈”,大小为1M,用于保 存自身的一些数据,比如函数中定义的局部变量、函数调用时传送的参数值等,这部分内存 区域的分配与回收不需要程序员干涉。 所有值类型的变量都是在线程堆栈中分配的。 另一块内存区域称为“堆(heap)”,在.NET 这种托管环境下,堆由CLR 进行管理,所 以又称为“托管堆(managed heap)”。 用new 关键字创建的类的对象时

Java的深拷贝和浅拷贝

北城余情 提交于 2019-11-28 23:05:15
  关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用传递将会有更深的理解。 1、创建对象的5种方式    ①、通过 new 关键字   这是最常用的一种方式,通过 new 关键字调用类的有参或无参构造方法来创建对象。比如 Object obj = new Object();    ②、通过 Class 类的 newInstance() 方法   这种默认是调用类的无参构造方法创建对象。比如 Person p2 = (Person) Class.forName("com.ys.test.Person").newInstance();    ③、通过 Constructor 类的 newInstance 方法   这和第二种方法类时,都是通过反射来实现。通过 java.lang.relect.Constructor 类的 newInstance() 方法指定某个构造器来创建对象。   Person p3 = (Person) Person.class.getConstructors()[0].newInstance();   实际上第二种方法利用 Class 的 newInstance() 方法创建对象,其内部调用还是

03课堂问题总结归纳

回眸只為那壹抹淺笑 提交于 2019-11-28 22:50:17
1 、 早期我们经常这样定义变量 “int value=100;”, 而前面的示例中这样定义变量 “MyClass obj=new MyClass();”, 这两种方式定义的变量是一样的吗? 不一样,前者为原始数据类型;后者为引用类型的变量,又简称对象变量。当声明一个对象的变量时,实际上并没有创建一个对象,此变量 =null ,定义一个原始数据类型时的变量时会马上给其分配内存。在定义变量时, java 要求显示初始化变量。对象变量如果不引用一个真实的对象,则必须声明为 null 。 当对象不再使用时, JVM 会回收 MyClass 对象所占用的内存,这个过程称为“垃圾回收 2 、 对于原始数据类型的变量(比如 int) ,可以直接使用“ == ”判断两变量值是否相等 对象变量也可以使用 “ == ”判断两变量值是否相等吗? 当 “ == ”施加于原始数据类型变量时,是比较变量所保存的数据是否相等 当 “ == ”施加于引用类型变量时,是比较这两个变量是否引用同一对象。 引用代表地址,所以 “ == ”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。 3 、如何比较两个对象的“内容”是否一样? 两个对象的 “内容”,其实是指它们在某一时刻的所有字段的值,“内容相等”,其实是就“对应字段值”一致。 在 Java 中要比对两个对象的字段值,可以 “重写( override )

C#关键字

≡放荡痞女 提交于 2019-11-28 21:46:18
参考链接: https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords 关键字是预定义的保留标识符,对编译器有特殊意义。若需要使用关键字作为标识符,则需要在关键字前面添加@前缀。 关键字有两种:一种是C#程序任意部分中的保留标识符的关键字;一种是仅在一部分程序上下文中作为关键字使用,在相应上下文范围之外用作标识符。(注:C#语言中新增的关键字会作为上下文关键字添加,以免破坏用旧版语言编写的程序) C#类型   值类型的变量可存储数据,引用类型的变量可存储对实际数据的引用。引用类型的实例称作对象。仅在 不安全模式 下才可使用指针类型。   值类型与引用类型之间会发生 装箱和拆箱 操作。(注:只有已装箱值类型才能进行拆箱操作)   ====值类型====   值类型复制是复制该值,而引用类型复制是复制引用。   所有的值类型都隐式派生自System.ValueType。每个值类型都具有一个初始化该类型的默认值的隐式构造函数。   与引用类型不同,值类型不能从值类型派生新类型。但是,与引用类型一样,结构类型可以实现接口。   值类型变量不能默认为null,但相应的 可为空类型 的变量可以为null。   ====引用类型====   class   delegate --> event   

JavaScript 中的对象引用

↘锁芯ラ 提交于 2019-11-28 20:27:14
ECMAScirpt 变量有两种不同的数据类型: 基本类型,引用类型 。也有其他的叫法,比如 原始类型和对象类型 , 拥有方法的类型和不能拥有方法的类型 ,还可以分为 可变类型和不可变类型 ,其实这些叫法都是依据这两种的 类型特点来命名! 1.基本类型 基本的数据类型有:`undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。基本类型有以下几个特点: 1.基本类型的值是不可变得: 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = 'jozo'; name.toUpperCase(); // 输出 'JOZO' console.log(name); // 输出 'jozo' 会发现原始的name并未发生改变,而是调用了toUpperCase()方法后返回的是一个新的字符串。 再来看个: var person = 'jozo'; person.age = 22; person.method = function(){//...}; console.log(person.age); // undefined console.log(person.method); // undefined 通过上面代码可知,我们不能给基本类型添加属性和方法,再次说明基本类型时不可变得; 2

JVM命令手册

天涯浪子 提交于 2019-11-28 17:47:13
原文链接:https://blog.csdn.net/qq_41345773/article/details/93895532 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 把常量池中long类型或者double类型的项压入栈(使用宽索引) 从栈中的局部变量中装载值的指令 iload 从局部变量中装载int类型值 lload 从局部变量中装载long类型值 fload 从局部变量中装载float类型值 dload

面向对象的三大特性

半世苍凉 提交于 2019-11-28 16:21:42
面向对象技术的三大特性:继承性、多态性和封装性。 继承性 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。 比如兔子和羊属于 食草动物和食肉动物又是属于动物类。 所以继承需要符合的关系是:is-a,父类更通用,子类更具体。 虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。 继承的特性 子类拥有父类非private的属性,方法。 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。 子类可以用自己的方式实现父类的方法。 Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。 super 与 this 关键字 super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。 this关键字:指向自己的引用。 对于构造器而言,它只能够被调用,而不能被继承 子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的

C++基础-引用类型

一世执手 提交于 2019-11-28 16:19:48
1. 引用简介: 引用(reference)不是新定义一个变量, 而是给已存在的对象取了 一个别名 ,引用类型,引用另外一种类型。 编译器不会为引用对象新开辟内存空间, 它和它引用的对象共用同一块内存空间。 (1).引用是为对象起了另一个名字,所以引用的必须是对象,且引用必须初始化。 (2).引用不是对象,不能定义引用的引用,也不能定义指向引用的指针。 (3).引用只能绑定在对象上,不能与字面值或某个表达式的计算结果绑定在一起。 (4).引用的类型要和绑定的对象类型一致。 (5).将一个 常量引用 绑定到另一种类型上是,会先绑定到临时变量,再绑定到常量引用。 double dval=3.14; 过程 step1: const int temp=dval; //创建临时常量 const int &ri=dval; =====> step2: const int &ri=temp; //将临时常量绑定到常量引用 (6).注意:引用符号与指针取址符号相同。 int i=10; int &a=i; //引用 int *b=&i; //指针 2.何时使用引用 使用引用参数的主要原因有两个: ① 能够修改调用函数中的数据对象; ② 当数据对象较大时(结构和类对象),通过传递引用而不是整个数据对象,可以提高程序运行速度。 对于使用传递的值而不作修改的函数: ① 如果数据对象很小