------- android培训、java培训、期待与您交流! ----------
8、static的作用
static是一个修饰符,用于修饰成员(成员变量、成员函数),当成员被static修饰后,多了一种调用方法:类名.成员名
体现:多个对象存在相同的数据时用static修饰属性,存放在数据区(方法区)
一、static的特点:
1、随着类的加载而加载。
也就是说哦静态会随着类的加载而加载,随着类的消失而消失,说明它的生命周期最长
2、优先于对象存在
声明一点:静态是先存在的,对象是后存在的
3、被所有的对象共享
4、可以直接被类名所调用
二、实例变量和类变量的区别:
1、存放位置:
类变量随着类的加载存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2、生命周期:
类变量的生命周期最长,随着类的消失而消失
实例变量的生命周期随着对象的消失而消失。
三、静态使用注意事项:
1、静态方法只能访问静态成员。
非静态方法即可访问静态方法,也可以访问非静态方法
2、静态方法中不可以定义this,super关键字
因为静态优先于对象存在,所以静态方法中不可以有this关键字
四、静态的利与弊:
利处:对对象共享数据进行单独的空间存储,节省空间,没有必要为每个对象中存储一份。可以直接被类名调用。
弊处:生命周期过长
访问出现局限性(静态虽好,只能访问静态)。
实例如下(主函数):
五、对主函数进行分析:
publicstaticvoid
main(String[] args)
//主函数时一个特殊的静态函数,作为程序的入口,可以被jvm调用
主函数的定义:
public:代表着该函数的访问权限是最大的
static:代表着主函数随着类的加载就已经存在
void:主函数没有返回值
main:不是关键字,但是可以被jvm识别
(String args[]):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串类型的数组
主函数时固定格式的:jvm识别
publicclass
CollectinDemo {
publicstaticvoid
main(String[] args) {
Teacher teacher =
new Teacher("zhangfei",10);
teacher.teaching();
}
}
public static void main(String args[])中只用args变量名可以改变(起源arguments)
jvm在调用主函数时,传入的是new
String[0]
要理解javac与java的含义:
Javac启动编译器;java启动虚拟机
六、什么时候使用静态
要从两个方面下手:
因为静态修饰的内容有成员变量和成员方法
1、什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰;至于对象中的特有数据要定义成非静态,存放于堆内存中
2、什么时候定义静态方法(类方法)呢?
当功能内部没有访问到非静态的数据(对象的特有数据)时候,那么该功能可以定义成静态的
可以将这些功能抽取,独立封装,以便重复使用(示例如下):
publicclass
ArrayTool {
publicstaticvoid
say(){
System.out.println("hello
world");
}
publicstaticvoid
study(){
System.out.println("I'm
study");
}
}
9、工具类的生成
虽然可以通过建立ArrayTool的对象使用这些工具方法,对数组进行操作,然而还是发现了问题:
1、对象适用于封装数据的,可ArrayTool对象并没有封装特有数据。
2、操作数组的每一个方法都没有用到ArrayTool对象的特有数据。
这个时候就考虑,让程序更严谨,是不需要建立对象的,可以把ArrayTool中方法都定义成static的。直接通过类名调用即可。
将方法都静态后,可以方便使用,但是该类还是可以被其他程序建立对象。为了更为严谨,强制让该类不能建立对象。可以通过将构造方法私有化完成
10、工具类的使用方式
【在使用工具非IDE工具的时候(或者直接在Dos环境下操作的时候),使用工具类步骤示例:set
classpath=.;c:\myclass java ArrayTool
被引用的类不在当前文件夹中,就要通过环境变量的设置来找到被引用的类,不然会抛异常,最好在设置的时候将“.;”当前目录带上,不然在运行的时候可能会报错
环境变量的设置:set classpath=.;c:\myclass(其中c:\myclass是一个文件夹的名称,这个可以任意)】
如果使用的工具是集成的IDE工具,例如eclipse,MyEclipse,IntelliJ
IDEA 5.1等,就不需要以上步骤。
给一个类写文档注释:
当这个类写好后,接下来,将ArrayTool.class文件发送给其他人,其他人只要将该文件设置到classpath路径下,就可以使用该工具类,但是该类中定义了多少个方法,使用者并不知晓,因为该类并没有使用说明书。
开始制作程序的文档说明书。Java的说明书通过文档注释来完成
示例代码如下:
ToolTest.java
/**
*这是一个可以对两个数进行比较的工具类
*@authorzhangzhongbao
*@version
v1.000
*/
publicclassToolTest
{
/**
*打印一段文字,内容为“hhh”
*/
publicvoid
test(){
System.out.println("hhh");
}
/**获取两个比较数的最大值
*@param
aint变量用于比较的参数
*@param
bint变量用于比较的参数
*@return返回最大值
*/
publicint
getMax(int a,int
b){
return a>b?a:b;
}
}
如果一个类想要生成文档,那么这个类必须是public的,不然系统报错
创建帮助文档的步骤:
Javadoc -d myclass –author –version ToolTest.java(此方法可以生成和jdk文档一样的文档)
11、初识静态代码块
一、静态代码块格式:
static
{
静态代码块中的执行语句
}
静态代码块特点:随着类的加载而加载,只执行一次,并且优先于主函数,用于给类进行初始化。
只执行一次,并且优先于主函数(这句非常重要),分析下面代码就能发现问题所在:a只执行了一次,示例代码:
publicclass
StaticCodeTest {
static{
System.out.print("b
");
}
publicstaticvoid
main(String args[]){
new
StaticCode();
new StaticCode();//静态代码块在类加载的时候加载,而且只执行一次
System.out.println("over");
}
static{
System.out.print("c
");
}
}
class
StaticCode{
static{
System.out.print("a
");
}
}
答案为b c
a over
12、静态代码块、构造代码快、构造方法的区别
静态代码块,随着类的加载而执行,且执行一次,优于主函数执行,用于给类进行初始化格式为:static{ }
构造代码块,用于给对象初始化,格式为:{ }
构造方法,用于创建相对应的对象
三者的执行顺序为:静态代码块>构造代码块>构造方法
示例代码:
publicclass
StaticCodeTest {
static{
System.out.print("b
");
}
publicstaticvoid
main(String args[]){
newStaticCode(5);
newStaticCode(6);
System.out.println("over");
}
static{
System.out.print("c
");
}
}
class
StaticCode{
intnum
;
static{
System.out.print("a
");//随着类的加载而加载,只执行一次
}
{
num=4;
System.out.println("构造代码块num"+num);//执行了两次,因为创建了两个对象
}
StaticCode(int
num){//创建对象的时候执行,每创建一个对象,就执行一次