引用类型

Java关键字(一)——instanceof

雨燕双飞 提交于 2020-02-09 05:37:23
  instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为: boolean result = obj instanceof Class   其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。   注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。 1、obj 必须为引用类型,不能是基本类型 int i = 0; System.out.println(i instanceof Integer);//编译不通过 System.out.println(i instanceof Object);//编译不通过   instanceof 运算符只能用作对象的判断。 2、obj 为 null System.out.println(null instanceof Object);//false   关于 null 类型的描述在官方文档: https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.1 有一些介绍

javascript变量的作用域

此生再无相见时 提交于 2020-02-09 02:11:37
基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指的是那个可能由多个值组成的对象 讲一个值赋值给变量时,javascript解析器首先要确定是基本类型还是引用类型,基本数据类型可以直接操作保存在变量中的值,而引用数据类型的值是保存在内存中的对象,在操作对象是,实际上操作的是对象的引用而不是实际的对象 变量的赋值 如果从一个变量上向另一个变量上复制__基本数据类型__的值,会在变量对象上创建一个新值,然后把该值复制到新变量的位置上,这个很好理解,来看下例子: var num1 = 5; var num2 = num1;   这是基本数据类型,而引用类型呢?其实同样会将原来变量上的值复制一份到新的变量当中,只不过,复制的其实是原来变量的一个指针,而这个指针指向存储在堆中的一个对象。复制完成后,两个变量都指向了堆中的同一个对象,所以改变其中一个的值,会对另外一个产生影响。有以下代码 var obj1 = new Object(); var obj2 = obj1; obj1.name = "Nicholas"; alert(obj2.name); //"Nicholas"    传递参数 在javascript里面,参数的传递都是按照`值类型来传递`的,即使你传入的是一个引用类型 function setName(obj) { obj.name = "Nicholas";

javascript变量的作用域

孤者浪人 提交于 2020-02-09 02:10:33
一、基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指的是那个可能多个值组成的对象。 将一个值给变量时,javascript解析器首先要确定是基本类型还是引用类型,基本数据类型可以直接操作保存在变量中的值,而引用数据类型的值是保存在内存中的对象,在操作对象时,实际上操作的是对象的引用而不是实际的对象。 二、变量的赋值 如果从一个变量上向另一个变量上复制 基本数据类型 的值,会在变量对象上创建一个新值,然后把该值复制到新变量的位置上, 如下代码: var num1 = 5; var num2 = num1; 引用类型, 其实同样会将原来变量上的值复制一份到新的变量当中,只不过,复制的其实是原来变量的一个指针,而这个指针指向存储在堆中的一个对象。复制完成后,两个变量都指向了堆中的同一个对象,所以改变其中一个的值,会对另外一个产生影响。如下代码: var obj1 = new Object(); var obj2 = obj1; obj1.name = "Nicholas"; alert(obj2.name); //"Nicholas"    三、传递参数 在javascript里面,参数的传递都是按照 值类型来传递 的,即使你传入的是一个引用类型 function setName(obj) { obj.name = "Nicholas"; } var person =

C# 值类型和引用类型

旧城冷巷雨未停 提交于 2020-02-08 18:36:37
类型被分为两种: 值类型(整数,bool, struct, char, 小数) 引用类型(string, 数组 ,自定义的类,内置的类) 值类型只需要一段单独的内存,用于存储实际的数据,(单独定义的时候放在栈中) 引用类型需要两段内存 第一段存储实际的数据,它总是位于堆中 第二段是一个引用,指向数据在堆中的存放位置 来源: CSDN 作者: Cuijiahao 链接: https://blog.csdn.net/cuijiahao/article/details/104225846

引用类型变量的强制转换

五迷三道 提交于 2020-02-08 07:33:49
编写java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用对象确实包含该方法。 引用类型之间的转换只能把一个父类变量转换成子类类型。如果试图把一个父类实例转换成子类类型,则必须这个对象实际上是子类实例才行(即编译时类型为父类类型,运行时为子类类型),否则会发生ClassCastException异常。 public class Test { public static void main(String[] args) { Object o1=new Object(); //o1的编译类型是Object,实际类型是Object,是string的父类,所以可以强制转换成string类 String o2=new String(); //o2的编译类型是String,实际类型是String Object o3=new String(); //o3的编译类型是Object,实际类型是String o2=(String)o1; //编译时没错,运行时有错(o2和o1的实际类型不一样) o2=(String)o3; //编译时没错,运行时没错(o2和o3的实际类型一样) o3=(String)o1; //编译时没错,运行时有错(o1和o3的实际类型不一样) o3=o1; //编译时没错,运行时也没错 } } 在强制转换之前可以先用

变量的引用类型和非引用类型的区别

随声附和 提交于 2020-02-08 06:04:17
/////////////////////////// // author:liyuechao // date:2014.8.8 //////////////////////////// // algo1-3.cpp 变量的引用类型和非引用类型的区别 #include<stdio.h> void fa(int a) // 在函数中改变a,将不会带回主调函数(主调函数中的a仍是原值) { a++; printf("在函数fa中:a=%d\n",a); } void fb(int &a) // 由于a为引用类型,在函数中改变a,其值将带回主调函数 { a++; printf("在函数fb中:a=%d\n",a); } void main() { int n=1; printf("在主程中,调用函数fa之前:n=%d\n",n); fa(n); printf("在主程中,调用函数fa之后,调用函数fb之前:n=%d\n",n); fb(n); printf("在主程中,调用函数fb之后:n=%d\n",n); } 执行结果如下: 在主程中,调用函数fa之前:n=1 在函数fa中:a=2 在主程中,调用函数fa之后,调用函数fb之前:n=1 在函数fb中:a=2 在主程中,调用函数fb之后:n=2 Press any key to continue 来源: https://www

引用类型变量的赋值

我是研究僧i 提交于 2020-02-08 05:50:58
引用类型变量的相互赋值   代码: 1 Myclass obj1=new Myclass(){Valie=100};2 Mycalss obj2=null;3 obj2=obj1;//引用类型变量的赋值4 Console。WriteLine("obj1.Vlaue="+obj2.Value);5 //输出:obj2.Value=100 事实上两个引用类型的相互赋值意味着赋值后两个引用变量所占有的内存单元其内容是相同的。 讲的详细一些: 第一句创建Myclass对象以后,此Myclass对象所占用内存区域的首地址("假设为“1234 5678")被放入到变量obj1自身的内存单元中。 第二句有创建了一个对象变量obj2,其值最初为null(即对应的内存地址单元为”0000 0000“)。 第三句执行后,obj1变量的值被赋值到obj2的内存单元中,现在,obj2的内存单元的值也为“1234 5678”。 如果obj2.Value的值被修改相应的,obj1.Value的值也会跟着变化,因为它们两个其实是引用了同一个Myclass对象的同一个字段。 有此得出一个结论:    两个引用类型变量(假设它们都不为空)的相互赋值不会导致它们所引用的对象自身被复制,其结果是这两个引用类型的变量引用同一个对象。 (注意:由于C#变压器要求所有局部变量都要必须显示初始化,因此

引用类型的变量

房东的猫 提交于 2020-02-08 05:01:41
引用类型的变量理解如下:   变量类型分为两类,基本类型和引用类型   基本类型如int short byte等8种基本类型   引用类型的变量,是将一个类名作为数据类型定义了一个变量   这样做的目的个人理解是,引用了该类的变量类型,不论将来类中的数据类型发生何种变化,都不再需要修改本段代码的变量类型(随类走) 定义方法:   例如个Post是个类名,定义一个变量为Post x ,x即是引用类型的变量。而如果是 int x,x则是基本类型的变量   String在java中是一个类,因此,String x,x也是一个引用类型的变量 来源: https://www.cnblogs.com/s-sj/p/8098544.html

JavaSE学习笔记-Day6

痴心易碎 提交于 2020-02-07 07:41:37
昨天学完了面向对象的进阶内容,不过对面向对象还是没有什么感觉啊,不敢那么多了,继续往后学!今天我们学习一下数组。 一. 一维数组 数组这个概念就不陌生了,就不做实例来引进概念了。 数组是相同类型数据的有序集合。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。 数组的几大特点: 长度是确定的 。数组一旦被创建,它的大小就是不可以改变的。 其元素必须是相同类型,不允许出现混合类型。 数组类型可以是 任何数据类型 ,包括基本类型和引用类型。 数组变量属引用类型, 数组就是对象 ,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组对象本身是在堆中存储的。 接下来就来看看一维数组是如何声明的。一维数组的声明形式有两种: 数据类型 [ ] 数组名 ; //比方说我们一直在写的:String[] args 数据类型 数组名 [ ] ; 一般推荐使用上面的那种声明方式,Java要有Java的亚子。 注意事项 : 声明的时候就只是声明(在栈帧的局部变量表中有一个新变量),并没有实例化任何对象(堆是没有开辟新内存的),只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。 声明一个数组的时候并没有数组真正被创建。 构造一个数组,必须指定长度。 好了,既然声明的时候没有实例化对象,那么将数组实例化对象(初始化)的方法有哪些呢?

并发编程之原子类

半腔热情 提交于 2020-02-07 00:49:17
Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。 🐤 内部都是采用CAS+volatile实现了无锁并发 这节不讲原理,只讲如何使用。 整体结构 从整体上可以分为5组,分别进行说明 ↘️ 基本类型 使用原子的方式更新基本类型 AtomicInteger:整形原子类 AtomicLong:长整型原子类 AtomicBoolean :布尔型原子类 数组类型 使用原子的方式更新数组里的某个元素 AtomicIntegerArray:整形数组原子类 AtomicLongArray:长整形数组原子类 AtomicReferenceArray :引用类型数组原子类 引用类型 AtomicReference:引用类型原子类 AtomicStampedRerence:原子更新引用类型里的字段原子类 AtomicMarkableReference :原子更新带有标记位的引用类型 对象的属性修改类型 AtomicIntegerFieldUpdater:原子更新整形字段的更新器 AtomicLongFieldUpdater:原子更新长整形字段的更新器 AtomicStampedReference :原子更新带有版本号的引用类型。该类将整数值与引用关联起来