静态变量

ios内存分配

戏子无情 提交于 2020-03-05 08:05:15
内存分区: 1)、 栈区 (stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2)、 堆区 (heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。(ios中alloc都是存放在堆中) 3)、 全局区 (静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放。注意:全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。 4)、 常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5)、 代码区 —存放函数体的二进制代码。 来源: https://www.cnblogs.com/foxmin/archive/2012/10/04/2711620.html

Java面试题收集学习整理1

家住魔仙堡 提交于 2020-03-05 06:24:28
1、java序列化、反序列化及serialVersionUID作用 把Java对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为Java对象的过程称为对象的反序列化。对象的序列化主要有两种用途: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 在网络上传送对象的字节序列。 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量: private static final long serialVersionUID; 默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID,也有可能相同。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。 serialVersionUID 用来表明类的不同版本间的兼容性。有两种生成方式: 一个是默认的1L,比如:private

Java基础之static关键字的用法

无人久伴 提交于 2020-03-04 09:26:18
Java中的static关键字主要用于内存管理。我们可以应用static关键字在变量、方法、块和嵌套类中。 static关键字属于类,而不是类的实例。 静态(static)可以是: 变量(也称为类变量) 方法(也称为类方法) 代码块 嵌套类 修饰变量 被static修饰的变量称作静态变量或类变量;没有被static修饰的变量,称为实例变量。静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,在类加载的过程中完成静态变量的内存分配(存储在“方法区”),可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,每创建一个类的实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。 静态成员变量的初始化顺序按照定义的顺序进行初始化,static不可以修饰局部变量,即使静态方法里面也不可以有静态变量,同时也不能引用非静态方法,因为static修饰的变量或方法是在加载类的同时加载的,此时非静态的变量、方法等还未被加载,当然就无法引用了。但是,非静态方法或类却能正常引用静态变量或方法。因为非静态总是在静态之后出现的。 静态变量并不是所在类的某个具体对象所有,而是该类的所有对象所共有的,静态变量既能被对象调用,也能直接拿类来调用。所以一般在需要实现以下两个功能时使用静态变量:在多个对象之间共享时、方便访问变量时

JAVA static深入了解

我是研究僧i 提交于 2020-03-04 09:22:40
static关键字: 1)static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享; 2)只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 一、static变量 1、按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。 两者的区别是: 1)对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 2)对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。 注:static成员变量的初始化顺序按照定义的顺序进行初始化,static不可以修饰局部变量。 2、所以一般在需要实现以下两个功能时使用静态变量: 1)在对象之间共享值时 2) 方便访问变量时 二、静态方法 1、静态方法的好处就是不用生成类的实例就能直接调用,可以这样理解使用static修饰的成员不再归对象所以,而是属于类 可以理解为是共有的,也就说只要通过类名就可以访问,不需要耗费资源反复创建对象

Java Static 深入理解

笑着哭i 提交于 2020-03-04 09:22:20
static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 需要了解jvm classloader 1、static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。 两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。 static成员变量的初始化顺序按照定义的顺序进行初始化。static不可以修饰局部变量; 所以一般在需要实现以下两个功能时使用静态变量: 在对象之间共享值时 方便访问变量时 2、静态方法 静态方法的好处就是不用生成类的实例就能直接调用,可以这样理解使用static修饰的成员不再归对象所以,而是属于类 可以理解为是共有的,也就说只要通过类名就可以访问,不需要耗费资源反复创建对象

Java核心技术面试精讲-23/24 Java的类加载过程

元气小坏坏 提交于 2020-03-04 03:28:23
我们知道,我们写的java文件是不能直接运行的,我们可以在IDEA中右键文件名点击运行,这中间其实掺杂了一系列的复杂处理过程。这篇文章,我们只讨论我们的代码在运行之前的一个环节,叫做 类的加载 。 首先我们给出这篇文章的大致结构: 首先,认识类加载机制; 然后,详细介绍类加载的过程。 最后,说一说类加载器,以及双亲委派原则。 1.什么是类的加载 在介绍类的加载机制之前,先来看看,类的加载机制在整个java程序运行期间处于一个什么环节,下面使用一张图来表示: 从上图可以看,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。今天我们要讨论的就是这个环节。有了这个印象之后我们再来看类的加载的概念: 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。 到现在为止,我们基本上对类加载机制处于整个程序运行的环节位置,还有类加载机制的概念有了基本的印象。在类加载.class文件之前,还有两个问题需要我们去弄清楚: 在什么时候才会启动类加载器? 其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它

Java基础知识1.4 一部分非访问修饰符

北城以北 提交于 2020-03-04 00:10:32
  static: static 是用来申明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝,局部变量不能申明为 static ; 用 static 修饰的方法叫做静态方法,静态方法不能使用类的非静态变量。静态方法是从参数列表得到数据,然后计算这些数据。 package class3; import java.util.Date; public class MainClass { public static int a = 10; public static final String name = "张三"; public static final int b = a; public static void main(String[] args) { //name = "李四"; //此处会直接报错。 a = 20; System.out.println("final修饰的引用变量发生改变 改变的值为"+a); } }    final: final 的引用不能改变,但是 final 修饰的变量的值是可以改变的;此处稍作解释: final 修饰的变量就相当于一个常量,其值是不能改变的,但是当 final 修饰的变量是一个引用变量,那么这个引用变量的地址就不能改变,但是引用变量内部的内容是可以改变的,就像你记住了人家的门牌号,但是你不能确定人家家里面有哪些人

static和final

寵の児 提交于 2020-03-03 16:57:16
/*--> */ /*--> */ static 可用于修饰变量,方法,代码块儿,内部类 静态变量: static---修饰变量 静态变量,也叫类的变量 随着类的加载而被加载到方法区的静态区中.在静态区中会根据数据类型赋予一个初值。静态变量先于对象的创建而存在,所以可以不用通过实例化对象而访问。当然也可以通过对象来访问,但不提倡这样使用。该类的对象所拥有的静态变量实际上是静态变量在静态区分配的存储空间的地址。 System.in System.out 静态变量可否定义在构造代码块儿中?---不可以. 静态变量可否在构造代码块儿中赋初值---可以。 静态方法: static修饰的方法叫静态方法,也叫类方法,随着类的加载而被加载到方法区的静态区中,注意,是加载到静态区中,而不是执行,只有在调用的时候,会到栈中去执行。静态方法和静态变量一样,也是不依赖于任何该类的对象而存在的,所以能够不实例化对象而直接通过类来调用。虽然可以用对象来调用,但不提倡这样使用。 Arrays.sort(); Arrays.copyOf(); System.arraycopy() Arrays.toString(); 1. 可以将静态变量定义在静态方法中吗?---不可以 2. 能在静态方法中调用本类的非静态的方法或访问成员变量吗?—不可以 3. 静态方法可以被重载吗?---可以 4. 静态方法可以被重写吗?--

Java性能优化怎么做?

柔情痞子 提交于 2020-03-02 12:10:06
Java性能优化怎么做?在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。 1、尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 1)控制资源的使用,通过线程同步来控制资源的并发访问; 2)控制实例的产生,以达到节约资源的目的; 3)控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 2、避免随意使用静态变量 当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存 此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。 3、避免过多创建Java对象 尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。 4、使用final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,**例如Java、lang、String,为String类指定final防止了使用者覆盖length()方法。**另外,如果一个类是final的

深入剖析Classloader(一)--类的主动使用与被动使用

时光总嘲笑我的痴心妄想 提交于 2020-03-01 21:28:25
原文地址: http://yhjhappy234.blog.163.com/blog/static/3163283220115573911607 我们知道 java 运行的是这样的,首先 java 编译器将我们的源代码编译成为字节码,然后由 JVM 将字节码 load 到内存中,接着我们的程序就可以创建对象了,我们知道 JVM 将字节码 load 到内存之后将将建立内存模型( JVM 的内存模型我们将在稍后阐述),那 JVM 是怎么将类 load 到内存中的呢?对了,是通过 Classloader ,今天我们就来深入探讨一下 Classloader 。 首先我们来看一段诡异的代码(一段单实例测试代码)。 package com.yhj.jvm.classloader; /** * @Description:单例初始化探究 * @Author YHJ create at 2011-6-4 下午08:31:19 * @FileName com.yhj.jvm.classloader.ClassLoaderTest.java */ class Singleton{ private static Singleton singleton=new Singleton(); private static int counter1; private static int counter2 = 0;