引用类型

引用类型

纵饮孤独 提交于 2019-11-27 00:33:50
无论是通过引用计数法判断对象引用数量,还是通过可达性分析法判断对象的引用链是否可达,判定对象的存活都与“引用”有关。 JDK1.2 之前,Java 中引用的定义很传统:如果引用类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。 JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种(引用强度逐渐减弱)。 强引用 我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机宁愿抛出 OutofMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 软引用 如果一个对象只具有软引用,那就类似于可有可无的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队列联合使用,如果软引用所引用的对象被垃圾回收,JAVA 虚拟机就会把这个软引用加入到与之关联的引用队列中。 弱引用 如果一个对象只具有弱引用,那就类似于可有可无的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它

深入理解C#之 参数传递 ref out params

↘锁芯ラ 提交于 2019-11-26 21:15:56
在讲C#参数传递之前,我们先简单讨论下 c#中值类型和引用类型的定义以及区别,有助于我们更好的理解参数传递。 我们从内存的角度来简单讨论下值类型和引用类型的区别。我们都知道值类型存储在栈上,引用类型分别在栈和托管堆上。如下图: 我们通过例子来看下 值类型和引用类型存储结构不同有哪些区别: 定义一个类 (引用类型) View Code 1 public class Student 2 { 3 public int Age { get ; set ; } 4 5 public void Say() 6 { 7 Console.WriteLine( " 我的年龄是: " + Age); 8 } 9 } 定义一个结构(值类型) View Code 1 public struct StructStudent 2 { 3 public int Age { get ; set ; } 4 5 public void Say() 6 { 7 Console.WriteLine( " 我的年龄是: " + Age); 8 } 9 } 在控制台输出定义如下代码: View Code 1 static void Main( string [] args) 2 { 3 Student stu1 = new Student { Age= 20 }; 4 Student stu2 = new Student(

java中的值传递与引用传递

女生的网名这么多〃 提交于 2019-11-26 20:52:45
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类, 基本类型和对象类型 。相应的,变量也有两种类型:基本类型和引用类型。 基本类型的变量保存原始值,即它代表的值就是数值本身; 而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身, 对象本身存放在这个引用值所表示的地址的位置。 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress, 引用类型包括:类类型,接口类型和数组。 相应的,变量也有两种类型:基本类型和引用类型。 2.变量的基本类型和引用类型的区别 基本数据类型在声明时系统就给它分配空间: 1 2 int a; a= 10 ; //正确,因为声明a时就分配了空间 引用则不同,它声明时只给变量分配了引用空间,而不分配数据空间: 1 2 3 4 5 6 7 Date date; //执行实例化,开辟数据空间存放Date对象,然后把空间的首地址传给today变量 //date=new Date(); //如果注释掉上一步操作 //The local variable date may not have been initialized //也就是说对象的数据空间没有分配 date.getDate();    看一下下面的初始化过程, 注意"引用

jvm 简单描述

时光毁灭记忆、已成空白 提交于 2019-11-26 20:18:53
java零基础入门-面向对象篇(一) 基础类型和引用类型 友情提示:本章开始可能会有部分较深入的内容,不说又不行,说了又很难解释清楚,因为里面的技术细节实在太多太复杂,所以我会屏蔽部分技术细节,只展示当前需要了解的基础知识,避免出现讲了半天还是没人懂的情况。随着我们的知识增长,后面会逐步的将细节补充完整。 学习编程,一定要把思路放开,不能太局限,多多进行思维能力的锻炼才能提高自己的内功。比如我们很常见的买房啊,哪里修商场啊,其实跟我们的内存结构是很类似的。他们都涉及到一个资源规划的问题,来吧,一起来锻炼下思维能力吧。 最近全国除了最火的抢人大战,其实前段时间还有一个东西很火,那就是城市规划。比如我们的首都北京,选择了雄安进行首都功能疏解,其实很多城市都有类似的规划,比如天津滨海新区,深圳前海新区等等。政府设立了一个即将开发的新区后,会干嘛?招商引资,首先是大的企业进来修路盖高楼大厦,然后修住宅,再卖给老百姓。我们来看看具体过程。 首先,政府画了一个圈,“走过路过不要错过哈,新鲜出炉的地块,各种优惠政策,减税减税再减税,快来看看啊~”,然后一堆大企业蜂拥而上,“给我留一块~”,“我也要~”。然后各种大企业开始修办公楼啊,房地产开发商开始修海景房啊,然后轮到地产开发商要喝了,“走过路过不要错过啊,海景房值得拥有,机不可失,抢到了幸福生活,没抢到继续干活~”。然后轮到抢房大军蜂拥而上了。

闭包以及面向对象

三世轮回 提交于 2019-11-26 20:05:45
1.什么是闭包? 以我个人的理解,简单来说就是函数套函数 官方的是:闭包是函数和声明该函数的词法环境的组合 2.闭包的作用 (1) 可以读取函数内部的变量 (2) 可以把变量始终保存在内存中 3.闭包的写法 (1) 一个函数(即外部函数)里面包含另一个函数(即内部函数),并且return返回这个内部函数, 然后内部函数在定义内部函数之外的作用域被调用,这时的内部函数就是一个闭包了。 (2) 内部函数引用了外部函数的变量,这个变量不会被销毁,因为闭包需要这个变量, 所以通过闭包可以访问闭包保存的变量 4.闭包的缺点 (1) 因为闭包的变量保存在内存中,内存泄漏,对内存的消耗很大,所以不要滥用闭包 5.闭包常用的地方: (1) es5 for循环事件监听 (2)函数里使用了定时器 (3)封装许多高级的功能集 6.闭包的是怎样实现的 (1)这就相当于我们构造了一个闭包的环境 (2)第一次调用内层循环 (3)第二次调用内层循环 (4)循环结束 6.什么是面向对象 面向对象是一种思维模式 比较准确的说:面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象 封装:把相关信息存储在对象在的能力 聚集:就是把一个对象存储在另一个对象的能力 继承:由一个类(或多个类)得来的属性和方法的能力 多态:编写能以多种方法运行的函数或方法的能力 7.构造函数 构造函数

Java——final关键字

流过昼夜 提交于 2019-11-26 20:04:48
final是一个可以对类、方法、变量修饰的修饰词。它最直接的意思就是,被它修饰的元素,不可以再被改变了,已经是最终形态了 1.当它用于修饰类的时候   表示这个类不可以被继承了。这个类不可以有子类,已经是最终形态了。   final类内部的所有的方法都隐式的被final修饰(反正已经不可能被重写了)   内部的变量的话,按情况自己定吧。 2.修饰方法的时候   这个方法不可以被重写(也就是被子类覆盖,如果是private修饰的方法是被隐式指定为final的,因为,字类获取不到private方法,但是private变量可没有被隐式的final啊,分清。)   对于private方法,这里提一下哈,子类是获取不到父类的任何用private关键字修饰的元素的。也就是说,你在子类中定义相同名字的方法和属性,都和父类的那个无关。也不存在重写的情况,那是你自己定义的,之前压根儿就没有。 3.修饰变量   表示这个变量是一个常量,只能被赋值一次。一次之后就不能更改了。   被final休斯的成员变量可以在声明的时候直接初始化,也可以在所有的构造函数里初始化,。但是其它情况不行,而且,你必须在这两种里面选择一个,不能不选。(final修饰的成员变量必须显式初始化,就是解释这句话嘞) final修饰参数,和修饰变量一样。 但是不能再给它赋值了,因为在函数调用的时候已经赋值过了。 划重点啦:

C#的参数类型:params、out和ref

老子叫甜甜 提交于 2019-11-26 19:39:10
C#的参数类型:params、out和ref (转自胡里胡涂,在此表示感谢!) 首先回顾一下C#声明一个方法的语法和各项元素,[]代表可选 [访问修饰符] 返回值 方法名([参数类型] 数据类型 参数名) {方法体} 这篇文章主要是为了讲解 参数表里面的可选项[参数类型],这个参数类型的设置会影响到我们对参数施加操作后的结果或影响我们对方法的调用方式。 C#之中参数类型分为4种: 无:默认的,普通参数 params:不定长参数 out:输出变量 ref:引用传递 普通参数,当参数是值类型时传值,当参数为引用类型时传址,这个由于各类C#的书都一定会讲,此处略过。 params类型的参数搭配数组使用,实现一个不定长的数组参数 最常用的应该是Console.WriteLine,其中有一个重载如下: public static void WriteLine(string FormatString, params object[] values); 常见的调用方式:Console.WriteLine("宽:{0},高:{1}",this.Width,this.Height); 前面的"宽:{0},高:{1}"被装入FormatString this.Width,this.Height被装入values[0]和values[1]之中,如果我们再加几个参数上去,那将按下标继续存入数组中

方法参数 Ref 与 引用类型

浪尽此生 提交于 2019-11-26 19:38:47
首先,这篇文章,只是无聊的产物,没什么具体的理论解释。 大家应该都明白,方法的参数前面 加上ref或者out的作用,但是,引用类型的参数前面,添不添加ref,有什么区别呢? 如下是一段简单的代码。 代码 1 class Program 2 { 3 static void Main( string [] args) 4 { 5 test a = new test() { ID = 1 }; 6 7 test c = new test(); 8 9 TestRef b = new TestRef(); 10 b.Test( ref a); 11 12 b.Test(c); 13 14 Console.WriteLine( string .Format( @" ref value={0} " , a.ID)); 15 Console.WriteLine( string .Format( @" not ref value={0} " , c.ID)); 16 Console.ReadLine(); 17 } 18 } 19 20 public class test 21 { 22 public int ID { get ; set ; } 23 } 24 25 public class TestRef 26 { 27 public void Test( ref test test) 28

值类型、引用类型作为方法参数如何执行,ref与out的区别

旧巷老猫 提交于 2019-11-26 19:38:31
值类型因为是在栈里面定义的,将其传入方法作为参数时,是将其复制一份作为方法的参数,所以无论方法内部对传入的值类型参数怎样处理,都不会改变原值。 而引用类型在栈里面定义的是其在堆里面的地址,将其传入方法作为参数时,是将其在栈里面的的值——也就是堆地址复制一份,然后传入方法,所以在方法里面对引用类型的修改,是直接修改其在堆里面的值,所以会直接影响其原值。 ref和out都是将一个值类型变量的地址传入方法里面,所以方法里面对变量的修改就是修改其原值,这样使得值类型可以相引用类型那样在方法里面修改外面值类型变量了。而ref和out的区别在于,ref的关键在于将值传入,而方法内部对其修改与否是没有规定的,但是因为关键在于将值传入,所以传入方法之前一定要对它赋值,否则报错。而out关键字其意在于将值传出,所以变量传入方法前有无赋值并不重要,关键在于方法传出来的时候一定要对它赋值。 来源: http://www.cnblogs.com/Longeren/archive/2013/01/12/2857282.html

ava引用类型原理深度剖析

半腔热情 提交于 2019-11-26 17:08:12
Java中一共有4种引用类型(其实还有一些其他的引用类型比如FinalReference):强引用、软引用、弱引用、虚引用。其中强引用就是我们经常使用的Object a = new Object(); 这样的形式,在Java中并没有对应的Reference类。 本篇文章主要是分析软引用、弱引用、虚引用的实现,这三种引用类型都是继承于Reference这个类,主要逻辑也在Reference中。 问题 在分析前,先抛几个问题? 1.网上大多数文章对于软引用的介绍是:在内存不足的时候才会被回收,那内存不足是怎么定义的?什么才叫内存不足? 2.网上大多数文章对于虚引用的介绍是:形同虚设,虚引用并不会决定对象的生命周期。主要用来跟踪对象被垃圾回收器回收的活动。真的是这样吗? 3.虚引用在Jdk中有哪些场景下用到了呢? Reference 我们先看下Reference.java中的几个字段 public abstract class Reference { //引用的对象 private T referent; //回收队列,由使用者在Reference的构造函数中指定 volatile ReferenceQueue<? super T> queue; //当该引用被加入到queue中的时候,该字段被设置为queue中的下一个元素,以形成链表结构 volatile Reference next