关闭

对static 修饰符之静态变量和静态方法的理解

标签: stringvb.netclassjava存储测试
2061人阅读 评论(0) 收藏 举报
分类:

我们知道,只要是类,无论什么类(包括抽象类),里面只有方法和变量,而要使用这个类我们一般分两步走,,一个员工类Employee

 

 

Employee s;//定义了一个Employee的引用

s=new Employee(“Aaron”,1980,3,1,1500);//这样才真正建立了一个对象s,也就是说s指向了内存中的一块连续的区域.

 

 

这里注意什么是真正的对象,什么是引用

 

 

如果我们要改变这块区域,需调用其中的方法,

s.raiseSalary(25);//raiseSalary(double)Employee 中的方法

 

 

这样,我们通过方法(类方法)改变了类中的变量(类数据或类变量).

 

 

所谓静态方法,就是通过类名来调用(当然通过类对象来调用一样是可以的,就像core java里说的一样,容易让人混淆!)的方法,

静态变量它是一种共享变量(VB.net里面如此称呼,比较容易理解).,任何通过类名来调用,都可以改变其值.

 

 

关于静态方法(通过类产生的对象)调用静态方法,调用非静态方法(通过类名或都是对象调用)都是可以的,但是,静态方法可以调用静态变量而不可以调用非静态变量(Error(12,30): non-static variable a cannot be referenced from a static context)

 

 

以下是thinking in java 里面的关于static 的描述:

 

 

2.6.3 static关键字
通常,我们创建类时会指出那个类的对象的外观与行为。除非用new创建那个类的一个对象,否则实际上并未得到任何东西。(注意,这里其实就是说的引用和真正的对象创建问题)只有执行了new后,才会正式生成数据存储空间,并可使用相应的方法。
但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用static(静态)关键字。一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据。而在这之前,对于非static数据和方法,我们必须创建一个对象,并用那个对象访问数据或方法。这是由于非static数据和方法必须知道它们操作的具体对象。当然,在正式使用前,由于static方法不需要创建任何对象,所以它们不可简单地调用其他那些成员,同时不引用一个已命名的对象,从而直接访问非static成员或方法(因为非static成员和方法必须同一个特定的对象关联到一起)。
有些面向对象的语言使用了类数据类方法这两个术语。它们意味着数据和方法只是为作为一个整体的类而存在的,并不是为那个类的任何特定对象。有时,您会在其他一些Java书刊里发现这样的称呼。
为了将数据成员或方法设为static,只需在定义前置和这个关键字即可。例如,下述代码能生成一个static数据成员,并对其初始化:

class StaticTest {
Static int i = 47;
}

现在,尽管我们制作了两个StaticTest对象,但它们仍然只占据StaticTest.i的一个存储空间。这两个对象都共享同样的i。请考察下述代码:
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
此时,无论st1.i还是st2.i都有同样的值47,因为它们引用的是同样的内存区域。
有两个办法可引用一个static变量。正如上面展示的那样,可通过一个对象命名它,如st2.i。亦可直接用它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用static变量,因为它强调了那个变量的静态本质)。
StaticTest.i++;
其中,++运算符会使变量增值。此时,无论st1.i还是st2.i的值都是48
类似的逻辑也适用于静态方法。既可象对其他任何方法那样通过一个对象引用静态方法,亦可用特殊的语法格式类名.方法()”加以引用。静态方法的定义是类似的:
class StaticFun {
static void incr() { StaticTest.i++; }
}
从中可看出,StaticFun的方法incr()使静态数据i增值。通过对象,可用典型的方法调用incr()
StaticFun sf = new StaticFun();
sf.incr();
或者,由于incr()是一种静态方法,所以可通过它的类直接调用:
StaticFun.incr();
尽管是静态的,但只要应用于一个数据成员,就会明确改变数据的创建方式(一个类一个成员,以及每个对象一个非静态成员)。若应用于一个方法,就没有那么戏剧化了。对方法来说,static一项重要的用途就是帮助我们在不必创建对象的前提下调用那个方法。正如以后会看到的那样,这一点是至关重要的——特别是在定义程序运行入口方法main()的时候。
和其他任何方法一样,static方法也能创建自己类型的命名对象。所以经常把static方法作为一个领头羊使用,用它生成一系列自己类型的实例

 

 

以下是我的测试程序:

 <pre>

 <pre>

package moonsoft.test.testDataStructure;

 

 

public class TestDriver

{

  public TestDriver()

  {

  }

  public static void main(String []args)

  {

    TestDriver td=new TestDriver();

    String month=td.monthName(3);//通过对象调用static method,不建议使用

    month=TestDriver.monthName(4);//标准的调用static method

    String month1=td.monthName1(3);//通过对象调用非static method

    month1=TestDriver.monthName1(4);

    /*不通过对象调用非static method:

     * Error(14,23): non-static method monthName1(int) cannot be referenced from a static context*/

    System.out.println(month+a);//静态方法调用静态变量

    System.out.println(month1+a);//静态方法调用静态变量

    System.out.println(month+a1);

    /*静态方法调用非静态变量

  *Error(17,30): non-static variable a1 cannot be referenced from a static context*/

 

 

   

  }

  public static String monthName(int month)//static method

  {

    switch ( month)

    {

      case 1: return "Jan";

      case 2: return "Feb";

      case 3: return "Mar";

      case 4: return "Apr";

      case 5: return "May";

      case 6: return "Jun";

      default: return "others";

     

    }

  }

  public String monthName1(int month)//not a static method

  {

    switch ( month)

    {

      case 1: return "Jan";

      case 2: return "Feb";

      case 3: return "Mar";

      case 4: return "Apr";

      case 5: return "May";

      case 6: return "Jun";

      default: return "others";

     

    }

  }

  public static int add(int t)

  {

    int s=t;

    s++;

    return s;

  }

  public  static double a;

  public double a1;

 

}

</pre>

其实很简单,随遍写出一个程序测试一下就好了,头脑里一定要清楚地知道静态究竟是怎么回事.

 

 

0
0
查看评论

5.Static ,protect,属性和方法,静态方法(static)和实例方法,JAVA的静态变量、静态方法、静态类

1.方法只能在类里创建,方法不能再方法里面创建。why? 答:从格式和文体上分析:方法是以}结尾的,而方法里的语句都必须是;结尾,所以不能在方法里创建方法。 It's a genaral rule. 2.在碎片中,onCreateView外边可以实例化,但是不能调用方法...
  • zhuhualoyal
  • zhuhualoyal
  • 2016-10-19 17:45
  • 604

static 静态变量和静态代码块的执行顺序

众所周知 在android中static 修饰的会被称之为 静态常量, 静态变量, 静态方法 ,还有就是静态代码块,用static{ // 代码块 非static修饰的方法,变量,常量, 是不能再静态代码块中使用的 } 表示。    ...
  • a22422931
  • a22422931
  • 2017-01-22 16:55
  • 4750

static修饰符,静态变量和静态方法

有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对...
  • ouwen123
  • ouwen123
  • 2011-11-08 17:06
  • 526

java静态变量和静态方法优缺点

java静态变量和静态方法会在程序初始化运行时候就加载到内存。 优点:不需要在进行实例化。静态变量的值,直接赋新值即可,不需要参数传递,之后可以直接进行参数引用即可;静态方法可以直接通过"类名.方法"的形式进行方法调用。通常方法被多次调用,并且方法中没有动态方法引用的时候使用比...
  • qq_26941173
  • qq_26941173
  • 2016-03-21 20:56
  • 2061

static 静态方法 有什么优缺点 PHP中静态方法(static)与非静态方法的使用及区别

static方法是类中的一个成员方法,属于整个类,即使不用创建任何对象也可以直接调用! 静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。 静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。 C++中,若类的方...
  • u010973051
  • u010973051
  • 2016-03-29 11:13
  • 14850

JAVA--静态修饰符(static)理解

学习JAVA中,有一个修饰符特别重要。That's static... 下面来总结一下我对Static的理解和对于它的使用场景... 首先要记住一点,静态的资源(静态代码快、静态方法、静态变量、静态内部类...)是随着类在加载的时候产生的,而并非跟非静态资源一样在产生该类对象(new XX(...
  • qq_25223941
  • qq_25223941
  • 2015-11-18 10:10
  • 1277

JAVA之变量隐藏、静态方法隐藏

隐藏变量 在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问。 但是,父类的同名变量可以通过super访问。一般来说,不推荐隐藏变量,这样会让代码难以阅读 当子类继续父类时,出现相同字段时父类字段不会将子类...
  • u014082714
  • u014082714
  • 2016-06-28 21:06
  • 804

static静态方法和静态变量用法

static 是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了。 1.创建对象$object = new Class(),然后使用”->”调用:$object->attribute/function,前提是...
  • u010737354
  • u010737354
  • 2016-09-06 09:21
  • 388

多线程中使用静态方法存在线程安全的问题

类的成员分两类,静态成员(static member)和实例成员(instance menber),静态成员属于类,实例成员则属于对象,即类的实例。    我们知道,静态字段和静态方法的调用都是通过类来调用的,静态方法不会对特定的实例操作,只能调用调用类中的其他属性和静态方法,...
  • qq_28269905
  • qq_28269905
  • 2017-05-15 11:04
  • 835

java static锁和非static锁区别

第一部分: synchronized 与static synchronized  的区别 第二部分:JVM底层又是如何实现synchronized的 第三部分:java多线程锁,源码剖析 第一部分: synchronized 与...
  • zbuger
  • zbuger
  • 2016-03-08 15:47
  • 3165
    个人资料
    • 访问:130868次
    • 积分:2768
    • 等级:
    • 排名:第15300名
    • 原创:119篇
    • 转载:9篇
    • 译文:0篇
    • 评论:29条
    最新评论