静态变量

JAVA面试宝典-基础篇(二)

爱⌒轻易说出口 提交于 2020-02-25 11:09:01
11 、 "==" 和 equals 方法究竟有什么区别? (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) == 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用 == 操作符。 如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如 Objet obj = new Object(); 变量 obj 是一个内存, new Object() 是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用 == 操作符进行比较。 equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码: String a=new String("foo"); String b=new String("foo"); 两条 new 语句创建了两个对象,然后用 a,b 这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即 a 和 b

【2019秋冬】【面经】JVM

血红的双手。 提交于 2020-02-25 01:18:29
Java运行时数据区/内存区域 程序计数器 虚拟机栈 基本数据类型和对象引用 Java堆 对象实例及数组 本地方法栈 native方法 方法区 被虚拟机加载的类,静态变量,常量,编译后代码 判断常量是废弃常量 看这个常量是否还被引用 判断类是无用类 1.该类不存在任何实例 2.该类的类加载器已经被回收 3.无法通过反射的方法调用该类 垃圾收集算法,特点 1.标记清除 常用于老年代,把要回收的进行标记,标记完成后统一回收 2.标记整理 用于老年代,把存活的统一向一边移动,按边界清除回收 3.复制算法 分两半,当一半快满时,把存活的移动至另一半 4.分代算法 把Java堆分为新生代和老年代 1/3 2/3 新生代按8:1:1的Eden和Survivor,每次使用一个Eden和一个Survivor,当快满时,把所有存活的放入另一块Survivor,另外两块清空 新生代没更新一次就+1,当达到15时自动转化为老年代 HotSpot为什么要分老年代新生代 对不同的代可以采用不同的回收算法,效率更高 常见垃圾收集器 Serial 单线程,新生代 ParNew 多线程,新生代,和CMS一起用 Parallel Scavenge 多线程,新生代,考虑吞吐量 Serial Old 单线程,老生代 Parallel Old 多线程,老生代 CMS 老生代,初始标记,并发标记,重新标记,并发清理 G1

Java基础——对象和类

ⅰ亾dé卋堺 提交于 2020-02-24 23:05:25
  将包含main方法的类称为主类。   变量的作用域是指变量可以在程序中引用的范围。   实例变量和静态变量的作用域是整个类,无论变量是在哪里声明的。   局部变量的声明和使用都在一个方法的内部。   一个类的实例变量和静态变量称为类变量或数据域。在方法内部定义的变量成为局部变量。   局部变量的作用域从声明变量的地方开始,直到包含该变量的块结束为止。局部变量都必须在使用之前进行声明和赋值。(Java没有给局部变量赋默认值)   无论在何处声明,类变量的作用域都是整个类。类的变量和方法可以在类中以任意顺序出现。但当一个数据域是基于对另一个数据域的引用来进行初始化时则不是这样。在这种情况下,必须首先声明另一个数据域。   类变量只能声明一次,但是在同一个方法内不同的非嵌套块中,可以多次声明相同的变量名。   可以在一个方法的不同块里声明同名的局部变量,但是,不能在嵌套块中或同一个块中两次声明同一个局部变量。   如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏。   可以把两个类放在同一个文件中,但是文件中只能有一个类是公共(public)类。此外,公共类必须与文件同名。源代码中的每个类编译成.class文件。   构造方法在使用new操作符创建对象的时候调用,它是一种特殊的方法,有以下三个特殊性:    (1)构造方法必须具备和所在类相同的名字

单例模式

狂风中的少年 提交于 2020-02-24 10:41:19
一、什么是单例? 确保一个类只有一个实例,并提供一个全局访问点 二、应用 线程池、缓存、数据库等,只需要一个实例,如果多个实例 会造成异常情况 三、简单实现 1)懒汉式简单实现 ①public class Singleton{   private static Singleton singleton;   private Singleton(){}   public static Singleton getInstance(){     if(singletn==null){//位置一       singleton = new Singleton();     }     return singleton;   } } 注:简单的实现对于多线程会有问题,第一次创建singleton时,线程1正在执行位置一,同时线程2又需要一个singleton的实例,她也执行到位置一,致使线程1,2都获取到一个singleton的实例,造成出现两个singleton实例 ②解决多线程的问题,加入synchronized同步锁,只准一个进入去创建实例,重新写getInstance方法 public static synchronized Singleton getInstance(){     if(singletn==null){//位置一       singleton = new

C++类中静态变量和静态方法使用介绍

早过忘川 提交于 2020-02-22 18:31:16
静态成员的提出是为了解决数据共享的问题。实现共享有许多方法,如:设置全局性的变量或对象是一种方法。但是,全局变量或对象是有局限性的。这一章里,我们主要讲述类的静态成员来实现数据的共享。   静态数据成员   在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。   使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。   静态数据成员的使用方法和注意事项如下:   1、静态数据成员在定义或说明时前面加关键字static。//静态变量的定义   2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:     <数据类型><类名>::<静态数据成员名>=<值> //静态变量的初始化   这表明: (1) 初始化在类体外进行,而前面不加static,(这点需要注意)以免与一般静态变量或对象相混淆。   (2) 初始化时不加该成员的访问权限控制符private,public等。   (3) 初始化时使用作用域运算符来标明它所属类,因此

第八次作业

浪子不回头ぞ 提交于 2020-02-22 02:23:22
一.本次课学习到的知识点: (1)void为不反回结果的函数,且void不能省略,否则默认为int,函数体中没有表达式的return语句,也可省略return. (2)不返回结果的函数在定义、调用、参数传递、函数声明上,思路与以前相同,适用于把一些确定的、相对独立的程序功能封装成函数。 (3)局部变量:定义在函数的内部,且有效作用范局部变量一般定义在函数或复合语句的开始处,围局限于所在的函数内部,形参是局部变量。 (4)不能定义在中间位置。 (5)全局变量:定义在函数外而不属于任何函数的变量。作用范围是从定义开始到程序所在文件结束,他对范围内所有函数都起作用。 (6)全局变量可以定义在程序的头部、也可以定义在两个函数的中间或程序尾部。 (7)自动变量定义形式:auto 类型名 变量表;静态变量定义格式:static 类型名 变量表;静态变量只能用于所定义的函数,而全局变量用于所有函数。 二.实验过程中遇到的问题及解决方法: (1)一些题目依旧不能够正确理解。 (2)全局变量、局部变量、静态变量的异同还不太清楚,存在或多或少的模糊。 解决方法:上网或者翻看书籍,多打几次代码,多做几次练习。 三.心得 其实代码打着打着也就熟练了,也就清楚要怎么做了。 虽然在一些问题上还是不太清晰,如使用函数统计指定数字个数,但是多问问同学或者老师或者是会的一些外援,其实也还是可以解决的。 总的来说

Synchronized修饰静态变量和普通变量的区别

懵懂的女人 提交于 2020-02-21 05:39:59
这里主要涉及到类对象(static方法),对象方法(非static方法) 我们知道,当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例); 当synchronized修饰一个非static方法时,多线程下,获取的是对象锁(即类的实例对象) 所以,当synchronized修饰一个static方法时,创建线程不管是new JoinThread()还是new Thread(new JoinThread()),在run方法中执行inc()方法都是同步的; 相反,当synchronized修饰一个非static方法时,如果用new JoinThread()还是new Thread(new JoinThread())方式创建线程,就无法保证同步操作,因为这时 inc()是属于对象方法,每个线程都执有一个独立的对象实例new JoinThread(),所以多线程下执行inc()方法并不会产生互斥,也不会有同步操作。 另外如果考虑到变更的原子操作,可使用atomic包下面的包装对象,这些对象都是对volatile修饰变量的一种延伸,可保证变量的原子操作而不用去同步方法或 代码块是否同步。 来源: https://www.cnblogs.com/tiancai/p/8204024.html

android常见内存泄漏

无人久伴 提交于 2020-02-20 09:09:29
1、静态变量 类中定义了静态Activity变量,把当前的Activity赋值给静态变量,如果Activity生命周期结束的时候静态变量没有清空,就会导致内存泄漏。static变量是贯穿整个应用的生命周期,所以被泄漏的Activity就会一直存在于应用的进程中,不会被回收。 private static Activity sActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); sActivity = this; findViewById(R.id.btn_back).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); } } 2、 非静态内部类 创建 静态实例 这里的非静态内部类是Config,创建的静态实例是sConfig 造成内存泄漏的原因是 内部类会隐式持有外部类的引用 ,这里的外部类是NonStaticActivity,然而内部类sConfig又是static静态变量

嵌入式C高级用法

余生长醉 提交于 2020-02-19 11:38:00
1内存管理 我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字的,只知道地址。 内存的使用时程序设计中需要考虑的重要因素之一,这不仅由于系统内存是有限的(尤其在嵌入式系统中),而且内存分配也会直接影响到程序的效率。因此,我们要对C语言中的内存管理,有个系统的了解。 在C语言中,定义了4个内存区间:代码区;全局变量和静态变量区;局部变量区即栈区;动态存储区,即堆区;具体如下: 1>栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2>堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3>全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的 另一块区域。 - 程序结束后由系统释放。 4>常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。 5>程序代码区—存放函数体的二进制代码。 我们来看张图: 图1 首先我们要知道,源代码编译成程序,程序是放在硬盘上的,而非内存里!只有执行时才会被调用到内存中!我们来看看程序结构

Java学习—Day03

我们两清 提交于 2020-02-18 02:12:45
自学Java-Day03 自学java第三天,今天学习static关键字和成员内部类 static关键字用于修饰类的成员,如成员变量、成员方法以及代码块。 注:static 不能 修饰局部变量 一、静态变量 定义:被static关键字修饰的成员变量。 静态变量能够被所有实例共享。 class Student { static String schoolName ; } public class Demo01 { public static void main ( String [ ] args ) { Student stu1 = new Student ( ) ; Student stu2 = new Student ( ) ; Student . schoolName = "XX中学" ; System . out . println ( "我的学校是" + stu1 . schoolName ) ; System . out . println ( "我的学校是" + stu2 . schoolName ) ; } } 说明:schoolName是静态变量,可直接使用Student.schoolName调用,也可以通过Student的实例对象调用也就是Student stu1=new Student(); 二、静态方法 使用静态方法可以实现在不创建对象的情况下调用某个方法。