1

说我有:

public abstract class Animal {
    // SLF4J
    private Logger logger = LoggerFactory.getLogger(Animal.class);

    // ...etc.

    public void setLogger(Logger logger) {
        this.logger = logger;
    }

    public Logger getLogger() {
        return this.logger;
    }
}

和:

public abstract class Dog extends Animal {
    // SLF4J
    private Logger logger = LoggerFactory.getLogger(Dog.class);

    // ...etc.

    public void setLogger(Logger logger) {
        this.logger = logger;
    }

    public Logger getLogger() {
        return this.logger;
    }
}

然后当我执行以下代码时:

Dog d1 = new Dog();
Animal a1 = new Dog();
  1. d1得到“狗”记录器还是“动物”记录器?
  2. a1得到“狗”记录器还是“动物”记录器?
  3. 是否有更好/更清洁/更安全的方法来编写此代码,以便 Dog 和 Animal 始终获得正确的记录器?
4

1 回答 1

0

d1并且a1将有两种类型的记录器,((Animal)d1).logger将是Animal.class记录器,d1.logger将是Dog.class. 请注意,您实际上不能((Animal)d1).logger在 Animal 类中引用代码之外的部分,因为Animal.logger它是一个私有字段。

也是如此,a1因为它的运行时类型是Dog

于 2013-08-31T02:12:15.187 回答