1,静态:static
1.1用法:是一个修饰符,用于修饰成员(成员变量和成员方法),当成员变量被静态修饰后,除了可以被“对象成员变量”调用外,还多了一种修饰方法:类名.成员变量
1.2static的特点:
1.2.1.随着类的加载而加载;
也就是说,静态随着类的消失而消失,说明它的生命周期最长
1.2.2.优先于对象存在;
明确一点:静态先存在,对象后存在
1.2.3.被所有对象共享;
1.2.4.可以直接被类名所调用;
1.3静态变量和类变量的区别:
1.3.1,存放的位置:
类变量随着类的加载而存在于方法区中;
实例变量随着对象的建立存在于堆内存中
1.3.2,生命周期:
类变量的生命周期最长,随着类的消失而消失
实例变量的生命周期随着对象的消失而消失
1.4静态使用注意事项:
1.4.1,静态方法只能访问静态成员
非静态既可以访问静态也可以访问非静态
1.4.2,静态方法中不可以使用this,super关键字
因为静态优先于对象存在,所以金泰方法中不可以出现this
1.4.3,主函数是静态
1.5,静态的利与弊:
利处:对对象的共享数据进行单独空间的存储,节省空间,没有必要为每个对象都存储一份。
可以被类名直接调用。
弊端:生命周期过长。
访问出现局限性。(静态虽好,只能访问静态)
示例代码:
class Person
{
String name; //成员变量,实例变量
static String country="CN"; //静态的成员变量,类变量
public static void show()
{
System.out.println(": :"+country);
}
}
class StaticDemo
{
public static void main(String[] args)
{
//Person p=new Person();
//p.name="zhangsan";
//p.show();
Person.show(); //直接使用类型调用
}
}
1.6,什么时候使用静态?
1.6.1,什么时候定义静态变量(类变量)?
当对象中出现共享数据时,该数据被静态所修饰,对象中的特有数据要定义成非静态存在于堆内存中。
1.6.2,什么时候定义静态函数?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态。
2,静态的应用:
每个应用程序都有一个共性的功能,可以将这些功能进行抽取,独立封装,以便复用。
下面给出一个示例,该示例演绎的是自定义操作数组的工具类,工具类中实现了数组的取最值、选择排序、冒泡排序和打印等功能。
ArrayTool是用户自定义的工具类,ArrayTest是用户测试类。
class ArrayTool:
/**
这是一个对数组进行操作的类,类中提供了获取最大值最小值和排序等功能!
@author 李超
@version V1.0
*/
public class ArrayTool
{
/**
空构造函数
*/
private ArrayTool(){}
/**
获取一个整型数组的最大值
@param arr 接收一个int类型的数组
@return 会返回数组中的最大值
*/
public static int getMax(int[] arr)
{
int max=0;
for(int i=1;i<arr.length;i++)
{
if(arr[i]>arr[max])
max=i;
}
return arr[max];
}
/**
获取一个整型数组的最小值
@param arr 接收一个int类型的数组
@return 会返回数组中的最小值
*/
public static int getMin(int[] arr)
{
int min=0;
for(int i=1;i<arr.length;i++)
{
if(arr[i]<arr[min])
min=i;
}
return arr[min];
}
/**
给int数组进行选择排序
@param arr 接收一个int类型的数组
*/
public static void selectionSort(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=i+1;j<arr.length;j++)
{
if(arr[i]>arr[j])
{
swap(arr,i,j);
}
}
}
}
/**
给int数组进行冒泡排序
@param arr 接收一个int类型的数组
*/
public static void bubbleSort(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=i+1;j<arr.length-i-1;j++)
{
if(arr[j]>arr[j+1])
{
swap(arr,j,j+1);
}
}
}
}
/**
给数组中的元素进行位置置换
@param arr 接收一个int类型的数组
@param a 要置换的位置
@param b 要置换的位置
*/
private static void swap(int[] arr,int a,int b)
{
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
/**
用于打印数组中的元素,格式是:[element1,element2,...]
*/
public static void printArray(int[] arr)
{
System.out.print("[ ");
for(int i=0;i<arr.length;i++)
{
if(i!=arr.length-1)
System.out.print(arr[i]+", ");
else
System.out.println(arr[i]+"]");
}
}
}
class ArrayTest:
class ArrayTest
{
public static void main(String[] args)
{
int[] arr={3,5,6,2,4,1,0,8,7};
int max=ArrayTool.getMax(arr);
System.out.println("max="+max);
ArrayTool.printArray(arr);
ArrayTool.selectionSort(arr);
ArrayTool.printArray(arr);
/*
ArrayTool at=new ArrayTool(); //此处报错,因为ArrayTool类的构造函数被private修饰,外部类不能调用对象访问
int max=at.getMax(arr);
System.out.println("max="+max);
*/
}
}
3,帮助文档的制作(javadoc)
制作程序说明书,java的说明书是通过文档注释来完成的,具体注释方法参考上面的源代码。
》》》文档注释以“/**”开始,以“*/”标志结束,相应的信息和批注所对应的位置很重要! 类的说明应在类定义之前,方法的说明应在方法的定义之前。
》》》批注参数来标记一些特殊的属性及其相应的说明 。
— @author<作者姓名>
— @version<版本信息>
— @param<参数名称><参数说明>
— @return<返回值说明>
dos命令是:javadoc -d myclass -author -version ArrayTool.java
注意:-d说明生成文档存放的路径,可以指定绝对路径,如c:\myclass;可以指定相对路径,如myclass,会自动生成一个myclass文件夹
-author,-version显示作者和版本号,可加可不加
后跟类的名称
但是,所被生成说明的类必须是公共类,类名前加public,否则生成文档会报错
编译结果:
最终文档:
4,静态代码块
格式:
static
{
静态代码块中的执行语句
}
特点:随着类的加载而执行,只执行一次。用于给类进行初始化的。
示例代码:
class StaticCode
{
static
{
System.out.println("a");
}
}
class StaticCodeDemo
{
static
{
System.out.println("b");
}
public static void main(String[] args)
{
new StaticCode();
new StaticCode();
System.out.println("over");
}
static
{
System.out.println("c");
}
}
运行结果:
分析:首先StaticCodeDemo类加载到内存,静态代码块随着类的加载而加载,所以StaticCodeDemo类中的第一个静态代码块执行,打印b;
接着执行第二个静态代码块,打印c;再接着执行main方法,执行到new StaticCode();时,StaticCode类被加载,StaticCode类中的静态代码块执行,
打印a;当执行到第二个new StaticCode();时,静态代码块值加载一次,不会再加载,所以什么都不打印,最好执行main的打印语句,打印over
总结:关于静态的知识点不难理解,但是又常常在静态这里犯错,主要是因为没有清楚的了解JVM的运作机制,不了解静态合适呗加载进内存,
何时存在何时消亡。有了上面的知识清单,就更好掌握静态的应用了,铭记:静态成员是随着类的加载而加载的,在对象创建之前静态成员就已经存在内存中,
所以关于静态中不能访问非静态这个异常就很好理解了,以后该知道怎么去处理这些异常。
本知识清单还列处理Java文档的制作,Java文档时给程序做一些说明用的,方便于以后为源码进行升级和维护,好的程序员会知道在编程时加上注释,
编译成文档,这使得代码更具有可读性。关于java文档的制作,上面的示例代码有一些介绍,可以作为必要的掌握!
2013.03.17