黑马程序员——Java基础----面向对象(static、main函数、帮助文档及运用)(3)

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

面向对象(static、main函数)

一、static关键字

当多个对象中存在着共同数据---->使用静态
加上static,静态被对象所共享。每个对象都可访问,但是却不存在对象的堆内存中。

原理图:

代码没有什么区别,内存有区别,节省内存空间。

特有数据随着对象存储,存在堆内存中。

方法区(数据区、共享区):方法、静态数据


1、static特点:
1)随着类的加载而加载。。。随着类的消失而消失。说明:它的生命周期最长
2)优先于对象存在(因此多了一个使用类名调用方的法:类名.)(静态先存在,对象后存在)
3)被所有对象所共享
4)可直接别类名所调用
2、用法:
是一个修饰符,用于修饰成员(成员变量、成员方法);当成员被静态修饰后,就多了一个方法。
除了可以被对象调用外,还可以被类名调用。类名.静态成员
3、实例变量和类变量的区别:
1)存放位置
类变量随着类的加载而存在于方法区中。
实例变量随着对象的加载而存在于堆内存中。
2)生命周期
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
4、静态使用的注意事项:
1)静态方法只能访问静态成员
非静态方法既可以访问非静态方法也可以访问静态方法。
2)静态方法中不可以定义this,super关键字。
因为静态优先于对象而存在,所以静态方法中不可以出现this.
(this是了本类的意思)

5、静态的优缺点?
优点:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存一份。
           可以直接被类名调用。
缺点:生命周期长。
          访问出现局限性(静态虽好,只能访问静态 )
示例:

二、main函数

JVM调用main函数的时候到底传了一个什么参数?    传入的是new String[0];

数据最方便的表现形式就是字符串。



三、静态的应用_工具类、帮助文档_说明书

1、什么时候使用静态?
因为静态修饰的内容有成员变量和函数。
2、什么时候定义静态变量(类变量)?
当对象中出现共享数据值时,该数据被静态所修饰。而对象中的特有数据要定义成非静态存放于对内存中。
3、什么时候定义静态函数?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
示例:

因为show方法没有访问非静态的数据,可以定义成静态方法,先于对象存在。可以使用类名调用方法。


四、静态的应用(工具类)

(多个应用程序具备相同的功能,把这个功能抽离出来,单独封装到一个类中。 )

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

功能函数内部一点也没有用到ArrayTool类内部的数据,它的数据都是用户传进来的。



class ArrayTool
{
     private ArrayTool(){}//保证不能生成对象
     public static int getMax(int[] arr) 
     {
          int max=0;
          for (int i=1;i<a.length ;i++ )
          {
               if(arr[max]<arr[i])
                    max=i;
          }
          return arr[max];
     }

     public static int getMin(int[] arr) 
     {
          int min=0;
          for (int i=1;i<a.length ;i++ )
          {
               if(arr[min]>arr[i])
                    min=i;
          }
          return arr[min];
     }

     public static void selectSort(int[] arr)
     {
          for (i=0;i<a.length-1 ;i++ )
          {
               for (int j=i+1; j<a.length;j++ )
               {
                    if(arr[i]>arr[j])
                         swap(arr,i,j);
               }
              
          }
     }
     public static void bubbleSort(int[] arr)
     {
          for (int i=0;i<a.length-1 ;i++ )
          {
               for (int j=0;j<a.length-i-1 ;j++ )
               {
                    if(arr[j]>arr[j+1])
                         swap(arr,j,j+1);                   
               }
          }
     }
    private static void swap(int[] arr,int a,int b)
     {
          int temp=arr[a];
          arr[a]=arr[b];
          arr[b]=temp;
     }
     public static void printArray(int[] arr)
     {
          System.out.print("[");
          for (int i=0;i<a.length ;i++ )
          {
               if(i!=arr.length-1)
                    System.out.pritn(arr[i]+",");
               else
                    System.out.print(arr[i]);
          }
     }
}

注意:虽然可以通过建立ArrayTool的对象使用这些工具方法,对数据进行操作。
但是,发现了问题:

1)对象是用于封装数据,而ArrayTool对象并未封装特有数据。

2)操作数组的每一个方法都没有用到ArrayTool对象中的特有 数据。

这时就考虑到让程序更严谨,就不需要对象。可以将ArrayTool中的对象都定义成static,直接通过类名调用。

将方法静态之后可方便使用,但是该类还是可以被其他程序建立对象的。

为了更严谨,强制该类不能被其他程序建立对象,可以通过将构造函数私有化。(默认的构造函数)

2、说明文档(帮助文档、API文档)

对暴露出来的内容进行说明

凡是public的修饰符,都可以使用文档注释描述/**   */,都可以被文档注释工具所提取。

1、步骤:
1)对类进行描述。
2)对类中的方法进行描述。
2、能生成文档的权限有哪些?
要生成帮助文档的类一个是public 类
private 权限的方法不被提出,能提取的只有public  protected
3、默认构造函数的权限随着类的权限变化而变化的。
一个类中默认会有一个空参数的构造函数,这个默认构造函数的权限和所有类的一致。
如果类被public修饰,那么默认的也是public修饰符。如果类没有修饰符,默认的构造函数也没有public。

注意:默认的构造函数是系统添加,不用写,写出来的是自定义的。
----->自定义的

4、示例:

如果将ArrayTool.class类发送给别人,其他人只需要将文件设置到CLASSPATH路径下就可以使用该工具类。

但是,对于该类中到底有多少个方法,并不清楚,因为该类并没有说明书。

*****JAVA说明书使用javadoc工具生成,通过文档注释来完成。

示例:

三、静态代码块

1、格式:
static
{
    静态代码块中的执行语句
}
2、特点:
随着类的加载而执行,只执行一次.(加载完就执行下完了),并优先于主函数
用于给类进行初始化,即类不进内存就初始化

3.静态代码块无法访问非静态成员变量。
构造代码块可以。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值