【问题标题】:Instance variables are missing from class but present in constructor类中缺少实例变量但存在于构造函数中
【发布时间】:2018-04-06 10:24:18
【问题描述】:

log4j中有一个类,如下所述

public final class NOPLogger
  extends Logger
{
  public NOPLogger(NOPLoggerRepository repo, String name)
  {
    super(name);
    this.repository = repo;
    this.level = Level.OFF;
    this.parent = this;
  }

如您所见,NOPLogger 的构造函数中有四个参数。

第一个参数 super(name) 我可以理解派生自 Logger(父类),但是其他三个实例变量呢。据我所知,它们应该在类级别声明,但不存在,如您所见。当我跟踪这些变量时,我在下面的类中找到了它们

public class Category
  implements AppenderAttachable
{
  protected String name;
  protected volatile Level level;
  protected volatile Category parent;
  private static final String FQCN = Category.class.getName();
  protected ResourceBundle resourceBundle;
  protected LoggerRepository repository;
  AppenderAttachableImpl aai;
  protected boolean additive = true;

我可以知道如何在构造函数(NOPLogger)中考虑这三个变量,甚至没有首先在类级别(NOPLogger)声明它们吗?

我只是想知道,只是解释了我已经知道的(我错了吗?)并且想知道理解这个概念在哪里落后?

谁能帮忙?

【问题讨论】:

  • 因为这三个变量是受保护的,所以你可以在你的类中修改
  • @0ddlyoko,好的,但你不认为它们之间应该有一些联系(NOPLoggerCategory)如果我从另一个类(Category)中获取它们?或者我可以从其他公开变量的类中获取任何位置?

标签: java


【解决方案1】:

NOPLoggerLogger 的孩子,它本身就是 Category 的孩子。

NOPLogger -> 记录器 -> 类别。

protected 字段被直接子类继承,但也被它们的子类继承为JLS statess:

6.6.2.1。访问受保护成员

令 C 为声明受保护成员的类。访问是 只允许在 C 的子类 S 的主体内。

NOPLoggerCategory 的(间接)子类,因此期望NOPLogger 实例可以访问在Category 中定义的protected 实例字段。

【讨论】:

  • 但是您怎么知道 Logger 是 Category 的子项?似乎没有提到任何黑白联系..!
  • 打开Logger源代码就可以看到了。例如:grepcode.com/file/repo1.maven.org/maven2/log4j/log4j/1.2.17/org/…
  • 谢谢你的链接,我现在明白了......在我的代码中,它缺少扩展部分......!
  • 不客气 :) Logger 类在库中很常见。你可能没有打开正确的一个。我虽然你的问题是关于多层次保护的。我的坏。
  • 但是我们不能在这里使用 super 吗?还是超级只降一级……?有意义吗?
【解决方案2】:

您所追求的链接是声明NOPLogger 的继承层次结构。 Category 类为这三个字段提供了受保护的访问权限,因此可以从继承层次结构中的子类访问。 Catetory -> Logger -> NOPLogger

  protected String   name; 
  volatile protected Level level;
  volatile protected Category parent;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2023-03-02
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多