getClass()方法在java中是静态的吗?
getClass()方法在Java API中定义如下: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
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能够比实例方法更快地调度静态方法。此外,最好尽可能使所有内容都保持静态,因为这表明值/算法不依赖/改变实例值。但我肯定不会仅仅为了让某个东西静止而改变设计。我从不担心静态和实例调度之间的性能差异。我的主要问题是,为什么我使用的开源库使用非静态记录器。我怀疑作者在那里犯了某种错误?