在阅读The Ruby Programming Language时,我发现,在与类同名的对象上调用类方法。
我发现objective-c也从blog做了类似的事情。这里的类恰好是元类的实例。
作为另一种主要的面向对象语言,我很想知道Java如何实现/实现这一目标。
修改
我很欣赏每个人的答案。但我的问题不是如何调用类方法。许多答案都在回答这个问题。如果我的问题没有得到很好的解决,或者它给了你一个错误的想法,那就道歉。
答案 0 :(得分:2)
在Java中我们可以使用类名称调用静态方法。像
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 AND 以下是the doc
答案 1 :(得分:1)
答案 2 :(得分:1)
静态方法在其声明中具有static修饰符,应该使用类名调用,而不需要创建类的实例,如
ClassName.methodName(args)
此外,静态方法通过在其前面加上类名来调用,例如,Math.max(i,j);.奇怪的是,它也可以用一个对象来限定,这将被忽略,但是将使用该对象的类。
答案 3 :(得分:1)
在Java语言中,在类而不是对象上调用静态方法,例如System.currentTimeMillis
。因此,概念上这与Ruby,ObjC,Smalltalk等非常相似。
与Ruby和Objective C不同,没有对象实例可以调用这些方法:Java字节码有一个特殊的字节码指令来调用静态方法;此字节码指令不使用堆栈中的对象指针:
INVOKESTATIC "java/lang/System" "currentTimeMillis" "()J"
使用反射时,静态方法的这种特殊处理由以下事实表示:您不需要指定调用该方法的对象。相反,您可以提供null
作为通话目标。
答案 4 :(得分:0)
使用类本身调用静态方法或变量。 e.g。
如果您在班级public static Integer age
中有Employee
的静态成员,则可以使用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()
答案 5 :(得分:0)
在java中,静态方法属于类而不是该类的对象。因此,className将静态方法称为:
ClassName.staticMethod();