黑马程序员技术交流社区

标题: 静态方法和实例方法的区别 [打印本页]

作者: 王国文    时间: 2012-6-8 20:21
标题: 静态方法和实例方法的区别
静态方法  实例方法
1/   static 不需要static
2   / 类名调用 实例调用
3/   可以访问静态成员  可以访问静态成员
4/  不可以直接访问静态成员 可以直接访问静态成员
5/    不能直接调用实例方法 不能直接调用实例方法和静态方法
6/   调用时初始化 实例化对象时初始化

一.什么是静态方法,最好帮忙举个例子
二。上面4,5,6要怎么理解啊
作者: 张雪风    时间: 2012-6-8 21:31
前面加 Static的就是静态的

可以通过下面的理解下

静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问
不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问
一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值
静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等

作者: 刘豪    时间: 2012-6-8 22:14
看如下代码
class Person
{
static int age;
string name
public Person(){}
public string SetName(string pName){name=pName;}
static public int GetAge(){return age}
}
其中age、GetAge()都是静态成员,是类级别的成员,只能用类来调用,如Person.age、Person.GetAge,Person类型的对象是不能调用这两个成员的,而且也不能被非static方法调用包括构造方法。一句话静态成员都只能由类直接调用,而实例方法都只能由对象调用。
作者: 朱亮辉    时间: 2012-6-8 22:21
1、使用static修饰的方法,可以直接用类访问
2、没有使用static修饰的方法,只能通过对象访问(类的实例)
3、static修饰的方法不能被重写,不用static修饰的方法就可以被重写。

    class Program
    {
        static void Main(string[] args)
        {
            //Test1方法只能先实例化一个对象,通过对象t来访问(不用static修饰的方法)
            Test t = new Test();
            t.Test1();

            //使用static修饰的方法可以直接通过类访问方法
            Test.Test2();

        }



    }

    public class Test
    {
        //不带static的方法
        public void Test1()
        {

        }

        //带有static的方法
        public static void Test2()
        {

        }
    }
作者: 何拴绪    时间: 2012-6-8 22:53
用static修饰的方法货变量就称为静态方法或者静态变量。静态方法和变量是在类被加载时就创建,静态方法是存在与代码区的,静态变量是存放在静态区的。实例方法对象实例化是创建。
静态方法可以使用 类名.方法名 来访问。也可以使用对象来访问。实方法必须要new对象才可以访问。在静态方法中可以访问静态变量,不可以访问实例成员。还是看代码吧:
  1. class MyStatic
  2. {
  3.         int i = 5;
  4.         static int j=2;
  5.         public static void method1() {
  6.                 System.out.println("这是静态方法1-->"+j);//可以访问静态成员
  7.                 //System.out.println("这是静态方法1-->"+i);//不可以访问实例成员
  8.         }
  9.         public void method2() {
  10.                 System.out.println("这是实例方法-->"+i);//可以访问实例成员
  11.                 System.out.println("这是实例方法-->"+j);//可以访问静态成员
  12.         }
  13. }
  14. class TestStatic
  15. {
  16.         public static void main(String[] args)
  17.         {
  18.                 MyStatic ms = new MyStatic();
  19.                 ms.method1();//通过对象访问
  20.                 MyStatic.method1();//使用类名访问静态方法

  21.                 ms.method2();//通过对象访问实例方法
  22.                 //MyStatic.method2();//不可以使用类名访问实例方法

  23.         }
  24. }
复制代码

作者: 王国文    时间: 2012-6-9 11:55
刘豪 发表于 2012-6-8 22:14
看如下代码
class Person
{

”  不能直接调用实例方法“那要怎么调用了
不能直接访问静态成员,那要怎么访问
作者: 王国文    时间: 2012-6-9 12:10
朱亮辉 发表于 2012-6-8 22:21
1、使用static修饰的方法,可以直接用类访问
2、没有使用static修饰的方法,只能通过对象访问(类的实例)
...

首先你回答的好,第二个问题:不能直接调用实例方法。。。。。。。。。。。如果要调用的话,要怎么调用
作者: 刘豪    时间: 2012-6-9 15:03
实例方法只能通过实力构造方法创建对象来调用,所谓的实例化就是指创建对象,凡是非静态的都必须用对象来调用。有些理论的东西,你可以去看看相关的书籍。
作者: 聂玉林    时间: 2012-6-9 15:16
静态方法不能直接调用非静态成员,要通过类的对象进行调用。
不能被New的类,是静态类。
作者: 孙玉昌    时间: 2012-6-10 09:00
静态是类的,实例是对象的.oop的观点就是静态成员就是类所有对象所具备的特点,而实例成员是每个对象自有的实现,是不一样的.比如说每个人都有头发,眼睛,耳朵,名字,性别,年龄,身高等等.这些都是静态的,但是每个人的这些属性是不一样的,这些不同的属性就是实例化.所以也可以说静态方法不需要依赖类当中的属性,静态方法本身就可以封闭的完成一个功能,而实例的方法更多会用到类中的属性.
  静态方法在它一启动的时候就实例化了,因而静态内存是连续的,而且静态内存是有限制的;而实例方法是在程序运行中生成内存的,实例申请的是离散的空间.静态方法大多用的数据连接上.
作者: 李玲    时间: 2012-6-12 11:00
一、在DAL中使用静态方法,不创建实例直接调用(大概有很多人都使用这种方式开发)

class DAL
{
public static string GetUserName(...);
}
在BLL中调用:
DAL.GetUserName();

二、在DAL中使用实例方法,采用静态成员模式(或Singleton)通过实例来调用:
class DAL
{
public static readonly DAL dal = new DAL();
public string GetUserName(...);
}
在BLL中调用:
DAL.dal.GetUserName();

三、在DAL中使用实例方法,每次调用之前先创建DAL对象的实例:
class DAL
{
public string GetUserName(...);
}
在BLL中调用:
DAL dal = new DAL();
dal.GetUserName();


静态方法效率要高点,但是释放内存的时间长,只有这个类完全释放后,静态方法才实现,如果程序内部有好多要访问这个访问,还是用实例方法吧

作者: 杨雪    时间: 2012-6-12 23:24
静态方法属于类,调用的时候直接使用类进行调用,实例方法属于对象,调用的时候需要先实例化一个对象,用对象进行调用
作者: 黑马-许泽宇    时间: 2012-6-13 06:52
最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
  任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。

作者: 许庭洲    时间: 2012-6-13 09:02
1.C#静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例;
2.非静态方法可以访问类中的任何成员,而静态只能访问类中的静态成员。
举一个简单的C#静态方法应用实例:
C#静态方法实例演示:
class A   
{   
  int x;   
  static int y;   
     static int F()
   {  
       x=1; //错误,不允许访问  
       y=2; //正确,允许访问  
    }  
.....
}
说明,实例分析:
1、在这个类定义中,C#静态方法F()可以访问类中静态成员y,但不能访问非静态成员x;
2、x作为非静态成员,在类的每个实例中都占有一个存储(或者说具有一个副本),而静态方法是类所共享的,它无法判断出当前的x是属于哪个类的实例,所以不知道应该到内存的哪个地址去读取当前x的值;
3、y是静态成员,所有类的实例都公用一个副本,静态方法F使用它就不存在什么问题。
作者: 吴伟烈    时间: 2012-6-16 18:01
在一个类里面用static修饰的方法就叫静态方法,可以通过类名直接调用:类名.静态方法名() ;而不用先new一个类的对象,再用 对象名.方法名() 去调用,当然,你用第二种方法也是可以的

至于第四,你应该是写错了
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

第五
静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。

第六
不管静态方法还是实例方法都是在调用的时候初始化的

作者: 孙毅    时间: 2012-6-17 08:29
静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存
静态方法是通过类名直接访问,实例方法是通过类的实例访问。
作者: 程艳伟    时间: 2012-6-22 19:25
看到上面说的那么多,其实很简单,你看到static就是静态的,静态的永远在内存中,所以调用的时候不用new一下,告诉你个经验,用的时候最好谨慎用静态变量,因为静态变量是永远存在内存中的,当它改变的时候,它不会初始化,嗯.......举个列子,比如现在客户A让了一个静态变量a赋值为5(原值为0),客户B想用静态变量a=0,但明显它已经变为5,这样就出错了,我以前间站的时候遇到了这种情况,当时一直断点才找到答案,所以在这里分享下
作者: 刘逍遥    时间: 2012-6-22 19:34
  静态方法不用实例化就可以用-------------可以讲这个方法理解为类级别的方法
实例方法必须实例化后才可以用【当然实例化的方法很多】-----------------------可以将其理解为对象级别的方法




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