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