A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 更上一层 中级黑马   /  2014-9-28 22:15  /  1553 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package cn.up.demo5;

  2. public class Employee {
  3.        
  4.         private String name;
  5.         private String job_number;
  6.         private double salary;
  7.         public String getName() {
  8.                 return name;
  9.         }
  10.         public void setName(String name) {
  11.                 this.name = name;
  12.         }
  13.         public String getJob_number() {
  14.                 return job_number;
  15.         }
  16.         public void setJob_number(String jobNumber) {
  17.                 job_number = jobNumber;
  18.         }
  19.         public double getSalary() {
  20.                 return salary;
  21.         }
  22.         public void setSalary(double salary) {
  23.                 this.salary = salary;
  24.         }
  25.        
  26.        
  27. }



  28. package cn.up.demo5;

  29. public class Manager extends Employee {
  30.        
  31.         private String bonus;

  32.         public String getBonus() {
  33.                 return bonus;
  34.         }

  35.         public void setBonus(String bonus) {
  36.                 this.bonus = bonus;
  37.         }
  38.        
  39.        

  40. }




  41. package cn.up.demo5;

  42. public class Test {

  43.         /**
  44.          * @param args
  45.          */
  46.         public static void main(String[] args) {
  47.                
  48.                
  49.                 Manager m = new Manager();
  50.                 m.setBonus("666");
  51.                 m.setJob_number("110");
  52.                 m.setName("zma");
  53.                 m.setSalary(10000);
  54.                
  55.                
  56.                 System.out.println(m.getBonus());
  57.                 System.out.println(m.getJob_number());
  58.                 System.out.println(m.getName());
  59.                 System.out.println(m.getSalary());

  60.         }

  61. }



  62. 程序运行结果:
  63. 666
  64. 110
  65. zma
  66. 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技术,无兄弟,不java





a.png (76.76 KB, 下载次数: 6)

m对象真实的情况

m对象真实的情况

b.png (72.14 KB, 下载次数: 4)

m对象刚开始理解的情况

m对象刚开始理解的情况

6 个回复

倒序浏览
从对象的角度来理解构造方法的回溯调用以及多态,简单明了,非常不错!
回复 使用道具 举报
父类是抽象的话,怎么创建父类的对象呢?望解释

点评

如果一个类是抽象类,那当然不能显式new对象了,但是如果一个子类继承自一个抽象类,显式地new一个子类对象,那么那个抽象父类应该是由JVM来new的  发表于 2014-9-29 10:57
回复 使用道具 举报
接着上面的解释,请看下面一段代码

  1. package cn.up.demo6;

  2. public abstract class Fu {
  3.        
  4.         private int age;

  5.         public int getAge() {
  6.                 return age;
  7.         }

  8.         public void setAge(int age) {
  9.                 this.age = age;
  10.         }
  11.        
  12.        
  13.         public abstract void fu();
  14.        
  15.        
  16.        
  17. }
复制代码



package cn.up.demo6;

public class Zi extends Fu {
       

        @Override
        public void fu() {
                System.out.println("aaaa");
               
        }

}

package cn.up.demo6;

public class Test {

        /**
         * @param args
         */
        public static void main(String[] args) {
               
               
                Zi z = new Zi();
               
                z.setAge(45);
                System.out.println(z.getAge());

        }

}

程序运行结果:45


如果子类对象z中没有父类对象,父类中的成员变量是哪里来的呢?要知道成员变量是存在对象中的


通过这个例子同样解释了为什么 子类继承自抽象类  当要new一个子类对象,必须重写父类的全部抽象方法
回复 使用道具 举报
跪求此贴千万别沉,让更多的人了解类的构造,这样才能写出更加优雅的代码
回复 使用道具 举报
恩恩,,不错不错。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马