引用类型

值类型 引用类型

◇◆丶佛笑我妖孽 提交于 2020-01-25 02:11:50
值类型和引用类型最大的区别是内存分配的差异 : Stack 栈:线程栈,由操作系统管理, 存放值类型 ,引用类型变量( 引用对象在托管堆上的地址 )。一个线程包含一个线程栈,对象作用域结束后清理,效率高。 GC Heap 托管堆: 存放引用类型 ,分配的对象由GC负责管理和释放,基于进程。 值类型一直存储在栈上吗?所有的引用类型都存储在托管堆上吗? 1.单独的值类型变量,存储在栈上面; 2.值类型作为class的某个字段,会随着引用类型存储在托管堆上,作为引用类型的一部分; 3.引用类型总是存储在托管堆上,但是引用类型变量即(引用类型对象在托管堆上的地址)是存储在栈上。 结构和类的区别 : 结构体是值类型,类是引用类型。 1.结构体不支持自定义无参构造函数,自定义构造函数只能带有参数,要保留默认无参构造函数,不支持析构函数, C#中不能有protected修饰符,不支持继承,成员变量不能定义初始值; 2.class支持抽象,struct不支持抽象; 当一个类型仅仅是原始数据的集合,而不需要复杂的操作时,就应该设计为struct,否则就应该设计为一个class 。 out和ref区别:ref需要初始化。 看到一篇文章写的巨好: https://www.cnblogs.com/anding/p/5229756.html 来源: CSDN 作者: HelloWorldTianNa 链接:

.Net(C#)中,对象的相等比较问题

[亡魂溺海] 提交于 2020-01-24 20:46:59
以前一直没有关心这个问题,被别人问起,特记录一下. ( From csdn) 在讨论了运算符,并简要介绍了等于运算符后,就应考虑在处理类和结构的实例时相等意味着什么。理解对象相等比较的机制对编写逻辑表达式非常重要,另外,对实现运算符重载和数据类型转换也非常重要,本章的后面将讨论运算符重载。 对象相等比较的机制对于引用类型(类的实例)的比较和值类型(基本数据类型,结构或枚举的实例)的比较来说是不同的。下面分别介绍引用类型和值类型的相等比较。 5.3.1 引用类型的相等比较 System.Object的一个初看上去令人惊讶的方面是它定义了3个不同的方法,来比较对象的相等性:ReferenceEquals()和Equals()的两个版本。再加上比较运算符==,实际上有4种进行相等比较的方式。这些方法有一些微妙的区别,下面就介绍这些方法。 1. ReferenceEquals()方法 ReferenceEquals()是一个静态方法,测试两个引用是否指向类的同一个实例,即两个引用是否包含内存中的相同地址。作为静态方法,它不能重写,所以只能使用System.Object的实现代码。如果提供的两个引用指向同一个对象实例,ReferenceEquals()总是返回true,否则就返回false。但是它认为null等于null: SomeClass x, y; x = new SomeClass(

AJPFX分析int 和integer的区别

 ̄綄美尐妖づ 提交于 2020-01-24 13:48:07
int是java提供的8种原始数据类型之一。 Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。 int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况, 例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。 在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。 另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。 int 是基本类型。 Integer是引用类型。。 比如int a= 5; Integer b = 5; 对于a你只能用来做计算。。比如加减乘除 b你可以用来做很多事情,因为他是一个对象,他有很多方法,你可以像使用String对象那样使用它。 java

[你必须知道的.NET]第十四回:认识IL代码---从开始到现在

匆匆过客 提交于 2020-01-24 06:16:01
本文将介绍以下内容: · IL代码分析方法 · IL命令解析 · .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持,给予了 anytao 巨大的鼓励和动力。俱往昔,我发现很多的园友都把目光和焦点注意在如何理解IL代码这个问题上。对我来说,这真是个莫大的好消息,因为很明显我们的思路慢慢的从应用向底层发生着转变,技巧性的东西是一个方面的积累,底层的探索在我认为也是必不可少的修炼。如果我们选择了来关注这项修炼,那么我们就应该选择如何来着手这项修炼,首先关注 anytao 的『你必须知道的.NET』系列可以给你提供一个捷径,少花一些功夫;其次对大师级的作品也应有更深入的了解,如《Applied Microsoft .NET Framework Programming》、《.NET本质论》;再次,就是像我一样从博客园和MSDN的知识库中不断的成长。呵呵,除了给自己做了个广告之外,我认为不管是何种途径,了解和认识IL代码,对于我们更深刻的理解.NET和.NET应用之上的本质绝对有不一样的收获,这也就是本文研究和分享的理由。 那么,我们要了解IL代码,就要知道了解IL的好处,时间对每个程序设计师来说都是宝贵的,你必须清楚自己投资的价值再决定投入的资本。对于.NET程序员来说,IL代码意味着: · 通用的语言基础是.NET运行的基础

值类型和引用类型,栈和堆的含义

谁说胖子不能爱 提交于 2020-01-24 04:01:23
本文主要是讨论栈和堆的含义,也就是讨论 C#的两种类据类型 : 值类型和引用类型; 虽然我们在.net中的框架类库中,大多是引用类型,但是我们程序员用得最多的还是值类型。 引用类型如:string,Object,class等总是在从托管堆上分配的,C#中new操作符返回对象的内存地址--也就是指向对象数据的内存地址。 以下是值类型与引用类型的表: 我们来看下面一段代码: 首先在类中声明 一个class类 ,和 一个struct结构,如图: 并使用在程序入口调用它们,如图 : 现在我们来看一看,它们在内存当中是如何存储的? 从这张图可以看出, class(类) 实例化出来的对象,指向 了内存堆 中分配的空间 struct(结构) 实例化出来的对象 ,是在 内存栈 中分配 接下来,我们再来在上面的程序做如下修改: 红框,代码定义一个class实例化对象s2,然后把对象s1赋值给s2 蓝框,代码定义一个结构实例化对象r2,然后把对象r1赋值给r2 那它们输出的结果是多少呢?请选择( ) A、 s1的值为:12 s2的值为222 r1的值为:16 r2的值为666 B、 s1的值为:12 s2的值为222 r1的值为:666 r2的值为666 C、 s1的值为:222 s2的值为222 r1的值为:16 r2的值为666 D、 s1的值为:222 s2的值为222 r1的值为:666

了解Java程序之面向对象

怎甘沉沦 提交于 2020-01-24 01:10:29
面向对象 形式参数是引用类型和返回值是引用类型解析: 形式参数是基本类型对实际参数没有任何影响; 形式参数是引用类型: 具体类 :实际参数传递的是需要改具体类对象! 抽象类 :实际参数传递到的是需要改抽象类的子类对象 举例:jdk提供的Scanner类 构造方法 Scanner(InputStream source) public abstract class InputStream :抽象类 接口:实际参数需要传递的是该接口的子实现类的对象 举例: TreeSet 集合 public TreeSet(Comparator comparator) 构造方法中传递是一个接口类型:Comparato 接口 interface Work { void teach ( ) ; } //定义一个类 class TeacherDemo { public void function ( Work w ) { //形式参数是一个接口类型,需要传递该接口的子实现类对象 w . teach ( ) ; //Work w = new Teacher(); 接口多态的方式 } } //定义一个接口的子实现类 class Teacher implements Work { //重写teach(){} public void teach ( ) { System . out . println (

java之final关键字

大憨熊 提交于 2020-01-23 17:52:48
final可已修饰类 方法 变量; 修饰类 不可以被继承 修饰方法 不可以被子类重写 修饰变量 修饰基本类型变量时: 变量在初始化后值不能发生变化; 修饰引用类型变量时: 变量在初始化后不能再指向其它变量,地址值不能改变;对象的属性是可以修改的; public class Demo { private static final int a = 1 ; private static final Student student = new Student ( "小明" , null , null , 0 , new Date ( ) ) ; public static void main ( String [ ] args ) { a = 2 ; //编译报错 基本类型初始化后不能被修改 student . setAge ( 12 ) ; //编译通过 引用类型修改对象属性值可以 student = new Student ( "小明" , null , null , 0 , new Date ( ) ) ; //编译报错 引用类型地址值改变 } } 来源: CSDN 作者: 藏獒的故事 链接: https://blog.csdn.net/weixin_40292351/article/details/104076107

C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?

末鹿安然 提交于 2020-01-23 14:29:32
1.前言 == Equals ReferenceEquals 三个相等性测试,是.NET提供给程序员使用的三个方法,他们之间有什么联系和区别,你真的仔细研究过?虽然之前也多多少少知道一点,但是有时候又难免混淆他们之间的概念和所适用的场合,决定做一个总结系统的描述这三个宝宝 2.值类型比较和引用类型比较 在编程中实际上我们只需要这两种比较,c#中类型也就这两种   (1)值类型的比较:一般我们就是判断两个值类型实例的各自包含的值是否相等   (2)引用类型的比较:由于引用类型在内存中的分布有两部分,一个是引用类型的引用(存在于线程栈中),一个是引用类型的值(存在于托管堆);所以我们比较引用类型也就存在两种比较 默认情况下:值类型比较的是两个值是否相等(不装箱情况下),引用类型比较的是两个引用是否相等。 3.==, Equals,ReferenceEquals 的阐述 3.1 ==    定义:静态 相等符号,对应存在的!=,这个符号是一个可以重载的二元操作符,可以用于比较两个对象是否相等。使用==比较对象时,C#在 编译时 就决定了所比较的类型,而且不会执行任何虚方法(Object.Equals)。这是大家所期望的相等行比较。 对于内置值类型,==判断的是两个对象的代数值是否相等 。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false 对于引用类型

JavaScript高级程序设计重点(一)

大兔子大兔子 提交于 2020-01-23 03:44:02
1.一个完整的 JavaScript 实现应该由下列三 个不同的部分组成  核心(ECMAScript)  文档对象模型(DOM)  浏览器对象模型(BOM) 2.Undefined 类型只有一个值,即特殊的 undefined。在使用 var 声明变量但未对其加以初始化时, 这个变量的值就是 undefined, 例如: var message; alert(message == undefined); //true 3.Null 类型是第二个只有一个值的数据类型,这个特殊的值是 null。从逻辑角度来看,null 值表 示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回"object"的原因,如下面 的例子所示: var car = null; alert(typeof car); // "object" 4.Object 的每个实例都具有下列属性和方法。  constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor) 就是 Object()。  hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例 的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例 如:o.hasOwnProperty(

Java中的内存处理机制和final、static、final static总结

北战南征 提交于 2020-01-22 16:43:51
装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性。所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提。 一个完整的Java程序运行过程会涉及以下内存区域: 寄存器: JVM内部虚拟寄存器,存取速度非常快,程序不可控制。 栈: 保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存类的 实例 ,即堆区 对象 的引用(指针)。也可以用来保存加载方法时的帧。 堆: 用来存放动态产生的数据,比如new出来的 对象 。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。 常量池: JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的 符号引用(1) 。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。