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