static、final、引用

static关键字的作用

static修饰类这个用得相对比前面的用法少多了,static一般情况下来说是不可以修饰类的,如果static要修饰一个类,说明这个类是一个静态内部类(注意static只能修饰一个内部类),也就是匿名内部类。像线程池ThreadPoolExecutor中的四种拒绝机制CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy就是静态内部类。


1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来

2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来

3.被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的,换言之,一处变、处处变

加载时间:

静态资源属于类,但是是独立于类存在的。从JVM的类加载机制的角度讲,静态资源是类初始化的时候加载的,而非静态资源是类new的时候加载的。类的初始化早于类的new,比如Class.forName(“xxx”)方法,就是初始化了一个类,但是并没有new它,只是加载这个类的静态资源罢了。所以对于静态资源来说,它是不可能知道一个类中有哪些非静态资源的;但是对于非静态资源来说就不一样了,由于它是new出来之后产生的,因此属于类的这些东西它都能认识。

几个问答:

1、静态方法能不能引用非静态资源?

不能,new的时候才会产生的东西,对于初始化后就存在的静态资源来说,根本不认识它。2、静态方法里面能不能引用静态资源?

可以,因为都是类初始化的时候加载的,大家相互都认识。

3、非静态方法里面能不能引用静态资源?

可以,非静态方法就是实例方法,那是new之后才产生的,那么属于类的内容它都认识。 

内部类静态块也是static的重要应用之一。也是用于初始化一个类的时候做操作用的,和静态变量、静态方法一样,静态块里面的代码只执行一次,且只在初始化类的时候执行

得出第一个结论:静态资源的加载顺序是严格按照静态资源的定义顺序来加载的。

Android中的例子:


使用static修饰内部类

final关键字:

final关键字的作用相信对于final的用法,

1、被final修饰的类不可以被继承                                                                                                          2、被final修饰的方法不可以被重写                                                                                                         3、被final修饰的变量不可以被改变(不可变的是变量的引用而非引用指向对象的内容 !)

被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的。这一点非常重要。


引用不可改变,引用指向的内容可以改变




引用(reference):


基础数据类型和引用数据类型

引用即类似于指针,其中存储是地址,而不是实质上的数据。

int num和String str = "hello”

从上图可以显而易见,num是int基本类型变量,值就直接保存在变量中。str是String引用类型变量,变量中保存的只是实际对象对应的地址信息,而不是实际对象数据。


引用修改

对于基本类型变量num,赋值运算符将会直接修改变量的值,原来的数据将被覆盖掉,被替换为新的值。对于引用类型变量str,赋值运算符只会改变变量中所保存的对象的地址信息,原来对象的地址被覆盖掉,重新写入新对象的地址数据。但原来的对象本身并不会被改变,只是不再被任何引用所指向的对象,即“垃圾对象”,后续会被垃圾回收器回收。

String类型的引用原理:

栈中存的是引用,实际数据存在堆中

数组的引用原理:


这是个二维数组

你可能感兴趣的:(static、final、引用)