在阅读The Ruby Programming Language时,我了解到,类方法是在与类同名的对象上调用的。
我发现objective-c 也从博客中做了类似的事情。这里的类恰好是元类的实例。
作为另一种主要的面向对象语言,我很想知道 Java 如何实现/实现这一点。
编辑
我感谢大家的回答。但我的问题不是关于如何调用类方法。许多答案都在回答这个问题。如果我的问题没有很好地表达或给你一个错误的想法,我深表歉意。
在阅读The Ruby Programming Language时,我了解到,类方法是在与类同名的对象上调用的。
我发现objective-c 也从博客中做了类似的事情。这里的类恰好是元类的实例。
作为另一种主要的面向对象语言,我很想知道 Java 如何实现/实现这一点。
编辑
我感谢大家的回答。但我的问题不是关于如何调用类方法。许多答案都在回答这个问题。如果我的问题没有很好地表达或给你一个错误的想法,我深表歉意。
在Java中我们可以调用类名的静态方法.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)
另请参阅有关 Java 中静态关键字的 10 点
,这是文档
声明中带有 static 修饰符的静态方法应该使用类名调用,而不需要创建类的实例,如
ClassName.methodName(args)
此外,通过在其前面加上类名来调用静态方法,例如 Math.max(i,j);。奇怪的是,它也可以用一个对象来限定,这将被忽略,但将使用对象的类。
在 Java 语言中,静态方法在类而不是对象上调用,例如System.currentTimeMillis
. 所以从概念上讲,这与 Ruby、ObjC、Smalltalk 等非常相似。
与 Ruby 和 Objective C 不同,没有对象实例可以调用这些方法: Java 字节码有一个特殊的字节码指令,可以调用静态方法;此字节码指令不使用堆栈中的对象指针:
INVOKESTATIC "java/lang/System" "currentTimeMillis" "()J"
使用反射时,这种对静态方法的特殊处理表现为您不需要指定调用该方法的对象。相反,您可以提供null
作为调用的目标。
使用类本身调用静态方法或变量。例如
如果您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()
在java中,静态方法属于类而不是该类的对象。因此,静态方法由 className 调用为:
ClassName.staticMethod();