java基础(五)——面向对象_静态

来源:互联网 发布:网络销售到底是传销吗 编辑:程序博客网 时间:2024/05/18 00:25

 

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,静态方法中不可以使用thissuper关键字

              因为静态优先于对象存在,所以金泰方法中不可以出现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]+", ");elseSystem.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



原创粉丝点击