引用类型

解惑真小白的苦恼 | 类的对象,对象引用,对象实例,引用变量

末鹿安然 提交于 2019-12-04 04:36:16
对于刚接触不久面向对象的真小白童鞋来说,类的对象,对象的实例,对象的引用,引用变量的问题以及莫过于没得对象~虽然博主也没得对象~,本文将逐个逐个讲解! 1.何谓对象?   在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一。要理解什么是对象,需要跟类一起结合起来理解。下面这段话引自《Java编程思想》中的一段原话:    “按照通俗的说法,每个对象都是某个类(class)的一个实例(instance),这里,‘类’就是‘类型’的同义词。”   从这一句话就可以理解到对象的本质,简而言之,它就是类的实例,比如所有的人统称为“人类”,这里的“人类”就是一个类(物种的一种类型),而具体到每个人,比如张三这个人,它就是对象,就是“人类”的实例。    2.何谓对象引用? 我们先看一段话,这段话同样来自于《Java编程思想》:    “每种编程语言都有自己的数据处理方式。有些时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。所有这些在 Java 里都得到了简化,一切都被视为对象。因此,我们可采用一种统一的语法。尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“引用”(reference)。”   很显然,从这段话可以看出对象和对象引用不是一回事

漫谈值类型和引用类型

白昼怎懂夜的黑 提交于 2019-12-04 02:46:00
一.前言 从这个简单程序的输出结果,你想到了什么?是不是与你心中想的结果不一致?是不是觉得输出的结果应该为: i is 1,o is 8,o2 is 8 二.程序执行前 图 2 我们都知道,每一个方法在执行前,操作系统会给方法内每个变量分配内存空间。从图2中就可以看出,在执行前各变量(i,o,o2)已分配了内存,且各自都有初始值。 从图中,可以发现变量i和变量o,o2有些许不同。变量i在内存中存储的值和程序中的值是一样的,都是0;变量o,o2在内存中存储的值和程序中的值不一样,内存中存储的值是一个地址(0x00000000),程序中的值是null,那变量o,o2的null值存储在哪呢?为什么变量i和变量o,o2会有如此大的不同呢? 我们都知道,C#有两大类型:值类类型和引用类型。图2中int属于值类型,object属于引用类型。接下来,介绍一下值类型和引用类型: 1.值类型的值存储在内存栈上,引用类型的值存储在内存堆中。 园中有很多博文这么描述,我用程序验证了一下全局的值类型变量的值,静态的值类型变量的值,引用类型实例中值类型成员的值,如下图3 图 3 从图中,可以看出变量(j,o,seg,st)的值应该是在同一个存储区域中,而变量(gi)是在另外一个存储区域中。引用类型Student的成员Age的地址还未分配。所以说值类型的值存储在内存栈上是不准确的。 查找了一些资料

atomicReference示例

别等时光非礼了梦想. 提交于 2019-12-04 00:58:30
对引用类型的原子性操作 /** * * 对引用变量的原子操作 note: * 在java中对引用类型的变量,赋值是原子性的,为什么还要有atomicReference,假如要对一个引用类型进行比较,设置等多于一个的操作,还要他们保证原子性时,就要用到 * atomicReference */ public class AtomicReferenceTest { public static void main(String[] args) { // 创建两个Person对象,它们的id分别是101和102。 Person p1 = new Person(101); Person p2 = new Person(102); // 新建AtomicReference对象,初始化它的值为p1对象 AtomicReference<Person> ar = new AtomicReference<Person>(p1); // 通过CAS设置ar。如果ar的值为p1的话,则将其设置为p2。 if (ar.compareAndSet(p1, p2)) { System.out.println("设置成功"); } Person p3 = (Person) ar.get(); // 取出来的是p2值 System.out.println("p3 is " + p3); System.out

JVM指令手册

≯℡__Kan透↙ 提交于 2019-12-03 23:38:59
栈和局部变量操作 将常量压入栈的指令 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 从局部变量中装载double类型值 aload 从局部变量中装载引用类型值(refernce)

父类强制转换为子类

自古美人都是妖i 提交于 2019-12-03 23:15:11
java的强制类型转换 强制类型转换,又叫造型。分为基本数据类型和引用数据类型两种情况,这里探讨后者,即引用类型的强制类型转换。 对于引用类型来说,什么是强制类型转换呢?简单地说,就是把父类型转换为子类型。因为子类型比父类型的内涵要丰富,无非就是属性更多功能更强,所以要把父类型转换为子类型,需要强制,所以叫强制类型转换。那么,是不是只要是父类型的变量就可以转换为子类型呢?事实上不是,这里是有条件限制的。 首先来看发生在什么情况下。我们用一个类型的构造方法构造出一个对象的时候,对象的类型已经确定了,就是这个类型,但是java允许我们可以不用这个类型的变量引用它,而使用它的父类类型,这时候情况就是我们用一个功能较弱的类型引用了一个功能较强的对象。然而有时候我们又希望这个对象完全发挥它的作用,就需要用一个它本身的类型的变量来引用它,因为原来那个父类的变量是不具备这些功能的,不能使用variablename.function()来使其发挥作用,所以还是用它自己的吧。问题是对象已经在内存中了,已经构造完了,你即使声明一个它本身类型的变量怎么指向它呢?答案是借助原来那个变量,就是它父类型的那个变量,让新的变量和原来的那个指向同一个对象。方式就是两者之间划等号。可是引用类型变量的相等需要两者类型相同,问题是不相同,怎么办?那就是把父类型的变量强制转换成子类型。 举个例子来说

转:String为值类型还是引用类型

萝らか妹 提交于 2019-12-03 23:03:39
关于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 所有数组,即使其元素是值类型 类类型,如 Form 委托 查看具体引用是否相同

tolua#代码简要分析

时光毁灭记忆、已成空白 提交于 2019-12-03 13:56:17
简介 tolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信息分析代码并生成包装的类。它是一个用来简化在C#中集成lua的插件,可以自动生成用于在lua中访问Unity的绑定代码,并把C#中的常量、变量、函数、属性、类以及枚举暴露给lua。它是从cstolua衍变而来。从它的名字可以看出,它是集成了原来的tolua代码通过二次封装写了一个C#与tolua(c)的一个中间层。 All problems in computer science can be solved by another level of indirection, except of course for the problem of too many indirections 基础 要想了解tolua#是如何集成的我们需要对C#的一些特性有一些了解,比如了解C#与原生代码交互的方式等。,我们假设读者已经对lua和tolua++有一个比较熟悉,我们略过lua与c或者C++的交互方式,主要介绍一些C#的特性,来帮助我们接下来分析tolua#的集成原理。 C#特性 Attribute Attribute 是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。特性Attribute 的作用是添加元数据。元数据可以被工具支持,比如:编译器用元数据来辅助编译

浅谈js的内存与闭包

做~自己de王妃 提交于 2019-12-03 10:28:23
本文转载于: 猿2048 网站➤ https://www.mk2048.com/blog/blog.php?id=icjj10hjaa 本文来自于我的 github 0.前言 主要结合了内存的概念讲了js的一些的很简单、但是又不小心就犯错的地方。 结论:js执行顺序,先定义,后执行,从上到下,就近原则。闭包可以让外部访问某函数内部变量,而且会导致内存泄漏。 1.先说类型 在ECMAscript数据类型有基本类型和引用类型,基本类型有Undefined、Null、Boolean、Number、String,引用类型有Object,所有的的值将会是6种的其中之一(数据类型具有动态性,没有定义其他数据类型的必要了) 引用类型的值,也就是对象,一个对象是某个引用类型的一个实例,用new操作符创建也可以用字面量的方式(对象字面量创建var obj ={ })。ECMA里面有很多原生的引用类型,就是查文档的时候看见的那些:Function、Number (是对于原始类型Number的引用类型)、String(是对于原始类型String的引用类型)、Date、Array、Boolean(...)、Math、RegExp等等。 在程序运行的时候,整块内存可以划分为常量池(存放基本类型的值)、栈(存放变量)、很大的堆(存放对象)、运行时环境(函数运行时) 基本数据类型的值是直接在常量池里面可以拿到

java包装类和值类型的关系

自闭症网瘾萝莉.ら 提交于 2019-12-03 10:17:06
java包装类总是让人疑惑 它与值类型到底是怎么样一种关系? 本文将以int和Integer为例来探讨它们的关系 java值类型有int short char boolean byte long float double 除此之外的类型皆为引用类型 引用类型和值类型的区别大家都很熟悉 在这里就不多说了 引用类型和值类型有一个很重要的区别 那就是引用类型继承Object类 值类型不是 而java很多泛型容器都要求类型继承Object 调用虚方法要求必须是引用类型 很明显这些值类型不满足这个要求 怎么办? 包装类应运而生 包装类有Integer Short Char Boolean Byte Long Float Double和上文的值类型是对应的 既然包装类是引用类型 那么他就应该可以传递到别的方法被修改 public static void change(Integer a) { a *= 6; } public static void main(String[] args) { Integer integer = new Integer(5); change(integer); System.out.println(integer); } 然而 以上程序输出的结果是5 跟下文代码的结果是相同的 这是为什么? public static void change(int a) { a

何谓数组

回眸只為那壹抹淺笑 提交于 2019-12-03 06:44:51
初识数组 一、 数组的概述 数组可以看成是多个相同类型数据的组合,对这些数据的统一管理。 所谓数组(Array),就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类 型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为 数 组名,编号称为 下标。组成数组的各个变量称为数组的分量,也称为数组的 元素,有 时也称为下标变量。数组是在程序设计中,为了处理方便,把具有相同类型的若干变 量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组 “[]”。 数组变量属于引用类型,数组也可看成是对象,数组中的每个元素相当于该对象的成 员变量 数组中的元素可以是任何数据类型,包括基本类型和引用类型。 数组是相同数据类型的有序集合。数组描述的是相同类型的若干个数据,按照一定的先 后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个 下标来访问它们. 数组具有以下特点: 定长:长度一旦确定不可以改变。 相同数据类型:其元素必须是 相同 类型 ,不允许出现混合类型。数组中的元素可以是任何数据类型,包括基本类型和引用类型。 位置有序:元素所在的位置是有序的。 数组本身属于引用类型:数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成 员变量。数组本身就是对象, Java 中对象是在堆中的