java对象 父对象 的 对应关系
子类对象中必有一个父类对象,下面用程序说话
- 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()也是一样的道理
当然了这些图可以形象的描述继承的关系(实际情况可能不是这样的)但是通过这种画图的方式可以得到正确的结果