java对象中必有一个父类对象

来源:互联网 发布:控制微信摇骰子软件 编辑:程序博客网 时间:2024/06/07 03:44


子类对象中必有一个父类对象,想必大家会说你疯了吧,怎么可能?
那么请听我慢慢道来!

下面是一个程序


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());}}程序运行结果:666110zma10000.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技术
 


0 0
原创粉丝点击