黑马程序员技术交流社区

标题: 静态与非静态的问题 [打印本页]

作者: 赵玮    时间: 2012-1-5 20:10
标题: 静态与非静态的问题
本帖最后由 赵玮 于 2012-1-5 21:37 编辑

静态成员变量和成员方法与非静态的成员变量和成员方法有什么不同?
作者: 常兆鹏    时间: 2012-1-5 20:23
静态成员变量 :可以用类名直接访问,也可以用类的实例化来访问,

  非静态成员变量:不可以直接使用类名访问, (但是可以用实例化来访问)

  class myTest

  {

  public static int sNumber;

  public int nNumber;

  public myTest(int i ,int j){

  sNumber=i;

  nNumber=j;

  }

  }

  myTest mt= new myTest(100,50);

  console.writeline(myTest.sNumber); //100, 静态成员变量可以直接用类名来访问,

  console.writeline(myTest.nNumber); // 此刻会报错,因为非成员变量不能直接用类名来访问,

  console.writeline(mt.nNumber) ; //50 非静态成员可以用实例化类来调用

  ------------------------------------------------

  静态方法中只能使用静态成员变量,非静态方法既能使用 静态变量,也可以使用非静态成员变量。

  class MyClass {

  static void StaticFun() { //静态方法

  nsMember += nsMember; //出错!因为nsMember是非静态成员

  sMember += sMember; //ok,因为sMember是静态成员

  }

  void UStaticFun() { //非静态方法

  sMember += nsMember; //ok

  sMember += sMember; //ok

  }

  }

  //关于静态构造函数的执行顺序

  //静态构造函数的执行发生在类的静态成员初始化之后和类的第一个实例创建之前.

  一个类只能定义一个静态构造函数,并且不能带有参数

作者: 李玉杰    时间: 2012-1-5 20:25
首先说成员变量和静态变量的区别:
1,在内存空间存储的位置。
成员变量存储于对象所在堆内存中。
静态变量存储方法区的静态区中。       
2,生命周期。
成员变量随着所属对象的建立而出现,随着所属对象变成垃圾被回收而消失。
静态变量虽则所属的类加载而出现,随着类的消失而消失。
3,调用方式。
成员变量只能被对象调用。
静态变量既可以被对象调用,也可以被类名调用。
4,数据体现。
成员变量的值称为对象中的特有数据。
静态变量的值称为对象中的共享数据。

静态方法和非静态方法的区别:
静态方法只能访问静态成员(所以静态虽然多了一种用类名调用的方式,但是也出现了访问的局限性)。
非静态方法既可以访问静态又可以访问非静态。       
因为非静态们,都所属于对象。静态方法中不可以出现this,super关键字。
因为this代表对象,static方法存在时还没有对象呢.

这样写应该够详细了吧。。。。

作者: 卢其龙    时间: 2012-1-5 20:27
在加载内存里上有很大区别.

在语法上静态方法是不能被实例调用,也就是不用用this引用的.
静态方法是不允许被子类重写的,但是子类可以覆盖父类的静态方法。
子类也不可将父类中的非静态方法重写为静态方法。
要了解静态看看她在加载内存时结构就一目了然了.

main方法就是静态方法
作者: 罗利民    时间: 2012-1-5 20:57
静态的成员变量和方法在整个类的生存期都存在
非静态的是当实例化类后开始存在

静态的属于类,又叫做类成员变量和类成员方法,不用实例类就可以使用
而非静态的,需要实例化类,才能使用
作者: 苏格拉底的弟子    时间: 2012-1-5 21:44
楼主刚学习static吧。。。哈哈     我之前也不是很懂  .. 不过现在还算明白了    在这里给总结下我的理解
1,静态成员变量和非静态的成员变量的不同是
基本没有不同,最大的不同就是储存的位置一样,类变量随着类的加载而存在于方法区中,实例变量随着对象的建立而存在于堆内存中
2,你说的那个静态和非静态方法不同是:
他们可都是储存在方法区中的,最大的不同就是调用吧,静态方法只能访问静态成员,特别要注意的事静态方法中不可以定义this,super关键字,他们都可以直接被类名调用的,静态是先存在。对象是后存在的。

还有些也需要注意 不过楼上几位都说的比较清楚了。。我就不重复写了。






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