子类对象中必有一个父类对象,想必大家会说你疯了吧,怎么可能?
那么请听我慢慢道来!
下面是一个程序
package cn.up.demo5;
public class Employee {
private String name;
private String job_number;
private double salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob_number() {
return job_number;
}
public void setJob_number(String jobNumber) {
job_number = jobNumber;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
package cn.up.demo5;
public class Manager extends Employee {
private String bonus;
public String getBonus() {
return bonus;
}
public void setBonus(String bonus) {
this.bonus = bonus;
}
}
package cn.up.demo5;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Manager m = new Manager();
m.setBonus("666");
m.setJob_number("110");
m.setName("zma");
m.setSalary(10000);
System.out.println(m.getBonus());
System.out.println(m.getJob_number());
System.out.println(m.getName());
System.out.println(m.getSalary());
}
}
程序运行结果:
666
110
zma
10000.0
看到程序运行结果,大家会下意识的想到:额,不是这样吗,是这样的啊,别扯了,你说的子类对象中怎么会有一个父类对象。
这是我的解释:
依据大家的理解Manager类继承自Employee类,那么除了私有的成员变量其他的都继承下来了,那么Manager对象里面的结构应该是这样的
额,问题就来了,我调用m.setBonus("666");m.setJob_number("110");m.setName("zma");m.setSalary(10000);这些方法,调用
m.setBonus("666")还可以理解,但是调用另外的3个方法,m对象把值赋到什么地方去了,m对象不是没有name,job_number,salary这些成员变量的吗
还更奇怪的是,当我执行System.out.println()打印的时候这些值又出现了。
正式开始之前:我想问大家一个问题?构造函数的出现是不是都伴随着对象的创建,为什么构造函数的第一句代码都要是super.父类的构造函数
如果有3个层次继承关系,那么当我new一个孙子对象时,孙子对象的构造函数的第一句是不是要调用父亲的构造函数,而父亲的构造函数的第一句是不是要调用
爷爷的构造函数,这样就形成了构造方法的层级调用,于是,先创建爷爷对象,再创建父亲对象,再创建孙子对象,于是上面的m对象就应该是这种形式
当我们m.setJob_number("110")时,先看子类对象有没有对应的方法,如果没有就去看父类中有没有(多态就是这样形成的),因为setJob_number方法是pubic类型的
所以m.setJob_number("110")方法是其实是调用了子类中父类的方法,父类的方法是能够访问其中的私有的成员变量的
同理,当我们m.getJob_number()也是一样的道理
当然了这些图可以形象的描述继承的关系(实际情况可能不是这样的)但是通过这种画图的方式可以得到正确的结果
希望同大家一起讨论java技术