static深入学习

来源:互联网 发布:ppap 知乎 编辑:程序博客网 时间:2024/06/13 19:57

static写代码中一个天天看到的概念
但是以前没有深入,为了内存经常原来,今天仔细研究static的用法,以后更好的使用代码。

java内存区域

1。栈区(stack):由系统的编译器自动的释放,主要用来存放方法中的参数,一些临时的局部变量等,并且方法中的参数一般在操作完后,会由编译器自动的释放掉。
2。堆区(heap):在Java中,一般会由垃圾回收机制自动的清理掉。此区域主要用来存放我们经常创建的对象、动态的申请的临时空间等。是应该关注的核心区域。
3。数据区:也称全局区或者静态区,根据名称我们就应该知道用来存放一些全局的东西,比如我们经常用到的静态变量、全局变量等都会存放到数据区,此区域上的东西都被全局所共享。比如我们可以采取类名。的方式就可以访问到方法,这就是所谓的静态方法,存放到数据区的。
4。代码区:存放程序编译后可以执行代码的地方。比如执行代码时写的While语句、if条件语句等,都会存放到此。代码中的方法static,非satic最后都会在代码区

静态变量

静态变量”:语言无关的通用定义:与程序有着相同生命周期的变量,存放在数据区,全局所共享。
静态方法在类加载的时候 就已经加载 可以用类名直接调用。

static作用:静态变量的生存周期和作用域

首先要理解生存周期与作用域的区别:
生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。
作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。

static变量是指静态的变量,生命周期是从程序开始到程序结束。
但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。可以认为static变量的作用域<=生存周期
例如静态局部变量,虽然生命周期是这个程序,但是作用域只是一个方法中。

静态方法

(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法。要实现这样的效果,只需要在类中定义的方法前加上static关键字。例如:
public static int maximum(int n1,int n2)
使用类的静态方法时,注意:
a在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。

b 静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生

c 静态变量是属于整个类的变量而不是属于某个对象的

静态方法和普通方法的最大区别,static修饰的方法,可以直接调用静态变量。静态方法也是在代码区中而不是和静态变量一样在数据区,所以使用静态方法不会引发内存问题,只有静态方法中调用的静态变量处理不当,引发堆区中无法正常垃圾回收引发内存问题。

一些问题

static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

声明ViewHolder内部类时,为什么建议使用static关键字
内部类定义成为静态的,这样不能持有外部的引用,不会调用外部类的实力方法,更加安全。

这个核心是静态内部类和非静态内部类的主要区别之一。非静态内部类会隐式持有外部类的引用,就像大家经常将自定义的adapter在Activity类里,然后在adapter类里面是可以随意调用外部activity的方法的。当你将内部类定义为static时,你就调用不了外部类的实例方法了,因为这时候静态内部类是不持有外部类的引用的。声明ViewHolder静态内部类,可以将ViewHolder和外部类解引用。如果ViewHolder是非静态内部类的话,就很容易出现内存泄露。如果是静态的话,你就不能直接引用外部类,迫使你关注如何避免相互引用。 所以将 ViewHolder内部类 定义为静态的,是一种好习惯

0 0
原创粉丝点击