这是指在子类对象上调用非重写方法时的内容?

时间:2018-02-15 14:01:38

标签: java inheritance name-hiding

请考虑以下代码:

let process = new ffmpeg(readStream);

process
  .addOption('-f', 'null')  // set format to null 
  .on('start', function() {
    console.log('Spawned ffmpeg');
  })
  .on('codecData', function(data) {
    //get recording duration
    let duration = data.duration;
    console.log(duration)
  })
  .output('nowhere')  // or '/dev/null' or something else
  .run()

我有几个问题。

  1. 创建子类的对象时,实际创建了多少个对象?只有一个,通过引入子类中定义的新属性来扩展超类的属性?或者两个,我们可以访问的子类对象和一个超类对象,它们的存在对我们来说是隐藏的吗?

  2. 如果创建了两个对象,当在子类对象上调用非重写方法时,哪个对象负责?换句话说,class Person { String className = "Person"; void printClassName () { System.out.println("I am " + this.className); System.out.println("I am " + this.getClass().getSimpleName()); } } class Employee extends Person { // intentionally hiding this field String className = "Employee"; } public class App { public static void main(String[] args) { Employee raghu = new Employee (); raghu.printClassName(); } } 在非重写方法中引用了什么?隐藏的超类对象或子类对象?

  3. 如果您对#2的回答是超类的隐藏对象,那么为什么上面的代码会在this内为"I am Employee"打印System.out.println("I am " + getClass().getSimpleName());

  4. 如果您对#2的回答是子类的对象,那么为什么printClassName内的第一行打印printClassName

2 个答案:

答案 0 :(得分:2)

您将变量声明为Employee

类型
this.className

指的是该类中的className

this.getClass().getSimpleName()

this.getClass()会返回班级Employee,因为这是您宣布变量的方式,这就是getSimpleName()返回"员工"

答案 1 :(得分:1)

子类Employee中的字段className是一个额外的第二个字段,其名称与Person中的字段className相同;这叫做 shadowing 字段没有继承。

(可能已知。)

class Employee extends Person { // Manner to change the super field
    Employee() {
        className = "Employee";
    }
}
  1. new Employee()创建一个包含两个className字段的对象。它调用超级构造函数,执行字段初始化,并执行其余的构造函数代码。

  2. this始终是唯一的对象,可能是某些子类。所以Person.this实际上可能是一名员工。

  3. 对于Employee对象,
  4. 和4. this.className只会访问Person字段,因为字段没有继承。相比之下,方法xxx()将调用孩子最多的方法。