如何做电子书下载网站印象笔记同步wordpress

pingmian/2025/10/7 23:10:15/文章来源:
如何做电子书下载网站,印象笔记同步wordpress,wordpress5.0发布文章,商城小程序搭建参考链接#xff1a; 在Java中为静态最终static final变量分配值 转载来源#xff1a;https://blog.csdn.net/peterwin1987/article/details/7571808 Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间。这些…参考链接 在Java中为静态最终static final变量分配值 转载来源https://blog.csdn.net/peterwin1987/article/details/7571808  Java栈与堆  堆:顺序随意  栈:后进先出(Last-in/First-Out).  Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的堆的优势是可以动态地分配内存大小生存期也不必事先告诉编译器因为它是在运行时动态分配内存的Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是由于要在运行时动态分配内存存取速度较慢.  栈的优势是存取速度比堆要快仅次于寄存器栈数据可以共享。但缺点是存在栈中的数据大小与生存期必须是确定的缺乏灵活性。栈中主要存放一些基本类型的变量int, short, long, byte, float, double, boolean, char和对象句柄。  1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C不同Java自动管理栈和堆程序员不能直接地设置栈或堆。  2. 栈的优势是存取速度比堆要快仅次于直接位于CPU中的寄存器。但缺点是存在栈中的数据大小与生存期必须是确定的缺乏灵活性。另外栈数据可以共享详见第3点。堆的优势是可以动态地分配内存大小生存期也不必事先告诉编译器Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是由于要在运行时动态分配内存存取速度较慢。  3. Java中的数据类型有两种。  一种是基本类型(primitive types), 共有8种即int, short, long, byte, float, double, boolean, char(注意并没有string的基本类型)。这种类型的定义是通过诸如int a 3; long b 255L;的形式来定义的称为自动变量。值得注意的是自动变量存的是字面值不是类的实例即不是类的引用这里并没有类的存在。如int a 3; 这里的a是一个指向int类型的引用指向3这个字面值。这些字面值的数据由于大小可知生存期可知(这些字面值固定定义在某个程序块里面程序块退出后字段值就消失了)出于追求速度的原因就存在于栈中。  另外栈有一个很重要的特殊性就是存在栈中的数据可以共享。假设我们同时定义  复制内容到剪贴板代码:  int a 3;  int b 3  编译器先处理int a 3首先它会在栈中创建一个变量为a的引用然后查找有没有字面值为3的地址没找到就开辟一个存放3这个字面值的地址然后将a指向3的地址。接着处理int b 3在创建完b的引用变量后由于在栈中已经有3这个字面值便将b直接指向3的地址。这样就出现了a与b同时均指向3的情况。  特别注意的是这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象如果一个对象引用变量修改了这个对象的内部状态那么另一个对象引用变量也即刻反映出这个变化。相反通过字面值的引用来修改其值不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例我们定义完a与b的值后再令a4那么b不会等于4还是等于3。在编译器内部遇到a4时它就会重新搜索栈中是否有4的字面值如果没有重新开辟地址存放4的值如果已经有了则直接将a指向这个地址。因此a值的改变不会影响到b的值。  另一种是包装类数据如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中Java用new()语句来显示地告诉编译器在运行时才根据需要动态创建因此比较灵活但缺点是要占用更多的时间。 4. String是一个特殊的包装类数据。即可以用String str new String(abc);的形式来创建也可以用String str abc的形式来创建(作为对比在JDK 5.0之前你从未见过Integer i 3;的表达式因为类与字面值是不能通用的除了String。而在JDK 5.0中这种表达式是可以的因为编译器在后台进行Integer i new Integer(3)的转换)。前者是规范的类的创建过程即在Java中一切都是对象而对象是类的实例全部通过new()的形式来创建。Java中的有些类如DateFormat类可以通过该类的getInstance()方法来返回一个新创建的类似乎违反了此原则。其实不然。该类运用了单例模式来返回类的实例只不过这个实例是在该类内部通过new()来创建的而getInstance()向外部隐藏了此细节。那为什么在String str abc中并没有通过new()来创建实例是不是违反了上述原则其实没有。  5. 关于String str abc的内部工作。Java内部将此语句转化为以下几个步骤  (1)先定义一个名为str的对String类的对象引用变量String str  (2)在栈中查找有没有存放值为abc的地址如果没有则开辟一个存放字面值为abc的地址接着创建一个新的String类的对象o并将o的字符串值指向这个地址而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为abc的地址则查找对象o并返回o的地址。  (3)将str指向对象o的地址。  值得注意的是一般String类中字符串值都是直接存值的。但像String str abc这种场合下其字符串值却是保存了一个指向存在栈中数据的引用  为了更好地说明这个问题我们可以通过以下的几个代码进行验证。  复制内容到剪贴板代码:  String str1 abc;  String str2 abc;  System.out.println(str1str2); //true  注意我们这里并不用str1.equals(str2)的方式因为这将比较两个字符串的值是否相等。号根据JDK的说明只有在两个引用都指向了同一个对象时才返回真值。而我们在这里要看的是str1与str2是否都指向了同一个对象。 结果说明JVM创建了两个引用str1和str2但只创建了一个对象而且两个引用都指向了这个对象。  我们再来更进一步将以上代码改成  复制内容到剪贴板代码:  String str1 abc;  String str2 abc;  str1 bcd;  System.out.println(str1 , str2); //bcd, abc  System.out.println(str1str2); //false  这就是说赋值的变化导致了类对象引用的变化str1指向了另外一个新对象而str2仍旧指向原来的对象。上例中当我们将str1的值改为bcd时JVM发现在栈中没有存放该值的地址便开辟了这个地址并创建了一个新的对象其字符串的值指向这个地址。  事实上String类被设计成为不可改变(immutable)的类。如果你要改变其值可以但JVM在运行时根据新值悄悄创建了一个新对象然后将这个对象的地址返回给原来类的引用。这个创建过程虽说是完全自动进行的但它毕竟占用了更多的时间。在对时间要求比较敏感的环境中会带有一定的不良影响。  再修改原来代码  复制内容到剪贴板代码:  String str1 abc;  String str2 abc;  str1 bcd;  String str3 str1;  System.out.println(str3); //bcd  String str4 bcd;  System.out.println(str1 str4); //true  str3这个对象的引用直接指向str1所指向的对象(注意str3并没有创建新对象)。当str1改完其值后再创建一个String的引用str4并指向因str1修改值而创建的新的对象。可以发现这回str4也没有创建新的对象从而再次实现栈中数据的共享。  我们再接着看以下的代码。  复制内容到剪贴板代码:  String str1 new String(abc);  String str2 abc;  System.out.println(str1str2); //false 创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。  String str1 abc;  String str2 new String(abc);  System.out.println(str1str2); //false  创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。  以上两段代码说明只要是用new()来新建对象的都会在堆中创建而且其字符串是单独存值的即使与栈中的数据相同也不会与栈中的数据共享。  6. 数据类型包装类的值不可修改。不仅仅是String类的值不可修改所有的数据类型包装类都不能更改其内部的值。  7. 结论与建议  (1)我们在使用诸如String str abc的格式定义类时总是想当然地认为我们创建了String类的对象str。担心陷阱对象可能并没有被创建唯一可以肯定的是指向String类的引用被创建了。至于这个引用到底是否指向了一个新的对象必须根据上下文来考虑除非你通过new()方法来显要地创建一个新的对象。因此更为准确的说法是我们创建了一个指向String类的对象的引用变量str这个对象引用变量指向了某个值为abc的String类。清醒地认识到这一点对排除程序中难以发现的bug是很有帮助的。  (2)使用String str abc的方式可以在一定程度上提高程序的运行速度因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str new String(abc)的代码则一概在堆中创建新对象而不管其字符串值是否相等是否有必要创建新对象从而加重了程序的负担。这个思想应该是享元模式的思想但JDK的内部在这里实现是否应用了这个模式不得而知。  (3)当比较包装类里面的数值是否相等时用equals()方法当测试两个包装类的引用是否指向同一个对象时用。  (4)由于String类的immutable性质当String变量需要经常变换其值时应该考虑使用StringBuffer类以提高程序效率。  java中堆栈(stack)和堆(heap)【转摘】  地址http://blog.csdn.net/jerryao/archive/2006/07/04/874101.aspx  堆栈(stack)和堆(heap)  内存分配的策略  按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.  静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.  栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。  静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.  堆和栈的比较  上面的定义从编译原理的教材中总结而来,除静态存储分配之外,都显得很呆板和难以理解,下面撇开静态存储分配,集中比较堆和栈:  从堆和栈的功能和作用来通俗的比较, 堆主要用来存放对象的栈主要是用来执行程序的 .而这种不同又主要是由于堆和栈的特点决定的:  在编程中例如C/C中所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候修改栈指针就可以把栈中的内容销毁.这样的模式速度最快,当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个大小多少是在编译时确定的,不是在运行时.  堆是应用程序在运行的时候请求操作系统分配给自己内存由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C中要求创建一个对象时只需用new命令编制相关的代码即可。执行这些代码时会在堆里自动进行数据的保存.当然为达到这种灵活性必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间这也正是导致我们刚才所说的效率低的原因,看来列宁同志说的好,人的优点往往也是人的缺点,人的缺点往往也是人的优点(晕~).  JVM中的堆和栈  JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。  我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译原理中的活动纪录的概念是差不多的.  从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域该区域具有先进后出的特性。  每一个Java应用都唯一对应一个JVM实例每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C不同Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存在堆中分配的内存实际建立这个对象而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。  static、final修饰符、内部类和Java内存分配  static修饰符         static修饰符能够与属性、方法和内部类一起使用表示静态的。类中的静态变量和静态方法能够与类名一起使用不需要创建一个类的对象来访问该类的静态成员所以static修饰的变量又称作“类变量”。  static属性的内存分配  一个类中一个static变量只会有一个内存空间虽然有多个类实例但这些类实例中的这个static变量会共享同一个内存空间。  static的变量是在类装载的时候就会被初始化即只要类被装载不管是否使用了static变量都会被初始化。 static的基本规则   ·一个类的静态方法只能访问静态属性   ·一个类的静态方法不能直接调用非静态方法   ·如访问控制权限允许static属性和方法可以使用类名加“.”的方式调用也可以使用实例加“.”的方式调用   ·静态方法中不存在当前对象因而不能使用this也不能使用super   ·静态方法不能被非静态方法覆盖   ·构造方法不允许声明为static的   注非静态变量只限于实例并只能通过实例引用被访问。 静态初始器——静态块   静态初始器是一个存在与类中方法外面的静态块仅仅在类装载的时候执行一次通常用来初始化静态的类属性。  final修饰符   在Java声明类、属性和方法时可以使用关键字final来修饰final所标记的成分具有终态的特征表示最终的意思。   final的具体规则     ·final标记的类不能被继承     ·final标记的方法不能被子类重写     ·final标记的变量成员变量或局部变量即成为常量只能赋值一次     ·final标记的成员变量必须在声明的同时赋值如果在声明的时候没有赋值那么只有一次赋值的机会而且只能在构造方法中显式赋值然后才能使用     ·final标记的局部变量可以只声明不赋值然后再进行一次性的赋值     ·final一般用于标记那些通用性的功能、实现方式或取值不能随意被改变的成分以避免被误用   如果将引用类型即任何类的类型的变量标记为final那么该变量不能指向任何其它对象但可以改变对象的内容因为只有引用本身是final的。  内部类   在一个类或方法、语句块的内部定义另一个类后者称为内部类有时也称为嵌套类。   内部类的特点     ·内部类可以体现逻辑上的从属关系同时对于其它类可以控制内部类对外不可见等     ·外部类的成员变量作用域是整个外部类包括内部类但外部类不能访问内部类的private成员     ·逻辑上相关的类可以在一起可以有效地实现信息隐藏     ·内部类可以直接访问外部类的成员可以用此实现多继承     ·编译后内部类也被编译为单独的类名称为outclass$inclass的形式  内部类可以分为四种     ·类级成员式有static修饰     ·对象级成员式普通无static修饰     ·本地内部类局部式     ·匿名级局部式   成员式内部类的基本规则     ·可以有各种修饰符可以用4种权限、static、final、abstract定义     ·若有static限定就为类级否则为对象级。类级可以通过外部类直接访问对象级需要先生成外部的对象后才能访问     ·内外部类不能同名     ·非静态内部类中不能声明任何static成员     ·内部类可以互相调用   成员式内部类的访问     内部类访问外层类对象的成员时语法为       外层类名.this.属性     使用内部类时由外部类对象加“.new”操作符调用内部类的构造方法创建内部类的对象。   在另一个外部类中使用非静态内部类中定义的方法时要先创建外部类的对象再创建与外部类相关的内部类的对象再调用内部类的方法。   static内部类相当于其外部类的static成分它的对象与外部类对象间不存在依赖关系因此可以直接创建。   由于内部类可以直接访问其外部类的成分因此当内部类与其外部类中存在同名属性或方法时也将导致命名冲突。所以在多层调用时要指明。  本地类是定义在代码块中的类只在定义它们的代码块中可见。   本地类有以下几个重要特性     ·仅在定义了它们的代码块中可见     ·可以使用定义它们的代码块中的任何本地final变量注本地类也可以是局部内部类/匿名内部类等等使用外部类的变量原意是希望这个变量在本地类中的对象和在外部类中的这个变量对象是一致的但如果这个变量不是final定义它有可能在外部被修改从而导致内外部类的变量对象状态不一致因此这类变量必须在外部类中加final前缀定义     ·本地类不可以是static的里边也不能定义static成员     ·本地类不可以用public、private、protected修饰只能使用缺省的     ·本地类可以是abstract的  匿名内部类是本地内部类的一种特殊形式即没有类名的内部类而且具体的类实现会写在这个内部类里。   匿名类的规则     ·匿名类没有构造方法     ·匿名类不能定义静态的成员     ·匿名类不能用4种权限、static、final、abstract修饰     ·只可以创建一个匿名类实例  Java的内存分配   Java程序运行时的内存结构分成方法区、栈内存、堆内存、本地方法栈几种。   方法区存放装载的类数据信息包括     ·基本信息每个类的全限定名、每个类的直接超类的全限定名、该类是类还是接口、该类型的访问修饰符、直接超接口的全限定名的有序列表。     ·每个已装载类的详细信息运行时常量池、字段信息、方法信息、静态变量、到类classloader的引用、到类class的引用。   栈内存     Java栈内存由局部变量区、操作数栈、帧数据区组成以帧的形式存放本地方法的调用状态包括方法调用的参数、局部变量、中间结果……。   堆内存     堆内存用来存放由new创建的对象和数组。在堆中分配的内存由Java虚拟机的自动垃圾回收器来管理。   本地方法栈内存     Java通过Java本地接口JNIJava Native Interface来调用其它语言编写的程序在Java里面用native修饰符来描述一个方法是本地方法。   String的内存分配     String是一个特殊的包装类数据由于String类的值不可变性当String变量需要经常变换其值时应该考虑使用StringBuffer或StringBuilder类以提高程序效率。  Java内存分配、管理小结   转自: http://legend26.blog.163.com/blog/static/13659026020101122103954365/  首先是概念层面的几个问题  Java中运行时内存结构有哪几种Java中为什么要设计堆栈分离?Java多线程中是如何实现数据共享的Java反射的基础是什么 然后是运用层面:  引用类型变量和对象的区别什么情况下用局部变量什么情况下用成员变量 数组如何初始化声明一个数组的过程中如何分配内存声明基本类型数组和声明引用类型的数组初始化时内存分配机制有什么区在什么情况下我们的方法设计为静态化为什么 Java中运行时内存结构  1.1 方法区  方法区是系统分配的一个内存逻辑区域是JVM在装载类文件时用于存储类型信息的(类的描述信息)。  方法区存放的信息包括  1.1.1类的基本信息  每个类的全限定名每个类的直接超类的全限定名(可约束类型转换)该类是类还是接口该类型的访问修饰符直接超接口的全限定名的有序列表 1.1.2已装载类的详细信息  运行时常量池 在方法区中每个类型都对应一个常量池存放该类型所用到的所有常量常量池中存储了诸如文字字符串、final变量值、类名和方法名常量。它们以数组形式通过索引被访问是外部调用与类联系及类型对象化的桥梁。存的可能是个普通的字符串然后经过常量池解析则变成指向某个类的引用 字段信息 字段信息存放类中声明的每一个字段的信息包括字段的名、类型、修饰符。 字段名称指的是类或接口的实例变量或类变量字段的描述符是一个指示字段的类型的字符串如private A anull;则a为字段名A为描述符private为修饰符 方法信息 类中声明的每一个方法的信息包括方法名、返回值类型、参数类型、修饰符、异常、方法的字节码。 (在编译的时候就已经将方法的局部变量、操作数栈大小等确定并存放在字节码中在装载的时候随着类一起装入方法区。)  在运行时JVM从常量池中获得符号引用然后在运行时解析成引用项的实际地址最后通过常量池中的全限定名、方法和字段描述符把当前类或接口中的代码与其它类或接口中的代码联系起来。 静态变量 这个没什么好说的就是类变量类的所有实例都共享我们只需知道在方法区有个静态区静态区专门存放静态变量和静态块。 到类classloader的引用到该类的类装载器的引用。到类class的引用虚拟机为每一个被装载的类型创建一个class实例用来代表这个被装载的类。 由此我们可以知道反射的基础  在装载类的时候加入方法区中的所有信息最后都会形成Class类的实例代表这个被装载的类。方法区中的所有的信息都是可以通过这个Class类对象反射得到。我们知道对象是类的实例类是相同结构的对象的一种抽象。同类的各个对象之间其实是拥有相同的结构属性拥有相同的功能方法各个对象的区别只在于属性值的不同。     同样的我们所有的类其实都是Class类的实例他们都拥有相同的结构-----Field数组、Method数组。而各个类中的属性都是Field属性的一个具体属性值方法都是Method属性的一个具体属性值。 在运行时JVM从常量池中获得符号引用然后在运行时解析成引用项的实际地址最后通过常量池中的全限定名、方法和字段描述符把当前类或接口中的代码与其它类或接口中的代码联系起来。  1.2 Java栈  JVM栈是程序运行时单位决定了程序如何执行或者说数据如何处理。  在Java中一个线程就会有一个线程的JVM栈与之对应因为不过的线程执行逻辑显然不同因此都需要一个独立的JVM栈来存放该线程的执行逻辑。  对方法的调用  Java栈内存以帧的形式存放本地方法的调用状态包括方法调用的参数、局部变量、中间结果等方法都是以方法帧的形式存放在方法区的每调用一个方法就将对应该方法的方法帧压入Java栈成为当前方法帧。当调用结束(返回)时就弹出该帧。  这意味着  在方法中定义的一些基本类型的变量和引用变量都在方法的栈内存中分配。当在一段代码块定义一个变量时Java就在栈中为这个变量分配内存空间当超过变量的作用域后方法执行完成后Java会自动释放掉为该变量所分配的内存空间该内存空间可以立即被另作它用。--------同时因为变量被释放该变量对应的对象也就失去了引用也就变成了可以被gc对象回收的垃圾。  因此我们可以知道成员变量与局部变量的区别  局部变量在方法内部声明当该方法运行完时内存即被释放。 成员变量只要该对象还在哪怕某一个方法运行完了还是存在。 从系统的角度来说声明局部变量有利于内存空间的更高效利用方法运行完即回收。 成员变量可用于各个方法间进行数据共享。 Java 栈内存的组成 局部变量区、操作数栈、帧数据区组成。 1局部变量区为一个以字为单位的数组每个数组元素对应一个局部变量的值。调用方法时将方法的局部变量组成一个数组通过索引来访问。若为非静态方法则加入一个隐含的引用参数this,该参数指向调用这个方法的对象。而静态方法则没有this参数。因此对象无法调用静态方法。  由此我们可以知道方法什么时候设计为静态什么时候为非静态  前面已经说过对象是类的一个实例各个对象结构相同只是属性不同。 而静态方法是对象无法调用的。 所以静态方法适合那些工具类中的工具方法这些类只是用来实现一些功能也不需要产生对象通过设置对象的属性来得到各个不同的个体。 2操作数栈也是一个数组但是通过栈操作来访问。所谓操作数是那些被指令操作的数据。当需要对参数操作时如abc,就将即将被操作的参数压栈如将b 和c 压栈然后由操作指令将它们弹出并执行操作。虚拟机将操作数栈作为工作区。 3帧数据区处理常量池解析异常处理等  1.3 java堆  java的堆是一个运行时的数据区用来存储数据的单元存放通过new关键字新建的对象和数组对象从中分配内存。       在堆中声明的对象是不能直接访问的必须通过在栈中声明的指向该引用的变量来调用。引用变量就相当于是为数组或对象起的一个名称以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。    由此我们可以知道,引用类型变量和对象的区别:  声明的对象是在堆内存中初始化的 真正用来存储数据的。不能直接访问。 引用类型变量是保存在栈当中的一个用来引用堆中对象的符号而已指针。  堆与栈的比较 JAVA堆与栈都是用来存放数据的那么他们之间到底有什么差异呢既然栈也能存放数据为什么还要设计堆呢  1.从存放数据的角度:  前面我们已经说明:  栈中存放的是基本类型的变量or引用类型的变量  堆中存放的是对象or数组对象.  在栈中引用变量的大小为32位基本类型为1-8个字节。        但是对象的大小和数组的大小是动态的这也决定了堆中数据的动态性因为它是在运行时动态分配内存的生存期也不必在编译时确定Java 的垃圾收集器会自动收走这些不再使用的数据。  2.从数据共享的角度:  1).在单个线程类栈中的数据可共享  例如我们定义  Java代码  int a3; int b3;  int a3; int b3;  编译器先处理int a 3首先它会在栈中创建一个变量为a 的引用然后查找栈中是否有3 这个值如果没找到就将3 存放进来然后将a 指向3。接着处理int b 3在创建完b 的引用变量后因为在栈中已经有3这个值便将b 直接指向3。这样就出现了a 与b 同时均指向3的情况。  而如果我们定义  Java代码  Integer anew Integer(3);//(1) Integer bnew Integer(3);//(2)  Integer anew Integer(3);//(1) Integer bnew Integer(3);//(2)  这个时候执行过程为在执行(1)时首先在栈中创建一个变量a然后在堆内存中实例化一个对象并且将变量a指向这个实例化的对象。在执行(2)时过程类似此时在堆内存中会有两个Integer类型的对象。   2).在进程的各个线程之间数据的共享通过堆来实现  例那么在多线程开发中我们的数据共享又是怎么实现的呢  如图所示堆中的数据是所有线程栈所共享的我们可以通过参数传递将一个堆中的数据传入各个栈的工作内存中从而实现多个线程间的数据共享  多个进程间的数据共享则需要通过网络传输了。  3.从程序设计的的角度:  从软件设计的角度看JVM栈代表了处理逻辑而JVM堆代表了数据。这样分开使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。  4.值传递和引用传递的真相  有了以上关于栈和堆的种种了解后我们很容易就可以知道值传递和引用传递的真相  1.程序运行永远都是在JVM栈中进行的因而参数传递时只存在传递基本类型和对象引用的问题。不会直接传对象本身。 但是传引用的错觉是如何造成的呢? 在运行JVM栈中基本类型和引用的处理是一样的都是传值所以如果是传引用的方法调用也同时可以理解为“传引用值”的传值调用即引用的处理跟基本类型是完全一样的。 但是当进入被调用方法时被传递的这个引用的值被程序解释(或者查找)到JVM堆中的对象这个时候才对应到真正的对象。 如果此时进行修改修改的是引用对应的对象而不是引用本身即修改的是JVM堆中的数据。所以这个修改是可以保持的了。  最后  从某种意义上来说对象都是由基本类型组成的。  可以把一个对象看作为一棵树对象的属性如果还是对象则还是一颗树(即非叶子节点)基本类型则为树的叶子节点。程序参数传递时被传递的值本身都是不能进行修改的但是如果这个值是一个非叶子节点(即一个对象引用)则可以修改这个节点下面的所有内容。 其实面向对象方式的程序与以前结构化的程序在执行上没有任何区别。  面向对象的引入只是改变了我们对待问题的思考方式而更接近于自然方式的思考。  当我们把对象拆开其实对象的属性就是数据存放在JVM堆中;而对象的行为(方法)就是运行逻辑放在JVM栈中。我们在编写对象的时候其实即编写了数据结构也编写的处理数据的逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs做网站不用建项目wordpress 工具栏遮挡

目录 机器学习学习路线 学习编写抽象类 固定随机数种子 先加载少量数据

做芯片外贸生意上哪个网站企业公示信息查询系统贵州

IDE有很多种,常见的Eclipse、MyEclipse、Intellij IDEA、JBuilder、NetBeans等。但是这些IDE中目前比较火的是Intellij IDEA(以下简称IDEA),被众多Java程序员视为最好用的Java集成开发环境,今天的主题就是IDEA为开发工…

vs2008做网站教程东莞推广

在上一篇中,我们说过,在setData中如果有很多控件的话,我们还是要在该方法中写入很多代码,为了降低开发的方便性,本次就在此基础上再一次优化。实现原理是这样的,每次在setData中都要查找控件,然…

做外汇网站代理怎么制作一个网站首页

在 Windows 系统中添加一个右键菜单选项,以便可以使用管理员权限打开 PowerShell,可以通过编辑注册表来实现。 打开注册表编辑器: 按 Win R 打开运行对话框。输入 regedit 并按回车,这将打开注册表编辑器。 导航到文件夹背景键&…

php网站开发优点ui设计培训机构有用吗

网络安全态势严峻,常见的五大网络攻击风险类型 赵伟认为,企业线上服务所面临的安全风险,主要来自以下五个方面: DDoS攻击 DDoS攻击类型已有20多年历史,它攻击方式简单直接,通过伪造报文直接拥塞企业上联带…

免费网站怎么做啊潍坊网站

数字非压缩光端机主要应用于高速公路监控领域,可以保证实时性,指的是不经过压缩进行光传输的光端机,是在非压缩光端机基础上利用ADM电分插复用与TDM时分复用技术在一根光纤中实现多点多路(最大16个视频点)视频传播的光…

公司网站建设企划书盘锦网站变建设

今日概要 递归爬取解析多页页面数据scrapy核心组件工作流程scrapy的post请求发送今日详情 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储 - 需求分析:每一个页面对应一个url,则scrapy工程需…

安阳企业建网站个人如何做商城网站

正则表达式 1.元字符 . //匹配任意单个字符,可以是个汉字 [yang] //匹配范围内的任意单个字符 [^y] //匹配处理指定范围外的任意单个字符 [:alnum:] //字母和数字 [:alpha:] //代表…

衡水建设公司网站PHP网站开发简单实例

下面的代码,照着复制就能跑起来 今天看了下Spring的Configuration,即java类配置bean,(这个spring3的新功能,虽然现在已经spring5了,但是这种配置bean的方式也是比较火的) 做了如下测试,发现一个…

龙岗建设网站做网站运用的软件

原文:01. 把存储过程结果集SELECT INTO到临时表在开发过程中,很多时候要把结果集存放到临时表中,常用的方法有两种。 一. SELECT INTO 1. 使用select into会自动生成临时表,不需要事先创建 select * into #temp from sysobjects select * fro…

插画师个人网站是怎么做的wordpress博客备份

最近做了IAP U盘升级模块开发,总结下IAP基本开发流程,不深入讨论原理。 详细原理参考 首先需要知道我们需要把之前的APP区域拆一块出来做BOOT升级程序区域。 以STM32F103为例,0x08000000到0x0807FFFF为FLASH空间,即上图代码区域…

北京住房城乡建设网站南宁手机平台网站

web资源类型: 静态资源:原始形式与响应内容一致,在客户端浏览器执行 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端 LAMP架构组成: L:linux …

建设银行网站表单清理推荐郑州网站建设公司

93.复原IP地址 思路: 与分割回文串相似,复原ip地址是将给定字符串分割成点分十进制的四段,切割问题就可以使用回溯搜索法把所有可能性搜出来。回溯三部曲: 递归参数:除了传入的需要分割的字符串,仍然需要…

好用的h5网站在线网站地图生成器

HwBinder与普通Binder是一样的,区别是前者是专门给硬件使用,后者是给一般的应用程序使用,为了不影响现有的binder,单独增加硬件的HwBinder来实现硬件相关进程的通信。 HwBinder也是有四部分组成:hwservermanager、server、client…

seo网站推广专员招聘手机网站建设wap

对于有些服务端接口返回是固定值的json,可通过配置nginx直接返回json,减少程序的加载对资源的占用,减少接口响应时间 location ~* (request/update)$ { default_type application/json; return 200 {"update":"no&quo…

做建筑设计的网站推荐提升学历选什么专业比较好

科技3D线上云展馆作为一种基于VR虚拟现实和互联网技术的新一代展览平台。可以在线上虚拟空间中模拟真实的展馆,让观众无需亲自到场,即可获得沉浸式的参观体验。通过这个展馆,您可以充分、全面、立体展示您的产品、服务以及各种创意作品&#…

网站建站一本通山西网站制作平台

点、线、边缘检测背景知识。书中主要介绍了图像的一阶导数与二阶导数,这个之前的文章中有过介绍这里在复习一遍。对于函数 ,对于点 在x方向的一阶偏导为:,二阶偏导为:之后书中总结了一阶导与二阶导对于图像求取边缘的结论:孤立点检…

建设部网站危险性较大邮政管理网站建设

结构化查询语言(SQL)是一种广泛使用的工具,用于管理和操作数据库。基本的SQL查询简单易学,但掌握高级SQL技术可以将您的数据分析和管理能力提升到新的高度。 高级SQL技术是指一系列功能和函数,使您能够对数据执行复杂…

优秀网站下载建设网站站点过程中

表达式求值问题 ①问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:1122*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:22 7 4 - * 3 / 1…

装修设计案例网站苏州网页设计多少钱

亲爱的猎人:我们将于9月20日0:00对所有大区全部服务器进行更新维护,本次维护预计时间4小时。还请猎人们提早下线,避免不必要的损失。我们将视实际情况提前或延迟开服,感谢大家的支持!维护时间:2016年9月20日(周二)0:00…