黑马程序员技术交流社区

标题: 静态方法?? [打印本页]

作者: Friends★    时间: 2012-4-18 19:10
标题: 静态方法??
我在看毕老师(6—3)视频的时候,对什么时候定义静态方法还不是很明白,谁能给我讲的简单并且好理解点?



如果能通过具体的实例讲解更好!!比如来一段代码什么的……




作者: liuyang    时间: 2012-4-18 19:13
静态方法和实例方法的区别主要体现在两个方面:

在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

下面几个例子展示了这一区别。

1、调用静态方法示例。

//-----------hasStaticMethod.java-----------------public class hasStaticMethod{//定义一个静态方法public static void callMe(){  System.out.println("This is a static method.");}}

下面这个程序使用两种形式来调用静态方法。
//-----------invokeStaticMethod.java-----------------public class invokeStaticMethod{  public static void main(String args[]){  hasStaticMethod.callMe();  //不创建对象,直接调用静态方法      hasStaticMethod oa = new hasStaticMethod();   //创建一个对象  oa.callMe();      //利用对象来调用静态方法}}
程序两次调用静态方法,都是允许的,程序的输出如下:
This is a static method.This is a static method.

允许不创建对象而调用静态方法,是Java为了减少程序员调用某些常用方法时的麻烦,而允许程序员按照传统的C语言中使用函数的方式来使用方法。典型的例子是前面某些程序中使用"Math.ramdon()"来获取随机数。
还有一个很典型的代表就是数组的处理工具Arrays
2、静态方法访问成员变量示例。

//-----------accessMember.java-----------------class accessMember{private static int sa; //定义一个静态成员变量private int ia;  //定义一个实例成员变量//下面定义一个静态方法static void statMethod(){  int i = 0;    //正确,可以有自己的局部变量sa = 10;     //正确,静态方法可以使用静态变量  otherStat();    //正确,可以调用静态方法  ia = 20;   //错误,不能使用实例变量  insMethod();  //错误,不能调用实例方法}static void otherStat(){} //下面定义一个实例方法 void  insMethod(){  int i = 0;    //正确,可以有自己的局部变量  sa = 15;    //正确,可以使用静态变量  ia = 30;    //正确,可以使用实例变量  statMethod();   //正确,可以调用静态方法}}

本例其实可以概括成一句话:静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。

main()方法是一个典型的静态方法,它同样遵循一般静态方法的规则,所以它可以由系统在创建对象之前就调用。

作者: 王德南    时间: 2012-4-18 19:16
当这个方法与类里其他方法没什么必然联系而且这个方法会被频繁的调用的时候可以考虑用static.
作者: 李平    时间: 2012-4-18 19:17
静态:static。
  是一个修饰符,用于修饰成员(成员变量,成员函数)。
static String country = "CN";//不在堆内存中了,被提取出
    被对象所共享。


   当成员变量静态修饰后,就多了一个调用方式,除了可以被对象调用外,
还可以直接被类名调用。  类名.静态变量
存在于共享区中。
class Person
{
   static String country="CN";
}
class StaticPerson
{
   public static void main(String [] args)
  {
      System.out.println(Person.country);
  }
}

特有内容随着对象存储。

static特点:
  1,随着类的加载而加载。
       静态随着类的消失而消失,生命周期最长
  2,优先于对象存在
       静态先存在,对象后存在
  3,被所有对象共享
  4,可以直接被类名调用

实例(成员)变量和类变量的区别
  1,存放位置。
      类变量随着类的加载而存在于方法区中
      实例变量。。。。。。。。。堆内存在。
  2,生命周期
      类变量生命周期最长,随着类的消失而消失
       实例变量随着对象的消失而消失
  3,主函数时静态的。


静态使用注意事项:
  1,静态方法只能访问静态成员。
       非静态方法既可以访问静态也可以访问非静态。
  2,静态方法中不可以定义this,super关键字。
      因为静态优先于对象存在。所以静态中不可以出现this。

静态利弊:
利:对对象的共享数据进行单独空间的存储,节省空间,
    可以直接被类名调用
弊:生命周期过长。
    访问出现局限性(只能访问静态)
使用静态:
定义静态变量(类变量):
    当对象中出现共享数据时,该数据被静态所修饰,
    特有数据定义成非静态存在于堆内存中。
定义静态函数:
    当功能内部没有访问到非静态数据(对象的特有数据),
   那么该功能可以定义成静态的。
class Person
{
   String name;
   public static void show()
   {
      1, System.out.println("haha");//未应用到name属性,用static修饰
      2, System.out.println(name+"haha");//应用到name属性,不可用static修饰
   }
}
class ShowPerson
{
   Person.show();
}
作者: Friends★    时间: 2012-4-19 08:44
谢谢回答!!
作者: 张超超    时间: 2012-4-19 09:33
给你发一下关于静态方法的总结:
1。静态方法的特点: 直接调用类名+方法名,不需要实例化类对象。
如: Hello.P();
非静态方法则必须实例化一个对象出来,再通过对象调用该方法如: Hello hello=new Hello(参数1~n); hello.P();

2。程序被打包成.jar文件后(相当于.exe文件),给外界唯一的接口就是main方法。使用者双击.jar文件,其实就是让虚拟机执行main方法。

3。main方法不是提供给程序员的,而是提供给虚拟机和使用客户的。 一个软件你没法让客户知道你内部的详情,当然客户也就没办法知道怎么去实例化对象,更不知道实例化对象时需要输入什么参数了。所以只能采用静态方法。
     希望对你有帮助
作者: 林豪    时间: 2012-4-19 09:34
简单的说静态就是放在方法区,被静态修饰后只要一加载类后他就会出现在方法区




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2