2013-07-01 124 views
1

在阅读The Ruby Programming Language时,我发现类方法是在与类名称相同的对象上调用的。如何调用类/静态方法

我发现objective-c也做了类似的事情从blog。这里类恰好是元类的实例。

作为另一种面向对象的主要语言,我很想知道Java是如何实现/实现它的。

编辑

我感谢大家从答案。但我的问题不是关于如何调用类方法。很多答案都在回答这个问题。如果我的问题没有很好的框架,或者给了你一个错误的想法,我很抱歉。

回答

1

在Java语言中,静态方法被调用例如在类而不是对象System.currentTimeMillis。因此从概念上讲,这与Ruby,ObjC,Smalltalk等非常相似。

与Ruby和Objective C不同,没有任何对象实例会被这些方法调用:Java字节码有一个特殊的字节码指令,它调用静态方法;这个字节码指令不使用对象的指针从栈:

INVOKESTATIC "java/lang/System" "currentTimeMillis" "()J" 

当使用反射,静态方法这个特殊处理的事实,你并不需要指定对象,该方法被称为代表根据。相反,您可以提供null作为呼叫的目标。

0

使用类本身调用静态方法或变量。 例如

,如果你有Employee类的静态成员为public static Integer age,那么你使用Employee.age

一样调用它的方法也行。例如Employee.paySalary();

让我们考虑一个例子。

public class StaticDemo { 


    public static void methodToPrintSomething(){ 
     System.out.println("printing any crap"); 
    } 

    public static void main(String[] args) { 

     StaticDemo.methodToPrintSomething(); 

     StaticDemo obj = new StaticDemo(); 
     obj .methodToPrintSomething(); 


    } 

} 

这里使用obj.methodToPrintSomething()调用方法。另一个有趣的事情是你可以找到的声明obj.methodToPrintSomething()。我们正在创建一个调用静态方法的对象,但这并不意味着我们正在调用对象上的methodToPrintSomething()。由于这是static,内部的声明obj.methodToPrintSomething()将被视为StaticDemo.methodToPrintSomething()

2

在Java中,我们可以调用与类name.like静态方法

ClassName.staticMethod(args); 

请记住,他们是一流水平的方法和变量,超越任何对象,所以这就是为什么他们被称为类名。
错误编译任何Java程序时,您可以看到JVM的现场演示,因为main也是一个静态方法

public class TradingSystem { 

    String description = "electronic trading system"; 

    public static void main(String[] args) { 
     description = "commodity trading system"; 
    } 
} 

不能使静态参考非静态字段描述

at TradingSystem.main(TradingSystem.java:8) 


也看到10 points about static keyword in Java
这里是the doc

1

请参JLS

类方法不参考特定对象总是调用。

当Java虚拟机调用一个类方法时,它根据对象引用的类型选择要调用的方法,该方法在编译时静态(早期)绑定时总是已知的。

1

静态方法,这在他们的声明中的static修饰符,应该用类名来调用,而无需创建类的实例,如

ClassName.methodName(args) 

而且静态方法通过用类名加前缀来调用,例如Math.max(i,j);.奇怪的是,它也可以用一个对象来限定,它将被忽略,但是对象的类将被使用。

Official Docs

0

在Java静态方法属于类而不是类的对象。所以,静态方法通过类名称为:

ClassName.staticMethod();