Java “什么是”呢;“记录器”;在爪哇?

Java “什么是”呢;“记录器”;在爪哇?,java,oop,methods,logging,Java,Oop,Methods,Logging,我在课堂上看到了以下几点: this.logger.severe(""); this.logger.warning(""); this.logger.info(""); 有几件事我不明白: 我们如何使用之前未定义的方法?我的意思是,类中没有定义“logger”方法。我认为可以定义这些方法,因为所考虑的类是定义了“logger”的另一个类的扩展。但是在类的定义中没有“extends”语句(只有“implements”) 我可以理解这样的事情:“objectName.methodName”。但是“

我在课堂上看到了以下几点:

this.logger.severe("");
this.logger.warning("");
this.logger.info("");
有几件事我不明白:

  • 我们如何使用之前未定义的方法?我的意思是,类中没有定义“logger”方法。我认为可以定义这些方法,因为所考虑的类是定义了“logger”的另一个类的扩展。但是在类的定义中没有“extends”语句(只有“implements”)

  • 我可以理解这样的事情:“objectName.methodName”。但是“objectName.something 1.something 2”是什么?“something1.something2”是方法的名称吗?方法名可以包含点吗

  • 这些“记录器”到底是做什么的?我认为它们保存了有关代码执行的信息。他们写了一些关于行刑期间发生的事情的报告。但是我在哪里可以找到这些信息呢

  • 添加:

    在文件的开头,我有:
    import java.util.logging.Logger
    然后在类中我有:
    private Logger=Logger.getLogger(“a.b.c.d”)

    因此,logger是类logger的一个对象(但我不明白为什么他们不能用“new logger()”以常规方式实例化该类)。我也不明白logger.severe(“”)到底做了什么

  • “logger”将是另一个对象,而不是方法。此logger类将在其上定义方法,如
    public void severe(String message)

  • “something1”将是“objectName”中包含的对象。例如,
    Car.Engine.cyline.Fire()
    ,使用这样的方法来点燃汽车的钢瓶被认为是不好的做法,您应该执行类似于
    Car.StartEngine()
    (有关更多信息,请参阅)

  • 记录器将记录程序中发生的情况,因此如果以后出现崩溃或错误,您可以查看发生的情况。是否将其记录到文本文件或某个数据库中,将取决于记录器的实现


  • logger不是一个方法,而是一个类变量,它似乎是一个公开方法“严重”、“警告”和“信息”的对象

    检查您的类是否有类似“someClass logger=new someClass()”;"

  • 记录器通常指的是中类的用法
  • 记录器是一个成员对象,其函数(例如severe)被调用
  • 记录器通常登录到一个文件中(可以通过log4j.xml或其他配置文件或在程序启动期间进行配置)

  • 编辑:更改了log4j链接。

    记录器没有做任何特殊的事情。它只是Java代码

    public class SomeClass {
        private Logger logger = LogFactory.getLogger(SomeClass.class);
    
        public void doSomething() {
            this.logger.debug("foo");
        }
    }
    
    this.logger
    仅指向当前实例(
    this
    )的名为
    logger
    的实例变量。
    this.
    前缀在本例中是superflous。您也可以在此处执行
    logger.debug(“foo”)

    如果它没有在
    SomeClass
    本身中声明,那么它很可能是在扩展类中声明的。请检查在
    extends
    中声明的类

    至于你的
    objectName.something1.something2
    疑问,你已经看过
    System.out.println()了吗
    有效?返回一个
    PrintStream
    对象,该对象又有一个方法。因此,如果
    objectName.something
    返回一个具有方法的完整
    对象,则您可以继续链接方法调用

    基本上

    objectName.something1.something2;
    
    可以翻译为

    SomeObject someObject = objectName.something1;
    someObject.something2;
    
    但是,如果您不需要
    someObject
    代码中的任何其他地方,那么它可以像您的示例中那样缩短

    更新:根据您的更新:

    所以,logger是类logger的一个对象(但我不理解为什么他们不能用“new logger()”以常规方式实例化该类)。我也不明白logger.severy(“”)到底是做什么的

    。至于为什么它不能被实例化,这是因为

    更新2:根据另一个困惑:

    我不明白他们为什么用“这个”。我的意思是,如果我只使用字段名,默认情况下,它不是这个对象的字段吗?我知道“this.x”和“x”有什么区别吗

    通过这种方式,您可以更明确地了解您想要访问哪一个。例如,如果该方法包含名为
    logger
    的参数或局部变量,则
    this.logger
    仍将引用实例变量

    public class SomeClass {
        private Logger logger = LogFactory.getLogger(SomeClass.class);
    
        public void doSomething(Logger logger) {
            this.logger.debug("foo"); // Refers to the instance variable.
            logger.debug("foo"); // Refers to the method argument.
        }
    
        public void doSomethingElse() {
            Logger logger = LogFactory.getLogger(SomeClass.class);
            this.logger.debug("foo"); // Refers to the instance variable.
            logger.debug("foo"); // Refers to the method local variable.
        }
    }
    

    java.util.Logger类是java日志API的主要访问点。以下是创建记录器的方法:

    Logger logger = Logger.getLogger("myLogger");
    

    作为参数传递给getLogger()工厂方法的字符串是要创建的记录器的名称。您可以自由选择名称,但名称表示记录器在记录器层次结构中的位置。每一个名称中的(点)被解释为层次结构中的分支。

    回答2。方法名称不能包含点。点的意思总是“左边的东西是有成员的对象,右边的东西是我想访问的成员”。因此,如果此代码进行编译,
    logger
    是对对象的引用,该对象具有名为
    severe
    等方法。@divo:this
    @BalusC无法访问静态字段,请按我不理解的方式购买。我的意思是,如果我只使用字段名,默认情况下,它不是这个对象的字段吗?我知道“this.x”和“x”有什么区别吗?是这样的吗?如果我看到类似“aaa.bbb.ccc()”的内容,我可以说ccc()是“aaa.bbb”的方法,因此,“aaa.bbb”是一个对象。因此,在类“aaa”中,我不应该搜索名为“bbb”的方法。相反,我需要搜索类“aaa”中定义的字段“bbb”。非常详细的解释