您的位置:首页 > 职场人生

13.黑马程序员-static关键字、静态代码块

2012-10-16 18:04 253 查看
------- android培训java培训、期待与您交流! ----------
1.static(静态)关键字

作用:用于修饰成员(成员变量和成员方法)。
被修饰后成员的特点:

随着类的加载而加载。
优先于对象存在。
被所有对象所共享。
可以直接被类名调用:类名.静态成员。

使用注意

静态方法只能访问静态成员。
静态方法中不可以写this,super关键字。
主函数是静态的。
静态的好处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每个对象都存储一份。。可以直接用类名调用。
静态的弊端:生命周期过长,访问出现局限性。

什么时候使用静态?

要从两方面下手

因为静态修饰的内容有成员变量和函数。
什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,共享数据不是指成员变量相同,而是变量的值相同。对象中的特有数据要定义成非静态存在于堆内存中。
什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据)。那么该功能可以定义成静态的。

方法区:

静态方法存在于方法区
也叫做:共享区,数据区。
方法区还有一些更细节的划分
存在:类中的方法,类中的共享数据,

方法是类的共性方法,对象的特有数据是每个对象都不同的。
方法区的数据(类变量,也就是静态变量)随着类的建立而建立,随着类的消失而消失。而实例变量随着对象的建立而存在于对内存中,随着对象的消失而消失。

静态的应用

当多个应用程序的功能重复时,可以把方法提取出来,建立一个Tool类。
虽然可以通过建立arrayTool的对象使用这些工具方法,对数组进行操作,但是发现了问题

对象是用于封装数据的,开始arrayTool对象中并未纷杂U那个特有数据。
操作数组的每一个方法都没有用到arrayTool对象中的特有数据。
这时就考虑,让程序更严谨,是不需要对象的。
可以将arrayTool中的方法都定义成static的。直接通过类名调用即可。可以将构造函数私有防止被建立对象。

2.静态代码块

静态代码块的格式:

static
{

静态代码块中的执行语句。

}

特点:随着类的家在而执行,只执行一次。
作用:给类初始化,并且不需要调用,不论位置前后都优先于mian函数。
用到类中的内容的时候,类才会初始化,new 类(使用了构造方法)或类名.方法都是。值定义引用是不会加载类的,例如类 类名=null就不加载。
静态代码块的考试
静态代码块、构造代码块、构造函数一起出现,前者随着类初始化,后者随着对象初始化。疑问?静态代码块和构造代码块次序不同时,是按代码顺序初始化呢还是先初始化类在初始化对象这种方式。
对象的初始化过程。

创建对象时,new在内存中做了什么事情。
person p =new person();
new对象的时候会将person这个class从硬盘当中通过jvm加载进内存,开辟了堆内存空间。这时候栈内存中,主函数里有个p引用。
静态代码块被执行。
对象空间开辟,成员变量进入内存,默认初始化,例如int初始化为0,字符串初始化为null。然后是显示初始化,成员变量开始赋值。
接下来构造代码块初始化,再后构造函数初始化。
将内存地址付给栈内存中的p变量。

对象调用成员过程

person p = new person("zhangsan",20);
p.setName(“lisi”);
方法区优先于对象存在,静态方法、静态变量先初始化。
栈里面main先执行,有一个引用变量p,堆里面有一个 person 对象,对象默认初始化后再显示初始化,然后p指向对象。
对象成员(方法、变量)加载进方法区。
对象方法中如果含有局部变量参数,那么这个方法也要进入栈中开辟空间。方法一开辟空间内部就有个this的引用,谁调用这个方法,this就是堆中的这个对象,然后栈中的方法的局部变量修改堆中的成员变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: