指针初始化

虚拟机是如何加载类的

北慕城南 提交于 2020-02-17 07:41:23
一、概述   首先先来看几个问题 jvm是如何加载这些Class文件的? jvm加载一个Class文件需要哪些步骤? Class文件中的信息进入到虚拟机后会发生什么变化?   接下来看看jvm加载class文件的概述:   jvm把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。这句话差不多已经回答上面三个问题的大部分了。   与那些在编译是需要进行连接工作的语言不同,在Java语言里面,类型的加载和连接过程都是在程序运行期间完成的,这样会在类加载是稍微增加一些性能开销,但是却能为Java应用程序提供高度的灵活性,Java中可以动态的扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。比如编写一个使用接口的应用程序,可以等到运行时在指定其实际的实现。这种组装应用程序的方式广泛应用于Java程序之中。 二、要点   类从被加载到jvm内存中开始,到卸载出内存为止,它的生命周期包括了一下步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Useing)和卸载(Unloading)七个阶段。其中的验证、准备和解析三个部分统称为链接(Linking)

虚拟机类加载机制

假装没事ソ 提交于 2020-02-17 07:39:04
1、概述 在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,会增加性能开销,但提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。例如,如果编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类;用户可以通过Java预定义的和自定义类加载器,让一个本地的应用程序可以在运行时从网络或其他地方加载一个二进制流作为程序代码的一部分,这种组装应用程序的方式目前已广泛用于Java程序之中。从最基础的Applet、JSP到相对复杂的OSGi技术,都使用了Java语言运行期类加载的特性。 2、类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。如下图所示: 加载、验证、准备

Java 中数组的内存分配

我的未来我决定 提交于 2020-02-17 07:12:51
Java 中数组的内存分配 1、Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式。 2、数组基本概念 数组是存储同一种数据类型多个元素的容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。 格式:数据类型[] 数组名 ; int[] arr; 数组的初始化方式: 动态初始化 : 初始化时只指定数组长度,由系统为数组分配初始值。 格式:数据类型[] 数组名 = new 数据类型[数组长度]; 数组长度其实就是数组中元素的个数。 int[] arr = new int[3]; 解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度 格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...}; int[] arr = {1,2,3}; 解释:定义了一个int类型的数组,并且存进去{1,2,3}三个数。 3、Java中数组的内存分配 A、基本内存分配概念图解 int[] arr 存在于堆内存,new int[3] 存在于栈内存。 在堆内存中每一个 new 出来的对象都有一个唯一的地址值,就如同图中的 001,在 int[] arr = new int[3]; 相当于把堆内存的地址值 001

jvm系列(1):JVM问答

感情迁移 提交于 2020-02-17 06:37:12
一:JVM基础知识 1)Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM。JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM 答:我们编写的 Java 源码,编译后会生成一种 .class 文件,称为字节码文件。Java 虚拟机(JVM)就是负责将字节码文件翻译成特定平台下的机器码然后运行,也就是说,只要在不同平台上安装对应的 JVM,就可以运行字节码文件,运行我们编写的 Java 程序。 而这个过程,我们编写的 Java 程序没有做任何改变,仅仅是通过 JVM 这一 “中间层” ,就能在不同平台上运行,真正实现了 “一次编译,到处运行” 的目的。 2)什么是 JVM ? 解析:不仅仅是基本概念,还有 JVM 的作用。 答:JVM,即 Java Virtual Machine,Java 虚拟机。它通过模拟一个计算机来达到一个计算机所具有的的计算功能。JVM 能够跨计算机体系结构来执行 Java 字节码,主要是由于 JVM 屏蔽了与各个计算机平台相关的软件或者硬件之间的差异,使得与平台相关的耦合统一由 JVM 提供者来实现。 3)JVM 由哪些部分组成? 解析:这是对 JVM 体系结构的考察 答:JVM 的结构基本上由 4 部分组成: 类加载器,在 JVM 启动时或者类运行时将需要的 class 加载到

JavaScript 中的数据类型与变量

你离开我真会死。 提交于 2020-02-16 13:12:55
一、动态类型 JavaScript 是一种 弱类型 或者说 动态 语言。这意味着我们不用提前声明变量的类型(松散类型),在程序运行过程中,类型会被自动确定。也就是说我们可以使用同一个变量保存不同类型的数据,每个变量仅仅是一个用于保存值得占位符而已。 二、变量 定义变量 定义变量时要使用 var 操作符( var 是一个关键字),后跟变量名(即一个标识符): var username ; ES6 中新增了 let 和 const 关键字来代替 var ,这里我们先不做过多的讨论。 这行代码定义了一个名为 username 的变量,该变量可以用来保存任何值。这里有一点需要注意:像这样未经过初始化的变量,会保存一个特殊的值 —— undefined 。 初始化变量 我们也可以初始化变量,在定义变量的同时可以设置变量的值: var username = 'Deepspace' ; 初始化变量并不会把它标记为字符串类型,初始化的过程就是给变量赋一个值。 修改变量 因此,我们可以在修改变量值的同时修改值得类型: var username = 'Deepspace' ; username = 1 ; 有一点需要注意,用 var 操作符定义的变量将成为该变量的作用域中的局部变量。也就是说,如果在函数中使用 var 定义一个变量,那么这个变量在函数退出后就会被销毁。看个例子: function

【Go】数组、字符串与切片

一笑奈何 提交于 2020-02-16 00:10:59
数组、字符串与切片 Go语言中数组、字符串和切片三者是密切相关的数据结构。这三种数据类型,在底层原始数据有着相同的内存结构。虽然数组的元素可以被修改,但是数组本身的赋值和函数传参都是以整体复制的方式处理的。字符串赋值只是复制了数据地址和对应的长度,而不会导致底层数据的复制。 数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组的长度是数组类型的组成部分。因为数组的长度是数组类型的一个部分,不同长度或不同类型的数据组成的数组都是不同的类型,因此在Go语言中很少直接使用数组(不同长度的数组因为类型不同无法直接赋值)。和数组对应的类型是切片,切片是可以动态增长和收缩的序列,切片的功能也更加灵活,但是要理解切片的工作原理还是要先理解数组。 定义方式 var a [3]int // 定义长度为3的int型数组, 元素全部为0 var b = [...]int{1, 2, 3} // 定义长度为3的int型数组, 元素为 1, 2, 3 var c = [...]int{2: 3, 1: 2} // 定义长度为3的int型数组, 元素为 0, 2, 3 var d = [...]int{1, 2, 4: 5, 6} // 定义长度为6的int型数组, 元素为 1, 2, 0, 0, 5, 6 第一种方式是定义一个数组变量的最基本的方式,数组的长度明确指定

[c++primer][04]数组和指针

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-15 10:36:16
现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。 4.1 数组 数组的维数必须用值大于等于1的常量表达式定义。非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。 初始化 如果没有显式提供元素初值,数组元素与变量初始化规则一致。 字符串字面值包含一个额外额空字符(null)用于结束字符串 const char ch[6] = “Daniel” ; //error: Daniel is 7 elements  操作 数组下标的正确类型是size_t 4.2 指针的引入 什么是指针 指针保存的是另一个对象的地址,&操作符只能用于左值 初始化 避免使用未初始化的指针 有效的指针或者保存一个特定对象的地址,或者指向某个对象后面的另一个对象,或者是0值(0值表明指针不指向任何对象) 指针也可使用预处理器变量NULL初始化,该变量在stdlib.h中定义,其值为0 void*指针 void*可以保存任何类型对象的地址,不允许使用void*指针操纵它所指向的对象 指针和引用 引用总是指向某个对象,定义引用时没有初始化是错误的; 给引用赋值修改的是该引用所关联的对象的值,引用一经初始化,就始终指向同一特定对象 使用指针访问数组元素 数组名是指向数组第一个元素的指针 C+

Java 中的封装、继承与多态

与世无争的帅哥 提交于 2020-02-15 05:50:12
在前面的 《 Java — 面向对象的编程语言》 里,介绍了面向对象的三大特征:封装、继承、多态,主要是概念上的讲解,本篇文章将从代码出发,看看 Java 中的封装、继承与多态。 一、封装 在编程时,把数据(属性)和有关属性的一些操作(方法)绑定在一起,形成一个不可分开的集合(类),这个过程就是封装( Encapsulation )。 封装时,我们需要隐藏对象的属性和实现细节,仅对外公开接口,并控制在程序中属性的读和写的 访问级别 。 一般情况下,我们会把所有的属性都 私有化 ,对每个属性提供 getter (读) 和 setter (写) 方法,供外界使用: public class Person { private String name ; private int age ; public String getName ( ) { return name ; } public void setName ( String name ) { this . name = name ; } public int getAge ( ) { return age ; } public void setAge ( int age ) { this . age = age ; } } public class Me { public static void main ( String [ ]

java与C++的区别

不问归期 提交于 2020-02-14 17:46:42
“作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的。事实上,Java本来就是从C++衍生出来的。”   然而,C++和Java之间仍存在一些显著的差异。可以这样说,这些差异代表着技术的极大进步。一旦我们弄清楚了这些差异,就会理解为什么说Java是一种优秀的程序设计语言。本附录将引导大家认识用于区分Java和C++的一些重要特征。   (1) 最大的障碍在于速度:解释过的Java要比C的执行速度慢上约20倍。无论什么都不能阻止Java语言进行编译。写作本书的时候,刚刚出现了一些准实时编译器,它们能显著加快速度。当然,我们完全有理由认为会出现适用于更多流行平台的纯固有编译器,但假若没有那些编译器,由于速度的限制,必须有些问题是Java不能解决的。   (2) 和C++一样,Java也提供了两种类型的注释。   (3) 所有东西都必须置入一个类。不存在全局函数或者全局数据。如果想获得与全局函数等价的功能,可考虑将static方法和static数据置入一个类里。注意没有象结构、枚举或者联合这一类的东西,一切只有“类”(Class)!   (4) 所有方法都是在类的主体定义的。所以用C++的眼光看,似乎所有函数都已嵌入,但实情并非如何(嵌入的问题在后面讲述)。   (5) 在Java中,类定义采取几乎和C++一样的形式。但没有标志结束的分号

Java面向对象[数组]

时间秒杀一切 提交于 2020-02-13 11:07:11
理解数组 Java的数组要求所有的数组元素具有相同的数据类型,换句话说一个数组里只能存储一种数据类型的数据 一旦数组的的初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度将不可改变,即使把某个数组元素的数据清空,但它所占的空间依然保留,依然属于该数组,数组的长度依然不变 Java的数组既可以存储基本类型的数据,也可以存储引用类型的数据,只要所有的数据属于相同的数据类型即可 数组也是一种数据类型,它本身是一种引用类型,因此用它定义一个变量时,仅仅表示定义了一个引用变量(也就是一个指针),这个引用变量还未指定任何内存 数组的定义和初始化 Java提供了两种定义数组的语法 type[] arrayName; type arrayName[]; 数组是个引用类型,因此用它定义一个变量时,仅仅表示定义了一个引用变量(也就是一个指针),这个时候引用变量还未指定任何内存,因此定义数组时不能指定数组的长度,并且没有指定内存就没有内存空间来存储数组元素,因此这个数组也就不能直接使用,只有对数组进行初始化后才可以使用。 数组初始化 所谓初始化就是给数组分配内存空间,并为数组元素赋初始值,一旦为数组的每个数组元素分配了内存,每个内存空间里存储的内容就是该数组元素的值,即使这个内存空间存储的内容是空,这个空也是一个值(null),只要为数组元素分配了内存空间,数组元素就具有了初始值