ClassName.m()和(new ClassName())有什么区别.m()m()是一个静态方法

时间:2011-08-16 16:09:27

标签: java static

ClassName.m()(new ClassName()).m() m()之间的区别是静态方法。

4 个答案:

答案 0 :(得分:6)

不同之处在于,在第二个示例中,您在内存中创建了一个不必要的对象。

它仍然为ClassName类调用相同的静态方法。

建议使用ClassName.m()以避免不必要的对象创建,并为开发人员提供上下文,指示确实正在调用静态方法。

答案 1 :(得分:2)

三件事:

  1. 第二个有额外的电话,这意味着它可能会改变结果。这可能不好,可能不是,但需要考虑。请参阅有关如何工作的示例。
  2. 第二个创建一个额外的对象。那太糟糕了。
  3. 第二个暗示你在一个对象上调用一个方法,而不是在类本身上调用一个方法,这会使阅读它的人感到困惑。这也很糟糕。请参阅示例,了解这可能非常糟糕!
  4. 考虑以下原因1:

    class ClassName {
        static int nextId;
        static int m() { return nextId; }
        int id;
        ClassName() { id = nextId; nextId++; }
    
        /**
         C:\junk>java ClassName
         2
         2
         3
         */
        public static void main(String[] args) {
            new ClassName();
            new ClassName();
            System.out.println(ClassName.m());
            System.out.println(ClassName.m());
            System.out.println((new ClassName()).m());
        }
    }
    

    考虑以下内容,添加到原因2,如@emory所暗示的那样:

    class ClassName {
    
        // perhaps ClassName has some caching mechanism?
        static final List<ClassName> badStructure = new LinkedList<ClassName>();
    
        ClassName() {
             // Note this also gives outside threads access to this object
             // before it is fully constructed! Generally bad...
             badStructure.add(this); 
        }
    
        public static void main(String[] args) {
            ClassName c1 = new ClassName(); // create a ClassName object
            c1 = null; // normally it would get GC'd but a ref exist in badStructure! :-(
        }
    }
    

    考虑以下因素,原因3:

    class BadSleep implements Runnable {
    
        int i = 0;
        public void run() {
            while(true) {
                i++;
            }
        }
    
        public static void main(String[] args) throws Exception {
    
            Thread t = new Thread(new BadSleep());
            t.start();
    
            // okay t is running - let's pause it for a second
            t.sleep(1000); // oh snap! Doesn't pause t, it pauses main! Ugh!
        }
    }
    

答案 2 :(得分:1)

从外部观察者的角度来看,没有区别。两种方式都会导致对方法的调用,在任何一种情况下都只能执行完全相同的操作。但是,你永远不应该做第二个,因为在这种情况下创建一个对象是没有意义的。

答案 3 :(得分:0)

如果m()是静态方法,则使用ClassName.m()通常是正确的做法,因为m()ClassName的方法,而不是ClassName的对象