[align=left]上网查了半天,还是对静态方法搞不明白,
静态方法其实就是类方法,类方法就是操作类的静态变量的,这都没有疑问,
可是我还是不明白:有类可以产生类对象,类对象可以访问类的静态成员变量,
并且可以改变类的静态变量,
既然类成员可以改变类的静态变量,那么为什么:要定义静态方法来操作静态变量??
还有:平时我感觉都没怎么用过静态方法,
解释静态方法的可以顺便附带一点代码,让我感受一下静态方法的运用问题!![/align]如果你要回答基础不牢固什么的要求我去看书的话,最不要麻烦你了,等于没说。
正是因为看书没看懂,我才来这里问的!!!

解决方案 »

  1.   

    7.4. 静态变量,方法和类 
    静态变量
    Static int data语句说明data为类变量,为一个类的共享变量,属于整个类。
    例:
    Class M{
    static int data;
    }
    M m1=new M(); M m2=new M();
    m1.data=0;
    m1.data++的结果为1,此时m2.data的结果也为1。
    Static定义的是一块为整个类共有的一块存储区域。
    其变量可以通过类名去访问:类名.变量名。与通过对象引用访问变量是等价的。
     2) 静态方法
    Public static void printData(){}
    表明此类方法为类方法(静态方法)
    静态方法不需要有对象,可以使用类名调用。
    静态方法中不允许访问类的非静态成员,包括成员的变量和方法,因为此时是通过类调用的,没有对象的概念。方法中this.data和super.data是不可用的。
    原因:从根本来说,是静态变量不管类是否实例化都会存在,而实例变量只有类实例化了才存在。直接调用静态方法时并不确定实例变量是否存在。一般情况下,主方法是静态方法,所以JVM可以直接调用它,主方法为静态方法是因为它是整个软件系统的入口,而进入入口时系统中没有任何对象,只能使用类调用。
    猜想:JVM在代码中有这样的语句:
    ClassName.main(arg);  ClassName 通过命令行的”java 类名”取得,所以类名不用加.class 扩展名*覆盖不适用于静态方法。
    静态方法不可被覆盖。
    如果子类中有和父类重名的静态方法,虽然编译通过,但它并不能实现多态,所以不能称作覆盖。public class  Test {
       public static void main(String[] arg) {
            Super s = new Sub();
            s.show();
            
       }
    }
    class Super
    {
        static public void show(){System.out.println("in Super");}
    }
    class Sub extends Super
    {
        static public void show(){System.out.println("in Sub");}
    }执行结果是:  in Super3) 静态内部类----只能是成员内部类
    class Out{
    public static class Inner{}
    }
    4) 初始化块 
    1. 只被执行一次; 
        2. 初始化块在类被加载后首先被运行,不管类是否实例化
    3.一般用来初始化静态变量
    Public static void main(String[] args){
    System.out.println(Car.name);//这时加载Car Class进入JVM并执行静态代//码块 
    }
      

  2.   

    够具体了LZ
    静态的可以通过类名调用
    不是静态的是要new类名之后调用
    上面不是有例子说的很明白了哦
      

  3.   

    我来举个列子把public class Test{private static int a = 1;private  int b = 2;public static void main(String[] arg){
    //静态调用
    System.out.println(Test.a);
    //非
    System.out.println(new Test().b)
    }
    }
      

  4.   

    意义在这里
    主方法是静态方法,所以JVM可以直接调用它
      

  5.   

    嗯,我先澄清一下楼主的问题:
    1、楼主已经清楚静态变量是怎么回事儿,
    2、楼主只是不明便什么时候,为什么要使用静态变量。如果是这两个问题,我的回答如下:静态变量实际上是java中提供全局变量的一种机制,这样的变量,只要知道类名和变量名,就可以直接访问,
    只是由于java的面向对象特性,这些静态变量才不得不属于某个类。静态变量和方法不宜过度使用,它最主要的用途:
    1、使用public static final 定义常量
    2、单例模式中public static Class getInstance()
    3、public static void main(String[] args)其它情况,如果能够不用静态的,就别用。
      

  6.   

    在个我倒知道,理论上的东西我知道的差不多,就是用时候在运用上不是太熟悉~~~~~~~~也就是不知道这样做(用静态方法操作静态变量的好处) 按我的理解:你创建类就是为了实例化对象吧?对象可以操作静态变量吧?而静态方法可以直接操作静态变量,没错,这有什么意义呢?没有类对象的生成, 只是来改变类的静态成员变量,这有意义吗???很有意义我来给LZ您举个列子 Singleton模式
    Static通常用于Singleton模式开发:
    Singleton是一种设计模式,高于语法,可以保证一个类在整个系统中仅有一个对象。
    特点:
    1. 有一个静态属性
    2. 私有的构造―――singleton不能new
    3. 公共的静态方法来得到静态属性
    实现单例模式的原理:
    利用类属性(静态变量)在系统中唯一的特性,建立这样一个唯一的引用并控制这个引用所指的空间是不变的。
    public class ConnectionFactory{
    private static Connection conn;
    private Connection(){
    if(conn==null)
    conn = new Connction();
    }
    public Connection getInstance(){
    return conn;
    }
    }
    实现2
    public class ConnectionFactory{
    private static Connection conn;
    static{
    conn = new Connection();
    }
    public static Connection getInstance(){
    return conn;
    }
    }
      

  7.   

    static 只初始化一次
    上面的代码我没写详细注释
    应用:调用获得系统唯一的一个Connection类型的对象实列
    每次获得的都是相同的对象,也就是在内存里只有这一个
    其他的类new了一个内存就多了一个
    获得:
    ConnectionFactory.getInstance()
      

  8.   

    静态方法,我觉得在定义一个类时,如果初始化对象时不好声明名称,这就该用了。
    比如Math类max(int a, int b) :我们不会先Math m=new Math();再m.max(1,2);这样,而是Math.max(1,2);
    因为这样设计的话,代码的可读性会变差,自己想想应该明白吧一般在设计工具类的方法时就应该用静态方法了觉得回答的好的话就加点分
      

  9.   

    static变量和方法只在类首次加载的时候会初始化一次.以后就再不会了
      

  10.   

    鉴于java对象的创建销毁现在已经做得很好,不大会消耗太多..
    静态方法可以不是很建议使用,静态方法虽然方便,但是有的时候可能会引起一些多线程的问题.. 
      

  11.   

    考虑实际的例子,比如数学运算类Math。
    我们要算一个sin,cos等值,只需要Math.sin(x),Math.cos(x)这样就能计算出结果了,这些方法都是以类方法的方式提供的。想一下,这些运算需要专门的创建一个对象来调用方法吗?
    注意2点:如果能定义为static方法,说明这个方法和该类的任何对象没有关系;调用static方法不需要创建对象,要知道创建对象可是需要耗时的。    开始做设计的时候从面向对象的角度考虑是否需要设计static方法即可。涉及到性能相关的问题时,static方法就有很大的优势了。比如jpc这个项目中,性能是第一位的,它的一个设计原则就是,只要能把一个方法设计为static的,那绝对不会将它实现为非static的,这样就可以避免大量的无用对象的创建。而且,static方法是静态绑定的,不会涉及到多态,这也有性能上的优势。
      

  12.   

    原来看到过这个问题,好像是做大case的时候,会节省内存资源和节省调用时间,不知道说的对不对
      

  13.   

    static修饰的属性和方法 在类加载的时候就已经存在了 不用等到实例化 而且之加载一次就永久存在了 而且static的属性是公用的 
    只要有个对象改变了这个值 其他所有用到的地方都变成了这个修改以后的值 至于静态方法修改静态属性 那是因为这个方法是没办法才必须写成静态的 因为static修饰的属性在类加载的时候就要存在 比如编译的时候 但是呢 你这个\方法竟然不用static修饰 那么就会出现矛盾 一个要加载 一个不加载 倒置方法不能处理变量 
      

  14.   

    楼主再看看这个,可能会有一些新的理解:
    http://www.rainsts.net/article.asp?id=261
      

  15.   

    楼主看看这个:
    http://www.rainsts.net/article.asp?id=261
      

  16.   

    楼主看看这个:
    http://www.rainsts.net/article.asp?id=261