java面向对象(2)

六、对象知识点——static(静态)关键字

        static是一个修饰符,用于修饰成员(成员变量和成员函数)。当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。格式:类名.静态成员。

static特点:

        1、随着类的加载而加载。

              也就是说:静态会随着类的消失而消失,说明它的生命周期最长。

        2、优先于对象存在。明确一点:静态是先存在。对象是后存在。

        3、被所有对象所共享。

        4、可以直接被类名所调用。

       由于静态成员可以直接被类名调用,因此静态成员变量又称为类变量。而非静态成员变量又被称为实例变量。

实例变量和类变量的区别:

        1、存放位置。

              类变量随着类的加载而存在于方法区中。

              实例变量随着对象的建立而存在于堆内存中。

        2、生命周期。

              类变量生命周期最长,随着类的消失而消失。

             实例变量生命周期随着对象的消失而消失。

静态有利有弊:

        利处:对对象共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份。可以直接被类名调用。

        弊端:生命周期过长。

                   访问出现局限性。(静态虽好,只能访问静态)。

静态需要清楚的几个小问题:

什么时候使用静态?

        从两方面下手: 因为静态修饰的内容有成员变量和函数。

1、什么时候定义静态变量(类变量)呢?

        当对象中出现共享数据时,该数据被静态所修饰。

        对象中的特有数据要定义成非静态存在于堆内存中。

2、什么时候定义静态函数呢?

        当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。

静态使用注意事项:

        1、静态方法只能访问静态成员。

              非静态方法既可以访问静态也可以访问非静态。

        2、静态方法中不可以定义thissuper关键字。

              因为静态优先于对象存在。所以静态方法中不可以出现this

        3、主函数是静态的。

静态代码块:

       格式:

              static

              {

                           静态代码块中的语句。

              }

特点:随着类的加载而执行,执行一次。并优先于主函数。用于给类进行初始化。

对象的初始化过程:

        定义一个新对象都做了哪些事情?

        1、把类名.class文件加载到内存中。

        2、执行该类中的static代码块,如果有得话,给该类进行初始化。

        3、在堆内存中开辟空间,分配内存地址。给对象

        4、在堆内存中建立对象的特有属性。并进行默认初始化。

        5、对属性进行显示初始化。

        6、对对象进行构造代码块初始化。

        7、对对象进行对应构造函数初始化。

        8、将内存地址赋给栈内存中的对象名变量。

静态的应用——文档说明书。

        每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装。以便复用。

下面我们以一个数组工具类为例,作一个文档说明书。

程序:

[java] view plaincopy

1. /** 

2. 这是一个可以对数组进行相关操作的工具类,该类提供了取数组的最值、排序等功能。 

3. @author Godream 

4. @version V1.0 

5.  

6. */  

7. //类名权限要最大才能创建说明书文档  

8. public class ArrayTool   

9. {  

10.     /** 

11.     空参数构造函数 

12.     */  

13.     private ArrayTool() //私有化构造函数是为了让其不能创建对象。  

14.     {  

15.       

16.     }  

17.   

18.     /** 

19.     这个功能用于得到int类型数组中的最大值 

20.     @param arr 接收一个int类型的数组 

21.     @return 返回接收的该数组的最大值 

22.     */  

23.     public static int getMax(int[] arr)  

24.     {  

25.         int max=0;  

26.         for (int x=1;x<arr.length ;x++ )  

27.         {  

28.             if(arr[x]>arr[max])  

29.                 max=x;  

30.         }  

31.         return arr[max];  

32.     }  

33.       

34.     /** 

35.     这个功能用于得到int类型数组中的最小值 

36.     @param arr 接收一个int类型的数组 

37.     @return 返回该数组的最小值 

38.     */  

39.     public static int getMin(int[] arr)  

40.     {  

41.         int min=0;  

42.         for (int x=1;x<arr.length ;x++ )  

43.         {  

44.             if(arr[x]<arr[min])  

45.                 min=x;  

46.         }  

47.         return arr[min];  

48.     }  

49.   

50.     /** 

51.     对int类型数组进行选择升序排列 

52.     @param arr 接收一个int类型的数组 

53.     */  

54.     public static void selectSort(int[] arr)  

55.     {  

56.         for (int x=0;x<arr.length-1 ; x++)  

57.         {  

58.             for (int y=x+1; y<arr.length; y++)  

59.             {  

60.                 if(arr[x]>arr[y])  

61.                     swap(arr,x,y);  

62.             }  

63.         }  

64.     }  

65.   

66.     /** 

67.     对int类型数组进行冒泡升序排列 

68.     @param arr 接收一个int 类型数组 

69.     */  

70.     public static void bubbleSort(int[] arr)  

71.     {     

72.         for (int x=0;x<arr.length-1;x++ )  

73.         {  

74.             for (int y=0;y<arr.length-x-1;y++ )  

75.             {     

76.                 if(arr[y]>arr[y+1])  

77.                     swap(arr,y,y+1);  

78.             }  

79.         }  

80.     }  

81.   

82.     /** 

83.     对数组中的两个元素进行位置交换 

84.     @param arr 接收一个int类型的数组 

85.     @param a 要置换的元素角标 

86.     @param b 要置换的元素角标 

87.     */  

88.     private static void swap(int[] arr,int a,int b)  

89.     {  

90.         arr[a]=arr[b]+(arr[b]=arr[a])*0;  

91.     }  

92.   

93.     /** 

94.     遍历数组:打印数组中所有元素,形式为:[elemet1,elemet2,...] 

95.     @param arr 接收一个int类型的数组 

96.     */  

97.     public static void printArray(int[] arr)  

98.     {  

99.         System.out.print("[");  

100.         for (int x=0; x<arr.length-1; x++)  

101.         {  

102.             System.out.print(arr[x]+",");  

103.         }  

104.         System.out.println(arr[arr.length-1]+"]");  

105.     }  

106. }  

dos命令行中输入命令:javadoc -d Myhelp -author-version ArrayTool.java

Java中的javadoc工具就会帮我们完成说明文档也称API的制作。

如图:

知识拓展:

主函数:

主函数是一个特殊的函数。作为程序的入口,可以被JVM调用。

主函数的定义:

        public:代表着该函数访问权限是最大的。

        static:代表主函数随着类的加载就已经存在了。

        void:主函数没有具体的返回值。

        main:不是关键字,但是是一个特殊的单词,可以被JVM识别。

      String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。

        argsarguments  参数  。唯一可以更改的地方。

主函数是固定格式的:被JVM识别。

 

七、单例设计模式

设计模式的概念:解决某一问题最行之有效的方法。java中共有23种设计模式。

接下来我们讲解其中的一种:单例设计模式。

单例设计模式的作用:使一个类在内存中只存在一个对象。

用代码实现单例设计模式需要做三部:

        1、将构造函数初始化。

              例:private Single(){}

        2、在类中创建一个本类对象。

              例:private static Single s= newSingle();

        3、提供一个访问方法可以获取到该对象。

              例:public static Single getInstance()

                     {

                            returns;

                      }

单例设计模式只是为了保证内存中的对象唯一,其他在类中该怎么描述吗,还是怎么描述。

单例设计模式有两种写法:

        1、饿汉式:也就是刚三部中的示例语句。它的特点是先初始化对象。如:Single类一进内存,就已经创建好了对象。在实际开发中,出于安全考虑,建议使用饿汉式。

完整代码如下:

[java] view plaincopy

1. class Single  

2. {  

3.      private static Single s=new Single();  

4.      private Single(){}  

5.      public static Single getInstance()  

6.      {  

7.           return s;  

8.      }  

9. }  

2、懒汉式:它的特点对象是方法被调用时,才初始化,这也叫对象的延时加载。如:在以下完整代码中,Single类进内存,对象还没有存在,只有调用了getInstance()方法时,才创建对象。

完整代码如下:

[java] view plaincopy

1. class Single  

2. {  

3.      private static Single s=null;  

4.      private Single(){}  

5.      public static Single getInstance()  

6.      {  

7.           if(s==null)   

8.                s=new Single();  

9.           return s;  

10.      }  

11. }  

 

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值