getClass()方法在java中是静态的吗?

getClass()方法在java中是静态的吗?,java,Java,getClass()方法在Java API中定义如下: public final native Class<?> getClass(); 我试图在自己的代码中使用上述行,然后我收到了以下投诉: "Can't make a static reference from a non-static method() from the type Object" 它应该是objectName.getClass(),对吗?我想知道为什么“记录器”的定义是有效的。如果它是private fina

getClass()方法在Java API中定义如下:

public final native Class<?> getClass();
我试图在自己的代码中使用上述行,然后我收到了以下投诉:

"Can't make a static reference from a non-static method() from the type Object"

它应该是objectName.getClass(),对吗?我想知道为什么“记录器”的定义是有效的。

如果它是
private final
而不是
private static final
,则它是有效的,因为如果它是
private final
,则它被分配给特定的对象;它隐式地等同于
LogFactory.getLog(this.getClass())

如果它是
private final
而不是
private static final
,则它是有效的,因为如果它是
private final
,则它被分配给特定的对象;它隐式地等同于
LogFactory.getLog(this.getClass())

字段声明如下所示:

modifiers type name = initializer;
如果希望每个实例都有自己的logger对象,则需要删除
static
修饰符,并使用给定示例中的代码。

字段声明如下:

modifiers type name = initializer;
如果希望每个实例都有自己的logger对象,则需要删除
static
修饰符,并使用给定示例中的代码。

getClass
不是静态的,因此在静态上下文中,使用
MyClass.class
语法,在非静态上下文中,使用
getClass()
语法:

public class MyClass {
  public Logger getLogger() { return LogFactory.getLog(getClass()); }

  public static Logger getLogger() { return LogFactory.getLog(MyClass.class); }
}

getClass
不是静态的,因此在静态上下文中使用
MyClass.class
语法,在非静态上下文中使用
getClass()
语法:

public class MyClass {
  public Logger getLogger() { return LogFactory.getLog(getClass()); }

  public static Logger getLogger() { return LogFactory.getLog(MyClass.class); }
}


给出上下文、方法上的修饰符及其所在的类。只是告诉我们你做了同样的事情并不意味着它实际上是一样的,只是有点不同。我在定义中添加了一个“static”。其他一切都是一样的。啊,但这让世界变得完全不同……为什么我不能在静态定义中调用实例方法(myClass.getClass())?例如,在静态void main(){}中,通常创建对象的实例,然后使用它们。@user697911如果要在静态定义中调用实例方法,可以,但需要像前面所说的那样创建实例。请提供上下文、方法上的修饰符及其所在的类。只是告诉我们你做了同样的事情并不意味着它实际上是一样的,只是有点不同。我在定义中添加了一个“static”。其他一切都是一样的。啊,但这让世界变得完全不同……为什么我不能在静态定义中调用实例方法(myClass.getClass())?例如,在静态void main(){}中,您通常创建对象的实例,然后使用它们。@user697911如果您想在静态定义中调用实例方法,您可以,但您需要像您所说的那样创建实例。我明白了。什么定义更好?也许“静态”版本更好?@user697911这取决于你需要什么。对于这种情况,
static
可能更适合于日志记录,因为您不需要为类的每个实例使用不同的日志记录程序;您只需以不同的方式初始化它(例如,通过传入
MyClass.class
),我明白了。什么定义更好?也许“静态”版本更好?@user697911这取决于你需要什么。对于这种情况,
static
可能更适合于日志记录,因为您不需要为类的每个实例使用不同的日志记录程序;您只需以不同的方式初始化它(例如,通过传入
MyClass.class
)即可。在什么情况下,每个实例都需要一个记录器?记录器应该记录整个应用程序,而不是特定的类实例?否则,您需要创建多少个记录器实例,它们的用处是什么?您不会。这只是为了显示语法上的差异。是否有很大的性能差异?因为我确实看到了记录器的非静态版本,如问题所示。JVM能够比实例方法更快地调度静态方法。此外,最好尽可能使所有内容都保持静态,因为这表明值/算法不依赖/改变实例值。但我肯定不会仅仅为了让某个东西静止而改变设计。我从不担心静态和实例调度之间的性能差异。我的主要问题是,为什么我使用的开源库使用非静态记录器。我怀疑作者犯了某种错误?在什么情况下,我们需要为每个实例使用记录器?记录器应该记录整个应用程序,而不是特定的类实例?否则,您需要创建多少个记录器实例,它们的用处是什么?您不会。这只是为了显示语法上的差异。是否有很大的性能差异?因为我确实看到了记录器的非静态版本,如问题所示。JVM能够比实例方法更快地调度静态方法。此外,最好尽可能使所有内容都保持静态,因为这表明值/算法不依赖/改变实例值。但我肯定不会仅仅为了让某个东西静止而改变设计。我从不担心静态和实例调度之间的性能差异。我的主要问题是,为什么我使用的开源库使用非静态记录器。我怀疑作者在那里犯了某种错误?